基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值
,主要是利用中值不受分布序列极大值和极小值影响的特点,让周围的像素值接近真实的值从而消除孤立的噪声点。
中值(又称中位数)
是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数。
对于图像处理来说,非常适用去除于在不要求图像细节下的椒盐噪声以及脉冲噪声
,能够克服线性滤波器带来的图像细节模糊等弊端,能够有效保护图像边缘信息,是非常经典的平滑噪声处理方法。
opencv中提供了medianBlur()函数实现了中值滤波操作,其原型如下:
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
参数解释:
注意:这里的ksize我们可以简单的认为,像CNN卷积核一样,是一个3*3的矩形框,对于原图的每一个像素点,都以该像素点为中心,选取3 * 3尺寸的范围内所有像素点的灰度值取中,来代替该点的灰度值。如下图像处理例子。
参考代码
#include
#include
void median_Blur(){
cv::Mat src = cv::imread("/home/cheng/Pictures/123456.png", cv::IMREAD_GRAYSCALE);
cv::Mat dst;
int median_block_size = 7;
cv::medianBlur(src, dst, median_block_size);
cv::imshow("median_Blur", dst);
cv::waitKey(0);
return;
}
int main(){
median_Blur();
return 0;
}
其最主要的作用就是来模糊一张图片
(可以部分的消除掉图像出尖锐的边缘点)
个人感觉没啥用,图像变模糊了而已。
opencv中提供了boxFilter()函数实现了方框滤波操作,其原型如下:
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1, -1),
boolnormalize=true, int borderType=BORDER_DEPAULT);
参数解释:
其中anchor必须小于ksize。
参考代码
#include
#include
#include
using namespace cv;
using namespace std;
Mat imageBlur(Mat srcImage);
int main() {
Mat srcImage = imread("/Users/dwz/Desktop/cpp/1.jpg");
Mat dstImage;
boxFilter(srcImage, dstImage, -1, Size(5, 5));
imwrite("boxblured.jpg", dstImage);
return 0;
}
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果。
高斯算法在官方文档给出的解释是高斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组,通俗的讲就是高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
opencv提供了GaussianBlur()函数对图形进行高斯滤波,其原型如下:
C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
参数解释:
Size ksize, double sigmaX, double sigmaY
指定出来。参考例子
参考代码
#include
#include
using namespace std;
using namespace cv;
int main()
{
cv::namedWindow("Orgin Image", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Gaussian Blur Image", cv::WINDOW_AUTOSIZE);
// 读取图像,并用输入的窗口显示输入图像
cv::Mat img = cv::imread("/home/lena.jpg", -1);
if (img.empty())
{
cout << "Could not load image ..." << endl;
return -1;
}
cv::imshow("Orgin Image", 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("Gaussian Blur Image", out);
// 等待键盘事件
cv::waitKey(0);
destroyAllWindows();
return 0;
}