当中的这些操作都能够进行就地(in-place)操作。且对于多通道图像,每个通道都是单独进行操作。
OK。解说完成。以下就是使用的范例。
高能预警!高能预警。高能预警!
一大波演示样例代码正在逼近。
为了方便大家须要的时候随时取用。以下我们依次列举出开运算,闭运算,形态学梯度,顶帽。黑帽。腐蚀。膨胀的效果实现简化版完整代码。
事实上说白了。这些代码基本上内容一致,事实上就是改一下morphologyEx里面的第三个标识符參数而已。核都是选的MORPH_RECT,矩形元素结构。
另外,通过看源代码我们发现。最主要的腐蚀和膨胀操作也能够用morphologyEx函数来实现。他们由morphologyEx函数源代码中switch的前两个case来实现(尽管在case体内就是简单地各自调用了一下erode和dilation函数,但还是有写出来的必要)。
所以在这里。我们也用morphologyEx再又一次来实现一遍他们。
按着顺序来列出吧,就直接列具体凝视好的代码和执行结果了。
3.2开运算演示样例程序
OpenCV中调用morphologyEx函数进行开运算操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数。我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】开运算");
namedWindow("【效果图】开运算");
//显示原始图
imshow("【原始图】开运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_OPEN, element);
//显示效果图
imshow("【效果图】开运算", image);
waitKey(0);
return 0;
}执行效果图:
3.3闭运算演示样例程序
OpenCV中调用morphologyEx函数进行闭运算操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】闭运算");
namedWindow("【效果图】闭运算");
//显示原始图
imshow("【原始图】闭运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_CLOSE, element);
//显示效果图
imshow("【效果图】闭运算", image);
waitKey(0);
return 0;
}
执行效果图:
3.4形态学梯度演示样例程序
OpenCV中调用morphologyEx函数进行形态学梯度操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】形态学梯度");
namedWindow("【效果图】形态学梯度");
//显示原始图
imshow("【原始图】形态学梯度", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_GRADIENT, element);
//显示效果图
imshow("【效果图】形态学梯度", image);
waitKey(0);
return 0;
}
执行效果图:
3.5顶帽运算(Top Hat)演示样例程序
OpenCV中调用morphologyEx函数进行顶帽运算操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】顶帽运算");
namedWindow("【效果图】顶帽运算");
//显示原始图
imshow("【原始图】顶帽运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_TOPHAT, element);
//显示效果图
imshow("【效果图】顶帽运算", image);
waitKey(0);
return 0;
}
执行效果图:
3.6黑帽运算(BlackHat)演示样例程序
OpenCV中调用morphologyEx函数进行黑帽运算操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数。我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】黑帽运算");
namedWindow("【效果图】黑帽运算");
//显示原始图
imshow("【原始图】黑帽运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_BLACKHAT, element);
//显示效果图
imshow("【效果图】黑帽运算", image);
waitKey(0);
return 0;
}执行效果图:
3.7腐蚀(morphologyEx调用版)演示样例程序
OpenCV中调用morphologyEx函数进行腐蚀操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】腐蚀");
namedWindow("【效果图】腐蚀");
//显示原始图
imshow("【原始图】腐蚀", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_ERODE, element);
//显示效果图
imshow("【效果图】腐蚀", image);
waitKey(0);
return 0;
}
执行效果图:
3.8膨胀(morphologyEx调用版)演示样例程序
OpenCV中调用morphologyEx函数进行膨胀操作的演示样例程序例如以下:
//-----------------------------------【头文件包括部分】---------------------------------------
// 描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//加载原始图
Mat image = imread("1.jpg"); //project文件夹下应该有一张名为1.jpg的素材图
//创建窗体
namedWindow("【原始图】膨胀");
namedWindow("【效果图】膨胀");
//显示原始图
imshow("【原始图】膨胀", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_DILATE, element);
//显示效果图
imshow("【效果图】膨胀", image);
waitKey(0);
return 0;
}
执行效果图:
四、综合演示样例——在实战中熟稔
依旧是每篇文章都会配给大家的一个具体凝视的博文配套演示样例程序,把这篇文章中介绍的知识点以代码为载体,展现给大家。
这个演示样例程序中,一共同拥有四个显示图像的窗体。
原始图一个,开/闭运算为一个,腐蚀/膨胀为一个,顶帽/黑帽运算为一个。
分别使用滚动栏,来控制得到的形态学效果。且迭代值为10的时候,为中间。
另外。还能够通过键盘按键1,2,3以及空格,来调节成不同的元素结构(矩形、椭圆、十字形)。
说明页面例如以下:
废话不多说,上代码吧:
//-----------------------------------【程序说明】----------------------------------------------
//程序名称::《【OpenCV新手教程之十一】形态学图像处理(一):膨胀与腐蚀 》 博文配套源代码
//开发所用IDE版本号:Visual Studio 2010
// 开发所用OpenCV版本号:2.4.8
//2014年4月25日 Create by 浅墨
//----------------------------------------------------------------------------------------------
//-----------------------------------【头文件包括部分】---------------------------------------
//描写叙述:包括程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------【命名空间声明部分】--------------------------------------
//描写叙述:包括程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;
//-----------------------------------【全局变量声明部分】--------------------------------------
//描写叙述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage;//原始图和效果图
int g_nElementShape = MORPH_RECT;//元素结构的形状
//变量接收的TrackBar位置參数
int g_nMaxIterationNum = 10;
int g_nOpenCloseNum = 0;
int g_nErodeDilateNum = 0;
int g_nTopBlackHatNum = 0;
//-----------------------------------【全局函数声明部分】--------------------------------------
//描写叙述:全局函数声明
//-----------------------------------------------------------------------------------------------
static void on_OpenClose(int, void*);//回调函数
static void on_ErodeDilate(int, void*);//回调函数
static void on_TopBlackHat(int, void*);//回调函数
static void ShowHelpText();//帮助文字显示
//-----------------------------------【main( )函数】--------------------------------------------
//描写叙述:控制台应用程序的入口函数,我们的程序从这里開始
//-----------------------------------------------------------------------------------------------
int main( )
{
//改变console字体颜色
system("color 2F");
ShowHelpText();
//加载原图
g_srcImage = imread("1.jpg");//project文件夹下须要有一张名为1.jpg的素材图
if( !g_srcImage.data ) { printf("Oh。no,读取srcImage错误~!
\n"); return false; }
//显示原始图
namedWindow("【原始图】");
imshow("【原始图】", g_srcImage);
//创建三个窗体
namedWindow("【开运算/闭运算】",1);
namedWindow("【腐蚀/膨胀】",1);
namedWindow("【顶帽/黑帽】",1);
//參数赋值
g_nOpenCloseNum=9;
g_nErodeDilateNum=9;
g_nTopBlackHatNum=2;
//分别为三个窗体创建滚动栏
createTrackbar("迭代值", "【开运算/闭运算】",&g_nOpenCloseNum,g_nMaxIterationNum*2+1,on_OpenClose);
createTrackbar("迭代值", "【腐蚀/膨胀】",&g_nErodeDilateNum,g_nMaxIterationNum*2+1,on_ErodeDilate);
createTrackbar("迭代值", "【顶帽/黑帽】",&g_nTopBlackHatNum,g_nMaxIterationNum*2+1,on_TopBlackHat);
//轮询获取按键信息
while(1)
{
int c;
//执行回调函数
on_OpenClose(g_nOpenCloseNum, 0);
on_ErodeDilate(g_nErodeDilateNum, 0);
on_TopBlackHat(g_nTopBlackHatNum,0);
//获取按键
c = waitKey(0);
//按下键盘按键Q或者ESC。程序退出
if( (char)c == 'q'||(char)c == 27 )
break;
//按下键盘按键1。使用椭圆(Elliptic)结构元素结构元素MORPH_ELLIPSE
if( (char)c == 49 )//键盘按键1的ASII码为49
g_nElementShape = MORPH_ELLIPSE;
//按下键盘按键2。使用矩形(Rectangle)结构元素MORPH_RECT
else if( (char)c == 50 )//键盘按键2的ASII码为50
g_nElementShape = MORPH_RECT;
//按下键盘按键3,使用十字形(Cross-shaped)结构元素MORPH_CROSS
else if( (char)c == 51 )//键盘按键3的ASII码为51
g_nElementShape = MORPH_CROSS;
//按下键盘按键space,在矩形、椭圆、十字形结构元素中循环
else if( (char)c == ' ' )
g_nElementShape = (g_nElementShape + 1) % 3;
}
return 0;
}
//-----------------------------------【on_OpenClose( )函数】----------------------------------
//描写叙述:【开运算/闭运算】窗体的回调函数
//-----------------------------------------------------------------------------------------------
static void on_OpenClose(int, void*)
{
//偏移量的定义
int offset = g_nOpenCloseNum - g_nMaxIterationNum;//偏移量
int Absolute_offset = offset > 0 ?
offset : -offset;//偏移量绝对值
//自己定义核
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset*2+1, Absolute_offset*2+1), Point(Absolute_offset, Absolute_offset) );
//进行操作
if( offset < 0 )
morphologyEx(g_srcImage, g_dstImage, CV_MOP_OPEN, element);
else
morphologyEx(g_srcImage, g_dstImage, CV_MOP_CLOSE, element);
//显示图像
imshow("【开运算/闭运算】",g_dstImage);
}
//-----------------------------------【on_ErodeDilate( )函数】----------------------------------
//描写叙述:【腐蚀/膨胀】窗体的回调函数
//-----------------------------------------------------------------------------------------------
static void on_ErodeDilate(int, void*)
{
//偏移量的定义
int offset = g_nErodeDilateNum - g_nMaxIterationNum;//偏移量
int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值
//自己定义核
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset*2+1, Absolute_offset*2+1), Point(Absolute_offset, Absolute_offset) );
//进行操作
if( offset < 0 )
erode(g_srcImage, g_dstImage, element);
else
dilate(g_srcImage, g_dstImage, element);
//显示图像
imshow("【腐蚀/膨胀】",g_dstImage);
}
//-----------------------------------【on_TopBlackHat( )函数】--------------------------------
//描写叙述:【顶帽运算/黑帽运算】窗体的回调函数
//----------------------------------------------------------------------------------------------
static void on_TopBlackHat(int, void*)
{
//偏移量的定义
int offset = g_nTopBlackHatNum - g_nMaxIterationNum;//偏移量
int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值
//自己定义核
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset*2+1, Absolute_offset*2+1), Point(Absolute_offset, Absolute_offset) );
//进行操作
if( offset < 0 )
morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT , element);
else
morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);
//显示图像
imshow("【顶帽/黑帽】",g_dstImage);
}
//-----------------------------------【ShowHelpText( )函数】----------------------------------
//描写叙述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{
//输出一些帮助信息
printf("\n\n\n\t请调整滚动栏观察图像效果~\n\n");
printf( "\n\n\t按键操作说明: \n\n"
"\t\t键盘按键【ESC】或者【Q】- 退出程序\n"
"\t\t键盘按键【1】- 使用椭圆(Elliptic)结构元素\n"
"\t\t键盘按键【2】- 使用矩形(Rectangle )结构元素\n"
"\t\t键盘按键【3】- 使用十字型(Cross-shaped)结构元素\n"
"\t\t键盘按键【空格SPACE】- 在矩形、椭圆、十字形结构元素中循环\n"
"\n\n\t\t\t\t\t\t\t\t by浅墨"
);
}
放出一些效果图:
首先是原图:
非常帅气的Captain America有木有!
腐蚀效果图:
膨胀效果图:
开运算效果图:
闭运算效果图:
顶帽运算效果图:
黑帽运算效果图:
好的,就放出这些效果图吧。具体很多其它的执行效果大家就自己下载演示样例程序回去玩~
本篇文章的配套源代码请点击这里下载:
OK。今天的内容大概就是这些,我们下篇文章见:)