低通滤波器的效果是降低图像变化的幅度,即对图像进行模糊或平滑,它将一个像素替换为相邻矩形内的像素和,并除以相邻像素的个数(以得到平均值)。
//使用低通滤波器
#include
#include
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;
}
中值滤波器是非线性的,对一个像素的相邻区域进行操作已确定输出像素的值。该像素及它的相邻区域组成一个数组,同时如名字所示,中值滤波器仅仅计算这组数的中值,并用中值替换当前的像素值。
中值滤波器在去除椒盐噪点方面有显著功效,因为噪点像素不会被选为中值(它或为极大值或为极小值),与之相反均值滤波器会大大受到噪点的影响,因为均值滤波器计算的是平均值,而噪点像素会使相邻像素的平均值发生变化。
同时,中值滤波器还有保留边缘锐利度的优点。然而,它会去除相同区域中的纹理(如背景中的树木)。
//中值滤波器medianBlur
#include
#include
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;
}
结果如下,很清晰的看到椒盐噪点去除了
//使用Sobel滤波器
#include
#include
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
#include
#include
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;
}