您的位置:首页 > 其它

边缘检测综合-Canny算子,Sobel算子,Laplace算子,Scharr滤波器

2015-10-28 09:56 225 查看
边缘检测综合-Canny算子,Sobel算子,Laplace算子,Scharr滤波器
//-----------------------------------【全局变量声明部分】--------------------------------------

// 描述:全局变量声明

//-----------------------------------------------------------------------------------------------

//原图,原图的灰度版,目标图

Mat g_srcImage, g_srcGrayImage,g_dstImage;

//Canny边缘检测相关变量

Mat g_cannyDetectedEdges;

int g_cannyLowThreshold=1;//TrackBar位置参数

//Sobel边缘检测相关变量

Mat g_sobelGradient_X, g_sobelGradient_Y;

Mat g_sobelAbsGradient_X, g_sobelAbsGradient_Y;

int g_sobelKernelSize=1;//TrackBar位置参数

//Scharr滤波器相关变量

Mat g_scharrGradient_X, g_scharrGradient_Y;

Mat g_scharrAbsGradient_X, g_scharrAbsGradient_Y;

//-----------------------------------【全局函数声明部分】--------------------------------------

// 描述:全局函数声明

//-----------------------------------------------------------------------------------------------

static void ShowHelpText( );

static void on_Canny(int, void*);//Canny边缘检测窗口滚动条的回调函数

static void on_Sobel(int, void*);//Sobel边缘检测窗口滚动条的回调函数

void Scharr( );//封装了Scharr边缘检测相关代码的函数

//-----------------------------------【main( )函数】--------------------------------------------

// 描述:控制台应用程序的入口函数,我们的程序从这里开始

//-----------------------------------------------------------------------------------------------

int main( int argc, char** argv )

{

//改变console字体颜色

system("color 2F");

//显示欢迎语

ShowHelpText();

//载入原图

g_srcImage = imread("1.jpg");

if( !g_srcImage.data ) { printf("Oh,no,读取srcImage错误~! \n"); return false; }

//显示原始图

namedWindow("【原始图】");

imshow("【原始图】", g_srcImage);

// 创建与src同类型和大小的矩阵(dst)

g_dstImage.create( g_srcImage.size(), g_srcImage.type() );

// 将原图像转换为灰度图像

cvtColor( g_srcImage, g_srcGrayImage, CV_BGR2GRAY );

// 创建显示窗口

namedWindow( "【效果图】Canny边缘检测", CV_WINDOW_AUTOSIZE );

namedWindow( "【效果图】Sobel边缘检测", CV_WINDOW_AUTOSIZE );

// 创建trackbar

createTrackbar( "参数值:", "【效果图】Canny边缘检测", &g_cannyLowThreshold, 120, on_Canny );

createTrackbar( "参数值:", "【效果图】Sobel边缘检测", &g_sobelKernelSize, 3, on_Sobel );

// 调用回调函数

on_Canny(0, 0);

on_Sobel(0, 0);

//调用封装了Scharr边缘检测代码的函数

Scharr( );

//轮询获取按键信息,若按下Q,程序退出

while((char(waitKey(1)) != 'q')) {}

return 0;

}

//-----------------------------------【ShowHelpText( )函数】----------------------------------

// 描述:输出一些帮助信息

//----------------------------------------------------------------------------------------------

static void ShowHelpText()

{

//输出欢迎信息和OpenCV版本

printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");

printf("\n\n\t\t\t此为本书OpenCV2版的第60个配套示例程序\n");

printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION );

printf("\n\n ----------------------------------------------------------------------------\n");

//输出一些帮助信息

printf( "\n\n\t运行成功,请调整滚动条观察图像效果~\n\n"

"\t按下“q”键时,程序退出。\n");

}

//-----------------------------------【on_Canny( )函数】----------------------------------

// 描述:Canny边缘检测窗口滚动条的回调函数

//-----------------------------------------------------------------------------------------------

void on_Canny(int, void*)

{

// 先使用 3x3内核来降噪

blur( g_srcGrayImage, g_cannyDetectedEdges, Size(3,3) );

// 运行我们的Canny算子

Canny( g_cannyDetectedEdges, g_cannyDetectedEdges, g_cannyLowThreshold, g_cannyLowThreshold*3, 3 );

//先将g_dstImage内的所有元素设置为0

g_dstImage = Scalar::all(0);

//使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中

g_srcImage.copyTo( g_dstImage, g_cannyDetectedEdges);

//显示效果图

imshow( "【效果图】Canny边缘检测", g_dstImage );

}

//-----------------------------------【on_Sobel( )函数】----------------------------------

// 描述:Sobel边缘检测窗口滚动条的回调函数

//-----------------------------------------------------------------------------------------

void on_Sobel(int, void*)

{

// 求 X方向梯度

Sobel( g_srcImage, g_sobelGradient_X, CV_16S, 1, 0, (2*g_sobelKernelSize+1), 1, 1, BORDER_DEFAULT );

convertScaleAbs( g_sobelGradient_X, g_sobelAbsGradient_X );//计算绝对值,并将结果转换成8位

// 求Y方向梯度

Sobel( g_srcImage, g_sobelGradient_Y, CV_16S, 0, 1, (2*g_sobelKernelSize+1), 1, 1, BORDER_DEFAULT );

convertScaleAbs( g_sobelGradient_Y, g_sobelAbsGradient_Y );//计算绝对值,并将结果转换成8位

// 合并梯度

addWeighted( g_sobelAbsGradient_X, 0.5, g_sobelAbsGradient_Y, 0.5, 0, g_dstImage );

//显示效果图

imshow("【效果图】Sobel边缘检测", g_dstImage);

}

//-----------------------------------【Scharr( )函数】----------------------------------

// 描述:封装了Scharr边缘检测相关代码的函数

//-----------------------------------------------------------------------------------------

void Scharr( )

{

// 求 X方向梯度

Scharr( g_srcImage, g_scharrGradient_X, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT );

convertScaleAbs( g_scharrGradient_X, g_scharrAbsGradient_X );//计算绝对值,并将结果转换成8位

// 求Y方向梯度

Scharr( g_srcImage, g_scharrGradient_Y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT );

convertScaleAbs( g_scharrGradient_Y, g_scharrAbsGradient_Y );//计算绝对值,并将结果转换成8位

// 合并梯度

addWeighted( g_scharrAbsGradient_X, 0.5, g_scharrAbsGradient_Y, 0.5, 0, g_dstImage );

//显示效果图

imshow("【效果图】Scharr滤波器", g_dstImage);

}







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: