- 闭运算总结:
(1)闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
(2)闭运算是通过填充图像的凹角来滤波图像的。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同结构元素的选择导致了不同的分割。
我们可以使用opencv自带函数进行调试哦!
openCV里有一个很好的函数getStructuringElement,我们只要往这个函数传相应的处理参数,就可以进行相应的操作了,使用起来非常方便。下面我简单列举一下相应的操作宏定义:
标识符 | 含义 |
---|---|
MORPH_OPEN | 开运算 |
MORPH_CLOSE | 闭运算 |
MORPH_ERODE | 腐蚀 |
MORPH_DILATE | 膨胀 |
我就简单举个例子:
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("寒山不冷.jpg");
namedWindow("原始图", WINDOW_NORMAL);
imshow("原始图", img);
Mat out;
//获取自定义核 第一个参数MORPH_RECT表示矩形的卷积核,当然还可以选择椭圆形的、交叉型的
Mat element = getStructuringElement(MORPH_RECT, Size(18, 18));
//具体要选择哪种操作,就修改第三个参数就可以了。这里演示的是形态学开运算处理
morphologyEx(img, out, MORPH_OPEN, element);
namedWindow("形态学处理操作", WINDOW_NORMAL);
imshow("形态学处理操作", out);
waitKey(0);
}
开运算:先腐蚀,再膨胀
可以清除一些小东西(亮的),放大局部低亮度的区域
闭运算:先膨胀,再腐蚀
可以清除小黑点
形态学梯度:膨胀图与腐蚀图之差
提取物体边缘
顶帽:原图像 - 开运算图
突出原图像中比周围亮的区域
黑帽:闭运算图 - 原图像
突出原图像中比周围暗的区域
这些运算都能用一个函数进行处理
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, ...)
看前四个参数就行了,后面的就用默认值
第一个参数 输入
第二个参数 输出
第三个参数 操作类型
MORTH_OPEN 函数做开运算
MORTH_CLOSE 函数做闭运算
MORTH_GRADIENT 函数做形态学梯度运算
MORTH_TOPHAT 函数做顶帽运算
MORTH_BLACKHAT 函数做黑帽运算
MORTH_DILATE 函数做膨胀运算
MORTH_ERODE 函数做腐蚀运算
第四个参数 内核类型 用getStructuringElement函数得到
例子:
morphologyEx(ma1, maArray[0], MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(15,15))); imshow("im4", maArray[0]);
morphologyEx(ma1, maArray[1], MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im5", maArray[1]); morphologyEx(ma1, maArray[2], MORPH_GRADIENT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im6", maArray[2]); morphologyEx(ma1, maArray[3], MORPH_TOPHAT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im7", maArray[3]); morphologyEx(ma1, maArray[4], MORPH_BLACKHAT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im8", maArray[4]); morphologyEx(ma1, maArray[5], MORPH_DILATE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im9", maArray[5]); morphologyEx(ma1, maArray[6], MORPH_ERODE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im10", maArray[6]);