【OpenCV入门教程之十一】 形态学图像处理 二开运算 闭运算 形态学梯度( 四 )


int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸 //获取自定义核Mat element =getStructuringElement(MORPH_RECT,Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),Point(g_nStructElementSize, g_nStructElementSize ));
调用这样之后 , 我们便可以在接下来调用erode、或函数时 , 参数填保存t返回值的Mat类型变量 。对应于我们上面的示例 , 就是填变量 。
其中的这些操作都可以进行就地(in-place)操作 。且对于多通道图像 , 每一个通道都是单独进行操作 。
OK , 讲解完毕 , 下面就是使用的范例 。
高能预警!高能预警!高能预警!
一大波示例代码正在逼近 。
为了方便大家需要的时候随时取用 。下面我们依次列举出开运算 , 闭运算 , 形态学梯度 , 顶帽 , 黑帽 , 腐蚀 , 膨胀的效果实现简化版完整代码 。
其实说白了 , 这些代码基本上内容一致 , 其实就是改一下里面的第三个标识符参数而已 。核都是选的 , 矩形元素结构 。
另外 , 通过看源码我们发现 , 最基本的腐蚀和膨胀操作也可以用函数来实现 , 他们由函数源码中的前两个case来实现(虽然在case体内就是简单地各自调用了一下erode和函数 , 但还是有写出来的必要) 。所以在这里 , 我们也用再重新来实现一遍他们 。
按着顺序来列出吧 , 就直接列详细注释好的代码和运行结果了 。
3.2 开运算示例程序
中调用函数进行开运算操作的示例程序如下:
//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include #include#include //-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------using namespace cv;//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数 , 我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图Mat image = imread("1.jpg");//工程目录下应该有一张名为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; }
运行效果图:

【OpenCV入门教程之十一】 形态学图像处理 二开运算 闭运算 形态学梯度

文章插图
3.3 闭运算示例程序
中调用函数进行闭运算操作的示例程序如下:
//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include #include #include //-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------using namespace cv;//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数 , 我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图Mat image = imread("1.jpg");//工程目录下应该有一张名为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; }