图像模糊和自定义滤波器
图像模糊
- 概念:图片的模糊,一直是图像处理领域一个比较重要的东西,它的用处不仅仅是我们平时PS的滤镜,也常常被用来做图片数据的降噪,图片的有损压缩,和图片特征相似匹配的优化工作,通过对图像进行卷积操作,可以得到模糊的图像,当然选择不同的卷积核,模糊效果不一样。
盒子模糊
- API :
boxFilter
也是一种均值模糊
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT );
Mat dst;
boxFilter(src, dst, -1, Size(5, 5), Point(-1, -1), true, BORDER_DEFAULT);
imshow("box blur", dst);在这里插入图片描述
高斯模糊
- 高斯分布
正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
- API :
GaussianBlur
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
PS: ksize对应高斯函数中的 x 和 y, sigmaX和sigmaY可以由ksize计算得出,因此这两种参数是有换算关系的,给出其一就行,随着ksize或者sigma越来越大,图像越来越模糊
//高斯模糊
Mat dst;
GaussianBlur(src, dst, Size(15, 15), 0);
imshow("gaussian blur", dst);
高斯模糊和盒子模糊对比
自定义滤波器
- 卷积核定义:可以定义均值卷积核和非均值卷积核
//均值卷积核
int k = 15;//卷积窗口的大小
Mat mkernel = Mat::ones(k, k, CV_32F)/(float)(k*k);
//非均值卷积核
Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);//robot算子
- API :
filter2D
CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
PS: delta控制亮度
Mat src = imread("F:/code/images/ttt.png");
if (src.empty()) {
printf("fail to read");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//自定义滤波器
//均值卷积
int k = 15;//卷积窗口的大小
Mat mkernel = Mat::ones(k, k, CV_32F)/(float)(k*k);
Mat dst;
filter2D(src, dst, -1, mkernel, Point(-1, -1), 0, BORDER_DEFAULT);
imshow("custom mean filter ", dst);
//非均值卷积
Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);
Mat dst2;
filter2D(src, dst2, CV_32F, robot, Point(-1, -1), 0, BORDER_DEFAULT);
convertScaleAbs(dst2, dst2);
imshow("custom robot filter ", dst2);
PS: 非均值卷积核一定要注意卷积后像素值的范围,要能够保证正确存储图像的深度信息,例如上面的robot算子,卷积后的像素值范围是 -255 ~ 255,故使用CV_32F类型,那么在显示图像之前也一定要做处理,也就是下面的输出图像类型。
- 输出图像类型
针对不同卷积核系数,图像输出类型数值范围,CV_32F/CV_32S
API:convertScaleAbs
对滤波后的图像进行处理,便于正常显示
CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst,
double alpha = 1, double beta = 0);