OpenCV图像卷积(滤波)操作

版权声明:原创文章转载请注明出处~ https://blog.csdn.net/PecoHe/article/details/89669007

0.综述

图像卷积可以看成是一个滑动的窗口在一个比它大的图像上有规则(从左向右,从上往下)地滑动,对每一次窗口覆盖到的图像区域都会进行点乘操作,然后就得到的值作为原图中被窗口覆盖区域的中心像素点的新值。与CNN里的卷积不同,经典的卷积算子(即卷积核)往往是人们根据研究和经验事先设定好的特征提取算子,而CNN里的卷积核是通过训练不断调整最终得到合适的权值参数

1.图像卷积操作api

void blur( InputArray src, OutputArray dst,
           Size ksize, Point anchor = Point(-1,-1),
           int borderType = BORDER_DEFAULT );

其中src是输入图像,dst是输出图像,ksize是滑动窗口的大小,剩余两个参数一般使用默认值,默认值Point(-1,-1)表示这个锚点在核的中心,bodertype是边缘插值方法。

Mat input_image = imread("./whisper.jpg", 1);
	if (input_image.empty())
	{
		cout << "read input error!" << endl;
		return -1;
	}
	imshow("input", input_image);
	Mat result;
	blur(input_image, result, Size(5, 5), Point(-1, -1), 4);
	imshow("result", result);

结果:
在这里插入图片描述

2.图像均值模糊与高斯模糊

均值模糊:卷积核内的参数都是一样的。
高斯模糊:考虑了中心像素距离的影响,由高斯分布公式生成不同的权重系数。越靠近中心点权重越大。

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

其中sigmax是x方向滤波系数,sigmax是y方向滤波系数。

GaussianBlur(input_image, result, Size(15,15),15,0, 4);

结果:
在这里插入图片描述

3.中值模糊

中值滤波是对窗口覆盖区域内所有原图的像素值进行排序后取中值作为中心像素点的值,对去椒盐噪声的效果比较好。

void medianBlur( InputArray src, 
				 OutputArray dst, 
				 int ksize );

其中ksize必须是大于1的奇数。

Mat input_image = imread("./flower.jpg", 1);
	if (input_image.empty())
	{
		cout << "read input error!" << endl;
		return -1;
	}
	imshow("input", input_image);
	Mat result;
	medianBlur(input_image, result, 3);
	imshow("result", result);

结果:
在这里插入图片描述

4.完整代码

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

using namespace cv;
using namespace std;

int main(int argc, char**argv)
{
	Mat input_image = imread("./flower.jpg", 1);
	if (input_image.empty())
	{
		cout << "read input error!" << endl;
		return -1;
	}
	imshow("input", input_image);
	Mat result;
	//blur(input_image, result, Size(5, 5), Point(-1, -1), 4);
	//GaussianBlur(input_image, result, Size(15,15),15,0, 4);
	medianBlur(input_image, result, 3);
	imshow("result", result);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/PecoHe/article/details/89669007
今日推荐