【图像处理】-021 开运算和闭运算
上一篇中说到了图像的形态学操作,介绍了腐蚀和膨胀。由于腐蚀和膨胀都会对目标的面积产生较大的影响(依据操作元素的大小),影响图像中正常目标的判断。在形态学操作中,还有开运算和闭运算操作,操作结果对目标的尺寸只有较小的影响。开运算一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。闭运算也会平滑轮廓的一部分,通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。
1 开运算
结构元
B
B
B对集合
A
A
A的开操作,表示为
A
∘
B
A\circ B
A∘B,其定义如下:
(1)
A
∘
B
=
(
A
⊝
B
)
⨁
B
A \circ B =(A\circleddash B)\bigoplus B \tag{1}
A∘B=(A⊝B)⨁B(1)
B
B
B对
A
A
A的开操作就是
B
B
B对
A
A
A的腐蚀,紧接着用B对结果进行膨胀,也就是用结构元素B,先对A进行腐蚀操作,在对腐蚀结果进行膨胀操作。
2 闭运算
用结构元B对集合A的闭运算,表示为
A
⋅
B
A\cdot B
A⋅B,其定义如下:
(2)
A
⋅
B
=
(
A
⨁
B
)
⊝
B
A\cdot B=(A\bigoplus B)\circleddash B \tag{2}
A⋅B=(A⨁B)⊝B(2)
B对集合A的闭运算,就是先用B对A进行膨胀,然后对结果用B进行腐蚀,先膨胀后腐蚀。
3 实现
#include "../Include/baseOps.h"
int main()
{
//OutputDebugString(L"AB");
SetCurrentDirectoryToExePath();
cv::Mat src = cv::imread("../images/72.png");
cv::imshow("原图", src);
cv::Mat bw;
cv::threshold(src, bw, 125, 255, cv::THRESH_BINARY);
cv::imshow("125阈值二值化", bw);
cv::Mat m = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
cv::Mat dst;
cv::morphologyEx(bw, dst, cv::MORPH_ERODE, m);
cv::imshow("腐蚀", dst);
cv::morphologyEx(bw, dst, cv::MORPH_DILATE, m);
cv::imshow("膨胀", dst);
cv::morphologyEx(bw, dst, cv::MORPH_OPEN, m);
cv::imshow("开运算", dst);
cv::morphologyEx(bw, dst, cv::MORPH_CLOSE, m);
cv::imshow("闭运算", dst);
cv::waitKey(0);
return 0;
}