这篇文章主要介绍“C++ opencv图像平滑滤波器如何使用”,在日常操作中,相信很多人在C++ opencv图像平滑滤波器如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ opencv图像平滑滤波器如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
归一化方框滤波器是很简单的滤波器,输出像素值是核窗口内像素值的均值,如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情况。均值不能很好的保护细节。
opencv提供了blur函数来实现均值滤波,函数声明如下:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT); src 输入图像 dst 输出图像 Ksize 内核的大小 anchor 锚点 默认值Point(-1, - 1)表示锚位于内核中心。 bordertype 边界像素模式
#include<iostream> #include<opencv.hpp> using namespace std; using namespace cv; int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); blur(img1, img2, Size(20, 20)); imshow("线性滤波", img2); waitKey(0); }
效果如下:
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果,高斯滤波是对输入数组的每个点与输入的高斯滤波模板执行卷积计算,然后精这些结果一块组成滤波后的输出数组,具体操作是,用一个模板(或者卷积,掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值,去代替模板中心像素点的值。
opencv提供了GaussianBlur函数来实现均值滤波,函数声明如下:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT); src 输入图像 dst 输出图像 ksize 高斯核大小 他们必须是奇数 sigmax x方向上是高斯核标准差 sigmay y方向上是高斯核标准差 bordertype 边界像素模式
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); GaussianBlur(img1, img2, Size(35, 35),0); imshow("高斯滤波", img2); waitKey(0); }
效果图:
中值滤波是用像素点领域灰度值的中值来代替该像素点的灰度值,也就是说用一片区域的中间值来代替所有值,可以去除最大值和最小值 ,它的优点是对去除斑点噪声和椒盐噪声很有用,缺点是中值滤波时间是均值滤波的5倍以上
opencv提供了medianBlur函数来实现均值滤波,函数声明如下:
void medianBlur(InputArray src, OutputArray dst, int ksize); src 输入 dst 输出 Ksize 孔径线性尺寸 它必须是奇数且大于1
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); medianBlur(img1, img2,9); imshow("中值滤波", img2); waitKey(0); }
效果如下:
之前所说的滤波器都是为了平滑图像,问题是有些时候这些滤波器不仅削弱了噪声,连带着吧边缘也磨掉了,为了避免这样的情形(至少在一定程度上),我们可以使用双边滤波,它是一种非线性滤波器,它可以达到边缘,降噪平滑的效果,也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度。双边滤波与高斯滤波相比,对于图像的边缘信息能够更好的保存
opencv提供了bilateralFilter函数来实现均值滤波,函数声明如下:
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT); src 输入 dst 输出 d 滤波时所用的每个像素邻域的直径 sigmaColor 在颜色空间中过滤。 sigmaSpace 在坐标空间中过滤 borderType 边界像素模式
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); bilateralFilter(img1, img2, 30,30,30); imshow("双边滤波", img2); waitKey(0); }
效果如下:
到此,关于“C++ opencv图像平滑滤波器如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。