图像平滑
平滑是smoothing,也称blurring。在图像处理中经常用到,其中一个用途就是降噪。图像平滑通过滤波器来实现,h(k,l)是掩模:
常用平滑滤波器有:
1. 归一化滤波器: 输出像素值是核窗口内像素值的均值 ( 所有像素加权系数相等)。
2. 高斯滤波器: 高斯滤波是将输入数组的每一个像素点与高斯内核卷积,将卷积和当作输出像素值。
3. 中值滤波器:新像素值用邻域中像素的中值代替 。
4. 双边滤波器:保边去噪,避免模糊边缘。
代码示例
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int KERNEL_LENGTH = 15;
Mat src, dst;
int main(int argc, char** argv)
{
const char* filename = "../data/lena.jpg";
src = imread(filename, IMREAD_COLOR);
if (src.empty())
{
printf("Error Opening Image");
return -1;
}
imshow("src", src);
blur(src, dst, Size(KERNEL_LENGTH, KERNEL_LENGTH), Point(-1, -1)); // 归一化滤波
imshow("Normalized Block Filter", dst);
GaussianBlur(src, dst, Size(KERNEL_LENGTH, KERNEL_LENGTH), 0, 0); // 高斯滤波
imshow("Gaussian Filter", dst);
medianBlur(src, dst, KERNEL_LENGTH); // 中值滤波
imshow("Median Filter", dst);
bilateralFilter(src, dst, KERNEL_LENGTH, KERNEL_LENGTH * 2, KERNEL_LENGTH / 2); // 双边滤波
imshow("Bilateral Filter", dst);
waitKey(0);
return 0;
}
运行结果