形态学梯度计算/开运算/闭运算/顶帽运算/黑帽 27.形态学处理图像效果( 二 )


翻开小嗷写的第6篇文章,获取运算公式如下信息:
(有条件就PC打开,PC打开排版好看点,也可以去公众号底下的文章分类 -> 编程 -> 查看第四篇文章)

形态学梯度计算/开运算/闭运算/顶帽运算/黑帽  27.形态学处理图像效果

文章插图
代码如下:
/* 功能:实现4中形态学梯度:基本梯度、内部梯度、外部梯度、方向梯度 */#include #include #include #include using namespace std;using namespace cv;int main(){Mat srcImage, grayImage; //源图像,输出图像,灰度图像//---------【1】读取源图像并检查图像是否读取成功---------srcImage = imread("D:\\OutPutResult\\ImageTest\\ju.jpg");if (!srcImage.data){cout << "读取图片错误,请重新输入正确路径!\n";system("pause");return -1;}imshow("【源图像】", srcImage);//---------【2】获取自定义核及对源图像进行腐蚀与膨胀---------Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));Mat erode_ouput, dilate_output;erode(srcImage, erode_ouput, element); //腐蚀dilate(srcImage, dilate_output, element); //膨胀//---------【3】计算基本梯度:膨胀后的图像减去腐蚀后的图像----------Mat basicGradient;subtract(dilate_output, erode_ouput, basicGradient, Mat());imshow("【基本梯度】", basicGradient);//---------【4】计算内部梯度:原图像减去腐蚀之后的图像----------Mat internalGradientImg;subtract(srcImage, erode_ouput, internalGradientImg, Mat());imshow("【内部梯度】", internalGradientImg);//---------【5】计算外部梯度:膨胀后的图像减去原图像----------Mat externalGradientImg;subtract(dilate_output, srcImage, externalGradientImg, Mat());imshow("【外部梯度】", externalGradientImg);//---------【6】方向梯度:使用X方向与Y方向的直线作为结构元素---------Mat hse = getStructuringElement(MORPH_RECT, Size(srcImage.cols / 16, 1));Mat vse = getStructuringElement(MORPH_RECT, Size(1, srcImage.rows / 16));Mat erode_direct, dilate_direct;Mat binImg, xDirectImg, yDirectImg;// 转为灰度图cvtColor(srcImage, grayImage, CV_BGR2GRAY);// 将灰度图二值化threshold(grayImage, binImg, 0, 255, CV_THRESH_OTSU);// X 方向梯度:膨胀与腐蚀之后得到图像求差值erode(binImg, erode_direct, hse);dilate(binImg, dilate_direct, hse);subtract(dilate_direct, erode_direct, xDirectImg, Mat());imshow("【X 方向梯度】", xDirectImg);// Y 方向梯度:膨胀与腐蚀之后得到图像求差值erode(binImg, erode_direct, vse);dilate(binImg, dilate_direct, vse);subtract(dilate_direct, erode_direct, yDirectImg, Mat());imshow("【Y 方向梯度】", yDirectImg);waitKey(0);return 0;}
这里就不上效果图,基本和上面差不多,大家可以自己试试
2.2 开运算( )
用途:先腐蚀再膨胀,可以去掉目标外的孤立点
先腐蚀后膨胀的过程称为开运算 。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用 。
数学表达式:
dst = open(src,) = (erode(src, ))
开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积 。
2.3 闭运算( )
用途:先膨胀再腐蚀,可以去掉目标内的孔 。
先膨胀后腐蚀的过程称为闭运算 。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用 。
数学表达式:
dst = open(src,) = erode((src, ))
闭运算可以用来排除小型黑洞(黑色区域)
2.4 顶帽(Top Hat)
用途:原图与开运算结果图之差,顶帽运算往往用来分离比临近点亮一些的斑块,在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取 。
数学表达式:
dst = (src,) = src - open(src,)
因为开运算带来的结果是放大了裂缝或者局部低亮度的区域 。因此从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的的大小相关 。