【opencv】教程代码 —ImgProc (10)图像平滑处理

a4ec63e9731543de76d1bd94e104eca3.png

10. Smoothing.cpp 图像平滑处理

f82f595b0e9f646fa0b38d2cc1ad3e22.png

演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用,并显示滤波后的效果。

/**
 * 文件 Smoothing.cpp
 * 简单滤镜的样例代码
 * 作者 OpenCV团队
 */


//引入所需库文件
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"


using namespace std;
using namespace cv;


//定义一些全局变量
int DELAY_CAPTION = 1500;  //延迟时间
int DELAY_BLUR = 100;   //模糊延迟时间
int MAX_KERNEL_LENGTH = 31;  //最大滤镜核心大小


Mat src; Mat dst;  // 定义两个Mat变量,src存储原始图像,dst用于存储处理后的图像
char window_name[] = "Smoothing Demo";  //程序窗口的名字


//函数声明
int display_caption( const char* caption ); //显示文字
int display_dst( int delay );  //显示图片


/**
 * 主函数
 */
int main( int argc, char ** argv )
{
    //创建一个窗口
    namedWindow( window_name, WINDOW_AUTOSIZE );


    //载入原始图像
    const char* filename = argc >=2 ? argv[1] : "lena.jpg";   //如果用户没有输入,则默认打开lena.jpg


    src = imread( samples::findFile( filename ), IMREAD_COLOR );  //使用imread函数读取图像文件
    if (src.empty())
    {
        printf(" Error opening imagen\n");   //如果图像为空,则打印错误信息
        printf(" Usage:\n %s [image_name-- default lena.jpg] n", argv[0]); //显示使用说明
        return EXIT_FAILURE;  //结束程序
    }


    //显示原始图像
    if( display_caption( "Original Image" ) != 0 )
    {
        return 0;  //如果失败,结束程序
    }


    dst = src.clone();  //克隆src到dst
    if( display_dst( DELAY_CAPTION ) != 0 )
    {
        return 0;  //如果失败,结束程序
    }


    //应用均值模糊
    if( display_caption( "Homogeneous Blur" ) != 0 )
    {
        return 0;  //显示标题失败,结束程序
    }


    for ( 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;  //显示图像失败,结束程序
        }
    }




    //应用高斯模糊
    if( display_caption( "Gaussian Blur" ) != 0 )
    {
        return 0;  //显示标题失败,结束程序
    }


    //应用高斯模糊滤镜
    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;  //显示图像失败,结束程序
        }
    }




    //应用中值模糊
    if( display_caption( "Median Blur" ) != 0 )
    {
        return 0;  //显示标题失败,结束程序
    }


    //应用中值模糊滤镜
    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
    {
        medianBlur ( src, dst, i );
        if( display_dst( DELAY_BLUR ) != 0 )
        {
            return 0;  //显示图像失败,结束程序
        }
    }
    


    //应用双边滤波
    if( display_caption( "Bilateral Blur" ) != 0 )
    {
        return 0;  //显示标题失败,结束程序
    }


    //应用双边滤波器
    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;  //显示图像失败,结束程序
        }
    }


    //完成
    display_caption( "Done!" );


    return 0;
}


/**
 * @function display_caption 显示标题函数
 */
int display_caption( const char* caption )
{
    dst = Mat::zeros( src.size(), src.type() ); //暂时将dst置为src相同大小的全零矩阵
    putText( dst, caption,
             Point( src.cols/4, src.rows/2),
             FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); //将标题文字写入dst图片中


    return display_dst(DELAY_CAPTION); //显示dst图片
}


/**
 * @function display_dst 显示dst图片函数
 */
int display_dst( int delay )
{
    imshow( window_name, dst ); //显示窗口中的dst图片
    int c = waitKey ( delay );  //等待按键事件
    if( c >= 0 ) { return -1; }  //如果有按键输入,则返回-1
    return 0;  //否则返回0
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 12:52:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 12:52:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 12:52:03       82 阅读
  4. Python语言-面向对象

    2024-03-28 12:52:03       91 阅读

热门阅读

  1. Doris 数据集成 Catalog

    2024-03-28 12:52:03       42 阅读
  2. unity防止ui点击事件被子物体拦截

    2024-03-28 12:52:03       43 阅读
  3. python asyncio websockets server

    2024-03-28 12:52:03       41 阅读
  4. mac系统使用经验

    2024-03-28 12:52:03       41 阅读
  5. ajaxpro CVE-2021-23758 漏洞记录

    2024-03-28 12:52:03       45 阅读
  6. Android ViewBinding 使用

    2024-03-28 12:52:03       39 阅读
  7. 每日OJ题_栈⑤_力扣946. 验证栈序列

    2024-03-28 12:52:03       43 阅读
  8. Hive常用函数_16个时间日期处理

    2024-03-28 12:52:03       45 阅读