模糊算法在图像处理时的使用再平常不过,有必要彻底的了解OpenCV中自带的所有模糊算法。
OpenCV中自带了4种模糊算法:
- blur(均值模糊)
- GaussianBlur(高斯模糊)
- medianBlur(中值模糊)
- bilateralFilter(双边滤波)
原理上都是简单的,前3种算法分别使用了均值模型、高斯模型、中值模型进行滤波,非常直观易懂。 最后一种双边滤波值得拿出来讨论,双边滤波可以说是效果最好的模糊算法,相对于传统的高斯滤波,双边滤波的一个重要特点就是能够保持物体的边缘。它们之间最直观的区别就是:高斯模糊之后感觉整个照片都是模糊的,而双边滤波之后整体的区域信息还是清晰,眼是眼鼻子是鼻子。
双边滤波的原理与其它的模糊算法有些不同: 其它的模糊算法中目标点上的像素值通常是由其所在位置上的周围的一个小局部邻居像素的值所决定; 而双边滤波中权重因子是利用两个像素之间的空间距离(在图像中为2D)关系来生成。 高斯滤波在低通滤波算法中有不错的表现,但是其却有另外一个问题,那就是只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息。这里的边缘主要是指图像中主要的不同颜色区域(比如蓝色的天空,黑色的头发等),而Bilateral就是在Gaussian blur中加入了另外的一个权重分部来解决这一问题。
下面简要、直观的用代码来看看各种模糊算法的效果吧: [cpp] view plaincopy
- int main() {
- Mat src = imread("/home/chuanqi/ImageDataset/wy.jpg");
- Mat dst1, dst2, dst3, dst4;
- for (int i = 1; i < 20; i+=2) {
- cout << "Kernel size: " << i << endl;
- blur(src, dst1, Size(i, i));
- GaussianBlur(src, dst2, Size(i, i), 0, 0);
- medianBlur(src, dst3, i);
- bilateralFilter(src, dst4, i, 2*i, i/2);
- imshow("src", src);
- imshow("blur", dst1);
- imshow("GaussianBlur", dst2);
- imshow("medianBlur", dst3);
- imshow("bilateralFilter", dst4);
- waitKey();
- }
- return 0;
- }