opencv各类滤波器详解

本文深入探讨了图像处理中的低通滤波器、中值滤波器和Sobel滤波器的应用,包括如何使用这些工具对图像进行模糊、平滑、边缘检测等操作,特别强调了它们在去除椒盐噪声、增强细节以及保持边缘锐利度方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.低通滤波器

低通滤波器的效果是降低图像变化的幅度,即对图像进行模糊或平滑,它将一个像素替换为相邻矩形内的像素和,并除以相邻像素的个数(以得到平均值)。

//使用低通滤波器
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat dst;
	Mat dstG;
	cv::blur(src, dst, cv::Size(7, 7));//Size(7,7)表示的相邻像素的范围,数字越大越模糊。
	
	imshow("car", src);
	imshow("car2", dst);

	waitKey(50000);

	return 0;
}

输出结果如下,可看到对原图模糊了。



2.中值滤波器mediaBlur

中值滤波器是非线性的,对一个像素的相邻区域进行操作已确定输出像素的值。该像素及它的相邻区域组成一个数组,同时如名字所示,中值滤波器仅仅计算这组数的中值,并用中值替换当前的像素值。

中值滤波器在去除椒盐噪点方面有显著功效,因为噪点像素不会被选为中值(它或为极大值或为极小值),与之相反均值滤波器会大大受到噪点的影响,因为均值滤波器计算的是平均值,而噪点像素会使相邻像素的平均值发生变化。

同时,中值滤波器还有保留边缘锐利度的优点。然而,它会去除相同区域中的纹理(如背景中的树木)。



//中值滤波器medianBlur
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;

int main()
{
	Mat src = imread("salt.jpg");//读取椒盐噪点的图像
	Mat dst;

	cv::medianBlur(src, dst, 5);

	imshow("car2",dst);
	imshow("car", src);
	waitKey(20000);

	return 0;
}
结果如下,很清晰的看到椒盐噪点去除了


3.Sobel滤波




//使用Sobel滤波器
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat sobelX;
	Mat sobelY;
	//对X方向求导,sobelX保留了垂直方向的信息,所以垂直的轮廓看起来更清楚
	cv::Sobel(src,sobelX, CV_8U, 1, 0, 3, 0.4, 128);
	//检测垂直方向的边缘
	cv::Sobel(src, sobelY, CV_8U, 0, 1, 3, 0.4, 128);

	imshow("car", src);
	imshow("sobelX", sobelX);
	imshow("sobelY", sobelY);

	waitKey(50000);

	return 0;
}

结果如下,类似浮雕



下面是水平和垂直合并的结果



//使用Sobel滤波器
#include<opencv2\opencv.hpp>
#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat sobelX;
	Mat sobelY;
	Mat sobel;
	cv::Sobel(src,sobelX, CV_8U, 1, 0, 3, 0.4, 128);
	cv::Sobel(src, sobelY, CV_8U, 0, 1, 3, 0.4, 128);
	//合并结果
	sobel = abs(sobelX) + abs(sobelY);
	//搜索Sobel极大值
	double sobmin, sobmax;
	cv::minMaxLoc(sobel, &sobmin, &sobmax);
	//变换为8位图像
	Mat sobelImage;
	sobel.convertTo(sobelImage, CV_8U, -255. / sobmax, 255);
	//阈值化处理,得到二值图像
	Mat sobelThresholded;
	cv::threshold(sobelImage, sobelThresholded,70, 255, cv::THRESH_BINARY);

	imshow("car", sobelThresholded);
	waitKey(50000);

	return 0;
}
好像结果不太理想



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值