opencv-平滑模糊

blur均值滤波 

这是通过将图像与标准化的盒式过滤器( normalized box filter)进行卷积来完成的。它只取内核区域下所有像素的平均值并替换中心元素

我们应该指定内核的宽度和高度。 3x3标准化的盒式过滤器如下所示:

 

#include<opencv2/opencv.hpp>
#include<iostream>



int main(int argc, char** argv) {

    cv::Mat src, dst;
    src = cv::imread("D:/bb/tu/sansui.jpg");
    blur(src, dst, cv::Size(3, 3));
    imshow("src", src);
    imshow("dst-Size(3,3)", dst);
    blur(src, dst, cv::Size(8, 8));
    imshow("dst-Size(8,8)", dst);

    cv::waitKey(0);
    return 0;
}

 

 

 

boxFilter均值滤波 

#include<opencv2/opencv.hpp>
#include<iostream>



int main(int argc, char** argv) {

    cv::Mat src, dst;
    src = cv::imread("D:/bb/tu/sansui.jpg");
    boxFilter(src, dst,-1, cv::Size(5, 5));
    /*
    参数3:输出图像深度(-1使用src.depth())
    参数5:anchor 锚点;默认值点(-1,-1)表示锚点在内核中心
    参数6:normalize 指定内核是否按其区域标准化
        =true  就等同于blur
    参数7:borderType 边界模式
    */
    imshow("src", src);
    imshow("dst-Size(5,5)", dst);
    
    cv::waitKey(0);
    return 0;
}

medianBlur中值滤波 

取内核区域下所有像素的中值(从小排到大,取中间那个数),并用该中值替换中心元素。这对图像中的椒盐噪声非常有效 

该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节

1.jpg

 

 

#include<opencv2/opencv.hpp>
#include<iostream>



int main(int argc, char** argv) {

    cv::Mat src, dst;
    src = cv::imread("D:/bb/tu/1.jpg");
    medianBlur(src, dst,5);
    /*
    参数1:src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能
            为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U
    参数3:ksize线性直径大小,只能是一个大于1的奇数,例如:3, 5, 7 …
    */
    imshow("src", src);
    imshow("medianBlur", dst);
    
    cv::waitKey(0);
    return 0;
}

GaussianBlur高斯滤波 

看:https://www.cnblogs.com/liming19680104/p/15474990.html 

 

bilateralFilter双边滤波 

在降低噪音方面非常有效,同时保持边缘清晰,但与其他过滤器相比,操作速度较慢

高斯滤波器采用像素周围的邻域并找到其高斯加权平均值。该高斯滤波器仅是空间的函数,即,在滤波时考虑附近的像素。它没有考虑像素是否具有几乎相同的强度。它不考虑像素是否是边缘像素。所以它也模糊了边缘,我们不想这样做。

      双边滤波器在空间中也采用高斯滤波器,但还有一个高斯滤波器,它是像素差的函数。空间的高斯函数确保仅考虑附近的像素用于模糊,而强度差的高斯函数确保仅具有与中心像素相似强度的那些像素被认为是模糊的。因此它保留了边缘,因为边缘处的像素将具有较大的强度变化

对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通

sansui.jpg

 

 

#include<opencv2/opencv.hpp>
#include<iostream>



int main(int argc, char** argv) {

    cv::Mat src = cv::imread("D:/bb/tu/sansui.jpg");
    cv::Mat out,out1;
    cv::GaussianBlur(src, out, cv::Size(5, 5), 3, 3);//高斯滤波
    cv::bilateralFilter(src, out1, 50, 50,10);   //双边滤波
    /*
    参数3:在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值
    参数4:颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有更远的颜色会被混合到一起,产生较大的半相等颜色区域
    参数5:坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色
    参数6:用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT
    */
        
    cv::imshow("原图", src);
    cv::imshow("高斯滤波", out);
    cv::imshow("双边滤波", out1);
        
    cv::waitKey(0);
    return 0;
}

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-12-19 09:32  天子骄龙  阅读(40)  评论(0编辑  收藏  举报