opencv 图像平滑处理

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/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;
char window_name[] = "Filter Demo 1";

/// 函数申明
int display_caption( char* caption );
int display_dst( int delay );

/**
 *  main 函数
 */
int main( int argc, char** argv )
{
    namedWindow( window_name, WINDOW_AUTOSIZE );

    /// 载入原图像
    // 如果设置IMREAD_COLOR,请始终将图像转换为3通道BGR彩色图像。
    // 如果设置IMREAD_GRAYSCALE,则始终将图像转换为单通道灰度图像(编解码器内部转换)。
    src = imread( "/home/lxn/1.jpg", IMREAD_COLOR );

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

    // 图像复制
    dst = src.clone();
    // 这里是指显示dst图像DELAY_CAPTION毫秒,在DELAY_CAPTION时间内无鼠标操作,则继续向下执行,否则return 0 程序结束。
    if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }

    /// 使用 均值平滑
    if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }

//    OpenCV函数 blur 执行了归一化块平滑操作。
//    src: 输入图像
//    dst: 输出图像
//    Size( w,h ): 定义内核大小( w 像素宽度, h 像素高度)
//    Point(-1, -1): 指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
    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; }


//    OpenCV函数 GaussianBlur 执行高斯平滑 :
//    src: 输入图像
//    dst: 输出图像
//    Size(w, h): 定义内核的大小(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使用 \sigma_{x} 和 \sigma_{y} 参数来计算内核大小。
//    x 方向标准方差, 如果是 0 则使用内核大小计算得到。
//    y 方向标准方差, 如果是 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; }


//    OpenCV函数 medianBlur 执行中值滤波操作:
//    src: 输入图像
//    dst: 输出图像, 必须与 src 相同类型
//    i: 内核大小 (只需一个值,因为我们使用正方形窗口),必须为奇数。
    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; }


//    OpenCV函数 bilateralFilter 执行双边滤波操作:
//    src: 输入图像
//    dst: 输出图像
//    d: 像素的邻域直径
//    颜色空间的标准方差
//    坐标空间的标准方差(像素单位)
    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( "End: Press a key!" );

    waitKey(0);
    return 0;
}





/*
 *
 * 创建一个和src大小与类型一致的黑色图像,并在宽度1/4,高度1/2处绘制文字。
 *
 * 	void cv::putText(
		cv::Mat& img, // 待绘制的图像
		const string& text, // 待绘制的文字
		cv::Point origin, // 文本框的左下角
		int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
		double fontScale, // 尺寸因子,值越大文字越大
		cv::Scalar color, // 线条的颜色(RGB)
		int thickness = 1, // 线条宽度
		int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
		bool bottomLeftOrigin = false // true='origin at lower left'
	);

 * Scalar(255, 255, 255) 是指白色
 *
 * */
int display_caption( char* caption )
{
    dst = Mat::zeros( src.size(), src.type() );
    putText( dst, caption,
             Point( src.cols/4, src.rows/2),
             FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

    imshow( window_name, dst );
    int c = waitKey( DELAY_CAPTION );
    if( c >= 0 ) { return -1; }
    return 0;
}


int display_dst( int delay )
{
    //显示dst图像,第一个参数表示窗口title,第二个参数是显示图像
    imshow( window_name, dst );
    //waitKey(n) 等待n毫秒,当等待时间内无任何操作时等待结束后返回-1。当等待时间内有输入字符时,则返回输入字符的ASCII码对应的十进制值。
    int c = waitKey ( delay );
    if( c >= 0 ) { return -1; }
    return 0;
}

参考文献:

OpenCV 教程 imgproc 模块之图像处理

你可能感兴趣的:(OpenCV)