opencv均值滤波函数,opencv最大值滤波
在我们的生活中有很多时候可以用到滤镜,比如美颜的去皮功能。本文详细介绍了openCV中值滤波和均值滤波的代码实现。本文介绍的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
00-1010一、均值滤波二。中值滤波在开始我们今天的博客之前,我们需要先了解一下什么是滤波:
首先,我们来看看图像滤波的概念。图像滤波,即在尽可能保留图像细节的同时抑制目标图像的噪声,是图像预处理中必不可少的操作,其处理效果将直接影响后续图像处理和分析的有效性和可靠性。
下图左边是原图,右边是噪点图:
消除图像中的噪声成分称为图像平滑或滤波。或者信号图像的能量大多集中在幅度谱的低频和中频带,而在较高的频带,感兴趣的信息往往被噪声淹没。因此,可以降低高频分量幅度的滤波器可以削弱噪声的影响。
图像滤波的目的有两个:一是提取物体的特征作为图像识别的特征模式;二是满足图像处理的要求,消除图像数字化中混入的噪声。
滤波也有两个要求:一是图像的轮廓、边缘等重要信息不能被破坏;二是图像清晰,视觉效果好。
平滑滤波是一种用于低频增强的空间滤波技术。其目的有两种:一是歧义;另一个是消除噪声。
空间平滑滤波一般采用简单平均法,即求相邻像素点的平均亮度值。邻域的大小与平滑效果直接相关。邻域越大,平滑效果越好。但如果邻域太大,边缘信息会丢失更多,输出图像也会模糊。所以要合理选择邻域的大小。
关于滤波器,一个形象的比喻是:我们可以把滤波器想象成一个包含加权系数的窗口。当使用这个过滤器平滑图像时,我们将把这个窗口放在图像的上面,并通过这个窗口查看我们得到的图像。
以滤镜在我们生活中的应用为例:美颜的脱皮功能。如果把我们脸上的坑坑洼洼比作噪声,那么过滤算法就是把这些噪声去掉,让我们自拍的皮肤看起来光滑。
这篇博文会介绍中值滤波以及均值滤波两种算法
目录
在图片中的一个正方形区域(一般为3*3),中心点的像素是所有像素值的平均值。均值滤波就是对整张图片做以上处理。
我们可以看看下面的矩阵就明白了。
缺点:均值滤波本身存在先天缺陷,即不能很好的保护图像的细节,同时破坏了图像的细节,使得图像模糊,不能很好的去除噪声点。尤其是椒盐噪声。
实施代码:
#include opencv2/imgproc.hpp
#include opencv2/highgui.hpp
# includectime
使用名称空间cv;
使用命名空间std
//均值滤波
void AverFiltering(const Mat src,Mat dst) {
如果(!src.data)返回;
//在访问像素点
for(int I=1;isrc.rows我)
for(int j=1;j src.colsj) {
if((I-1=0)(j-1)=0(I 1)src . rows(j 1)src . cols){//不处理边缘
dst.atVec3b(i,j)[0]=(src.atVec3b(i,j)[0] src.atVec3b(i - 1,j - 1)[0] src.atVec3b(i - 1,j)[0] src.atVec3b(i,j - 1)[0]
src.atVec3b(i - 1,j 1)[0] src.atVec3b(i 1,j - 1)[0] src.atVec3b(i 1,j 1)[0] src.atVec3b(i,j 1)
[0] +
src.at<Vec3b>(i + 1, j)[0]) / 9;
dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +
src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +
src.at<Vec3b>(i + 1, j)[1]) / 9;
dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +
src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +
src.at<Vec3b>(i + 1, j)[2]) / 9;
}
else {//边缘赋值
dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
}
}
}
//图像椒盐化
void salt(Mat &image, int num) {
if (!image.data) return;//防止传入空图
int i, j;
srand(time(NULL));
for (int x = 0; x < num; ++x) {
i = rand() % image.rows;
j = rand() % image.cols;
image.at<Vec3b>(i, j)[0] = 255;
image.at<Vec3b>(i, j)[1] = 255;
image.at<Vec3b>(i, j)[2] = 255;
}
}
void main() {
Mat image = imread("路飞.jpg");
Mat Salt_Image;
image.copyTo(Salt_Image);
salt(Salt_Image, 3000);
Mat image1(image.size(), image.type());
Mat image2;
AverFiltering(Salt_Image, image1);
blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数
imshow("原图", image);
imshow("自定义均值滤波", image1);
imshow("openCV自带的均值滤波", image2);
waitKey();
}
效果图:
可以看到图片变模糊而且噪声并没有很有效的去除,该算法只是模糊化了图片而已。
二.中值滤波
首先,我们复习中值。在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。
代码:
//求九个数的中值
效果图:
可以看到,椒盐噪声很好的被平滑了,而且也没均值那样模糊化太过于严重。
到此这篇关于openCV中值滤波和均值滤波的代码实现的文章就介绍到这了,更多相关openCV中值滤波和均值滤波内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。