您的位置:首页 > 其它

图像腐蚀erode与膨胀dilate综合示例

2015-10-26 09:24 429 查看
图像腐蚀erode与膨胀dilate综合示例
//-----------------------------------【全局变量声明部分】--------------------------------------

// 描述:全局变量声明

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

Mat g_srcImage, g_dstImage;//原始图和效果图

int g_nTrackbarNumer = 0;//0表示腐蚀erode, 1表示膨胀dilate

int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸

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

// 描述:全局函数声明

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

void Process();//膨胀和腐蚀的处理函数

void on_TrackbarNumChange(int, void *);//回调函数

void on_ElementSizeChange(int, void *);//回调函数

void ShowHelpText();

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

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

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

int main( )

{

//改变console字体颜色

system("color 2F");

//载入原图

g_srcImage = imread("1.jpg");

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

ShowHelpText();

//显示原始图

namedWindow("【原始图】");

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

//进行初次腐蚀操作并显示效果图

namedWindow("【效果图】");

//获取自定义核

Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));

erode(g_srcImage, g_dstImage, element);

imshow("【效果图】", g_dstImage);

//创建轨迹条

createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange);

createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);

//输出一些帮助信息

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

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

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

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

return 0;

}

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

// 描述:进行自定义的腐蚀和膨胀操作

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

void Process()

{

//获取自定义核

Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));

//进行腐蚀或膨胀操作

if(g_nTrackbarNumer == 0) {

erode(g_srcImage, g_dstImage, element);

}

else {

dilate(g_srcImage, g_dstImage, element);

}

//显示效果图

imshow("【效果图】", g_dstImage);

}

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

// 描述:腐蚀和膨胀之间切换开关的回调函数

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

void on_TrackbarNumChange(int, void *)

{

//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来

Process();

}

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

// 描述:腐蚀和膨胀操作内核改变时的回调函数

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

void on_ElementSizeChange(int, void *)

{

//内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来

Process();

}

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

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

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

void ShowHelpText()

{

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

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

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

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

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

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