形态学处理一 膨胀二 腐蚀三 开运算四 闭运算五 形态学梯度六 顶帽七 黑帽
形态学处理
一 膨胀
代码:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iostream>//-----------------------------------【命名空间声明部分】---------------------------------------// 描述:包含程序所使用的命名空间//----------------------------------------------------------------------------------------------- using namespace std;using namespace cv;//-----------------------------------【main( )函数】--------------------------------------------// 描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main(){//载入原图 Mat image = imread("D:/srcPics/3.jpg");//创建窗口 namedWindow("【原图】膨胀操作");namedWindow("【效果图】膨胀操作");//显示原图imshow("【原图】膨胀操作", image);//进行膨胀操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat out;dilate(image, out, element);//显示效果图 imshow("【效果图】膨胀操作", out);waitKey(0);return 0;
运行结果:
二 腐蚀
代码:
//-----------------------------------【头文件包含部分】---------------------------------------// 描述:包含程序所依赖的头文件//---------------------------------------------------------------------------------------------- #include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iostream>//-----------------------------------【命名空间声明部分】---------------------------------------// 描述:包含程序所使用的命名空间//----------------------------------------------------------------------------------------------- using namespace std;using namespace cv;//-----------------------------------【main( )函数】--------------------------------------------// 描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原图 Mat image = imread("1.jpg");//创建窗口 namedWindow("【原图】膨胀操作");namedWindow("【效果图】膨胀操作");//显示原图imshow("【原图】膨胀操作", image);//进行膨胀操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat out;dilate(image, out, element);//显示效果图 imshow("【效果图】膨胀操作", out);waitKey(0); return 0;}
三 开运算
本节的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算、形态学梯度、“顶帽”、“黑帽”等。
代码:
#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>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; }
实质:
开运算,其实就是先腐蚀后膨胀的过程。
功能:
开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。
四 闭运算
代码:
#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>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; }
先膨胀后腐蚀的过程称为闭运算。
功能:闭运算能够排除小型黑洞(黑色区域)。
五 形态学梯度
#include"opencv.hpp"#include"opencv2/opencv.hpp"using namespace cv;int main(){Mat image = imread("D:/srcPics/3.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;}
形态学梯度是膨胀图与腐蚀图之差。
六 顶帽
#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>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_TOPHAT, element);//显示效果图 imshow("【效果图】顶帽运算", image); waitKey(0); return 0; }
顶帽运算(Top Hat)**又常常被译为“礼帽”运算,是原图像与上文刚刚介绍的“开运算”的结果图之差。
作用:
因为开运算带来的结果是放大了裂缝或者是局部低亮度的区域。因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更加明亮的区域,且这已操作与选择的核大小相关。
顶帽运算往往用来分离比临近点亮一些的斑块。在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
七 黑帽
#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>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_BLACKHAT, element);//显示效果图 imshow("【效果图】黑帽运算", image); waitKey(0); return 0; }
黑帽运算是闭运算的结果图与原图像之差。
黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。
所以,黑帽运算用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。
注:
这一章节的核心API函数:morphologyEx()
以上是我根据OpenCV3.0总结的形态学相关内容,方便以后自己调用。
个人公众号:视觉IMAX