Image Processing1 (Smoothing Images)

目标

    模糊():均值滤波
    高斯模糊():高斯滤波
    medianBlur():中值滤波

    双边滤波器():双边滤波

理论

理论来源于:“计算机视觉:算法与应用”

均值滤波,高斯滤波以及中值滤波都比较简单,这里不再介绍。

双边滤波用的较少,详细介绍下。

双边介绍的权重有两个部分,其中第一部分的权重与高斯滤波使用的权重相同,第二部分的权重则是用于评估像素之间强度的差异高斯滤波的思想:在大部分情况下,离中心像素的距离越近,则其权重越大;一般情况下,的确是这个样子,由于图像像素的缓慢变换,然而在图像的额边缘处,由于像素信息较为丰富,并不是这样子;继续使用空域高斯滤波则可能导致图像边缘模糊,因而这里应该根据像素的差异进行评估权重,若是像素颜色,纹理较为相似,则权重赢较大。因而双边滤波添加了另外的一个权重。具体公式如下(毛星云“OpenCV3编程入门”):

不是俺不放公式,一放公式就待审查。公式上面提高书上的177-178页。

/ **
 *文件Smoothing.cpp
 *简单简单过滤器的示例代码
 *作者OpenCV团队
 * /


#include <iostream>
#include“opencv2 / imgproc.hpp”
#include“opencv2 / imgcodecs.hpp”
#include“opencv2 / highgui .hpp“

using namespace std;
使用命名空间cv;

//全局变量
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;

Mat src; Mat dst;
char window_name [] =“平滑演示”;

//函数头
int display_caption(const char * caption);
int display_dst(int delay);


/ **
 *函数main
 * /

int main(int argc,

    namedWindow(window_name,WINDOW_AUTOSIZE);

     //加载源图像
    const char * filename = argc> = 2?argv [1]:“./lena.jpg”;

    src = imread(filename,IMREAD_COLOR);
    if(src.empty()){
        printf(“Error opening image \ n”);
        printf(“Usage:./Smoothing [image_name - default ./lena.jpg] \ n”);
        返回-1;
    }

    if(display_caption(“Original Image”)!= 0){return 0; }

    dst = src.clone();
    if(display_dst(DELAY_CAPTION)!= 0){return 0; }


    //应用均匀模糊
    if(display_caption(“Homogeneous Blur”)!= 0){return 0; }

     //![blur]
    代表(int i = 1; i <)MAX_KERNEL_LENGTH; i = i + 2)
    {blur(src,dst,Size(i,i),Point(-1,-1));         if(display_dst(DELAY_BLUR)!= 0){return 0; //原图想,目标图像,内核大小,锚点:平滑的点
}}
    //![blur]

    //应用高斯模糊
    if(display_caption(“Gaussian Blur”)!= 0){return 0; }

    //![gaussianblur]
    for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
    {GaussianBlur(src,dst,Size(i,i),0,0); //显示图像,目标图像,内核大小,标准差,标准差
        if(display_dst(DELAY_BLUR)!= 0){return 0; }}
    // [高斯模糊]!

     //应用中值模糊
    如果(display_caption( “中间模糊”)!= 0){返回0; }

    //![medianblur]
    for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
    {medianBlur(src,dst,i); //原图想,目标图像,相当于size(i,i)
        if(display_dst(DELAY_BLUR)!= 0){return 0;     如果(display_caption(“Bilateral Blur”)!= 0){return 0; }}
    // // [medianblur]

    //应用双边滤波器
}

     // // [
    sidesfilter ] for(int i = 1; i <MAX_KERNEL_LENGTH; i = i + 2)
    {bilateralFilter(src,dst,i,i * 2,i / 2); //原图像,目标图像,领域大小,色彩的标准差,空间的标准差
        if(display_dst(DELAY_BLUR)!= 0){return 0; }}
    //![bilateralfilter]

    //完成
    display_caption(“Done!”);

    返回0;
}

/ **
 * @function display_caption
 * /

int display_caption(const char * caption)
{
    dst = Mat :: zeros(src.size(),src.type());
    //图片,文本,点,字体类型,比例因子,颜色
    putText(DST,字幕,
             点(src.cols / 4,src.rows / 2),
             FONT_HERSHEY_COMPLEX,1,标量(255,255,255));

    返回display_dst(DELAY_CAPTION);
}

/ **
 * @function display_dst
 * /

INT display_dst(INT延迟)
{
    imshow(window_name,DST);
    int c = waitKey(delay);
    if(c> = 0){return -1; }
    return 0;

}

添加了更详细的注释,这里不再解释。

CMakeLists.txt文件同上一篇,不用修改。

测试结果是一个渐变的过程。放一个中间过程的截图。