IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> opencv学习笔记(四)——模糊(均值,高斯,双边) -> 正文阅读

[人工智能]opencv学习笔记(四)——模糊(均值,高斯,双边)

1 . 模糊

其实,不管是均值滤波,还是高斯滤波,其核心计算是卷积操作。
相应位置元素相乘后,累加,再取平均;每一次卷积计算的表达式如下:

g(i,j)=1k×l∑k,lf(i+k,j+l)h(k,l)

其中,k,l表示卷积核的尺寸;h表示卷积核
因此,卷积计算的核心是卷积核的选择;另外,卷积核的尺寸最好是奇数,因为需要对局部视野中心进行赋值。

2 . 均值模糊

1 . 概念

在这里插入图片描述
均值模糊就是将范围以内的像素取一个均值然后赋给自己,范围越大,归一化程度越强,越模糊。
下面就是opencv给的API

blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));

2 . 代码

#include <iostream>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat img = imread("D:/VS项目/mohu/1.jpg");
	Mat img2;
	blur(img, img2, Size(11, 11));  //用opencv自带的API进行均值滤波操作
	imshow("img", img);
	imshow("img2", img2);
	waitKey(0);
	return 0;
}

3 . 高斯模糊

1 . 概念

高斯模糊和均值模糊其原理上的唯一区别只是在于卷积核的值不同罢了,高斯卷积核矩阵值服从二维高斯函数。
而高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和。
下图就是一维和二维正态分布的函数图像
在这里插入图片描述
在这里插入图片描述
二维正态分布的函数的密度函数就是高斯函数
在这里插入图片描述
从以上描述中我们可以看出,高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。

下面是opencv自带的高斯模糊的API

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);

src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。

sigmaX,表示高斯核函数在X方向的的标准偏差。

sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
在这里插入图片描述

2 . 代码

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
	// 创建两个窗口,分别显示输入和输出的图像
	cv::namedWindow("in", cv::WINDOW_AUTOSIZE);
	cv::namedWindow("out", cv::WINDOW_AUTOSIZE);

	// 读取图像,并用输入的窗口显示输入图像
	cv::Mat img = cv::imread("D:/VS项目/mohu/1.jpg");
	cv::imshow("in", img);

	// 声明输出矩阵
	cv::Mat out;

	// 进行平滑操作,可以使用GaussianBlur()、blur()、medianBlur()或bilateralFilter()
	// 此处共进行了两次模糊操作
	cv::GaussianBlur(img, out, cv::Size(5, 5), 3, 3);
	cv::GaussianBlur(out, out, cv::Size(5, 5), 3, 3);

	// 在输出窗口显示输出图像
	cv::imshow("out", out);
	// 等待键盘事件
	cv::waitKey(0);

	// 关闭窗口并释放相关联的内存空间
	cv::destroyAllWindows();

	return 0;
}

4 . 双边模糊

1 . 概念

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。

opencv自带的API

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )

InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

2 . 代码

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat srcImage, dstImage;
int g_nBilateralFilterValue;
const int g_nBilateralFilterMax = 100;

//有滚动条事件时,可以进入回调函数
void on_Trackbar(int, void*)
{
	bilateralFilter(srcImage, dstImage, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, g_nBilateralFilterValue / 2);
	imshow("【双边滤波器窗口】", dstImage);
}

int main()
{
	srcImage = imread("D:/VS项目/mohu/1.jpg");
	imshow("【原图】", srcImage);
	dstImage.create(srcImage.size(), srcImage.type());

	g_nBilateralFilterValue = 0;
	namedWindow("【双边滤波器窗口】");
	createTrackbar("Value", "【双边滤波器窗口】", &g_nBilateralFilterValue, g_nBilateralFilterMax, on_Trackbar);
	on_Trackbar(g_nBilateralFilterValue, 0);

	waitKey(0);

	return 0;
}

5 . 参考博客

https://zhuanlan.zhihu.com/p/358910882
https://blog.csdn.net/godadream/article/details/81568844
https://zhuanlan.zhihu.com/p/127023952
https://blog.csdn.net/keith_bb/article/details/54427779

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:43:59  更:2022-02-07 13:45:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 20:49:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码