OpenCV中有几种算法可以实现图像平滑(模糊)处理,分别是:简单模糊、方框型滤波器、中值滤波器、高斯滤波器、双边滤波器。
#include#include #include using namespace cv; using namespace std; //实现几种模糊算法 int main() { Mat img = imread("lena.jpg"); Mat img_blur,img_box,img_Median,img_gs,img_bilateral; blur(img, img_blur, Size(5,5), Point(-1, -1), 4);//简单模糊 boxFilter(img, img_box, CV_8U, Size(5, 5), Point(-1, -1), 1, 4);//方框型滤波器 medianBlur(img, img_Median, 5);//中值滤波器 GaussianBlur(img, img_gs, Size(5, 5), 0, 0);//高斯滤波器 bilateralFilter(img, img_bilateral, 5, 10, 10);//双边滤波器 imshow("lena", img); imshow("img_blur", img_blur); imshow("img_box", img_box); imshow("img_Median", img_Median); imshow("img_gs", img_gs); imshow("img_bilateral", img_bilateral); waitKey(0); return 0; }
- 简单模糊
blur();
函数原型void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
————————————————
原文链接:https://blog.csdn.net/cau_eric/article/details/27378503 - 方框型滤波器
boxFilter();
函数原型void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT ) - 中值滤波器
medianBlur();
函数原型void medianBlur(InputArray src, OutputArray dst, int ksize)
int ksize:滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7…… - 高斯滤波器
GaussianBlur();
函数原型void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
sigmaX,sigmaY:高斯核函数在X,Y上的标准偏差。如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
- 双边滤波器
bilateralFilter();
函数原型void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。