处理过程:先腐蚀后膨胀。
功能:用于消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积,同时抑制比结构元小的亮细节。
使用实例:
#include<opencv2/opencv.hpp>
void main()
{
cv::Mat image = cv::imread("腐蚀膨胀练习1.jpg");
cv::namedWindow("SourceImage");
cv::namedWindow("OutputImage");
cv::imshow("SourceImage", image);
//开运算(MORPH_OPEN)
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
cv::morphologyEx(image, image, cv::MORPH_CLOSE, element);
cv::imshow("OutputImage", image);
cv::waitKey(0);
}
处理过程:先膨胀后腐蚀
功能:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积,同时抑制比结构元小的暗细节。
使用实例:
#include<opencv2/opencv.hpp>
void main()
{
cv::Mat image = cv::imread("result.BMP");
cv::namedWindow("SourceImage");
cv::namedWindow("OutputImage");
cv::imshow("SourceImage", image);
//闭运算(MORPH_CLOSE)
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
cv::morphologyEx(image, image, cv::MORPH_CLOSE, element);
cv::imshow("OutputImage", image);
cv::waitKey(0);
}
处理过程:膨胀图和腐蚀图相减
功能:对二值化图像进行这一操作可以将边缘突出来,可以使用形态学梯度来保留物体的边缘轮廓
使用实例:
#include<opencv2/opencv.hpp>
void main()
{
cv::Mat image = cv::imread("result.BMP");
cv::namedWindow("SourceImage");
cv::namedWindow("OutputImage");
cv::imshow("SourceImage", image);
//形态学梯度(MORPH_GRADIENT)
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 2));
cv::morphologyEx(image, image, cv::MORPH_GRADIENT, element);
cv::imshow("OutputImage", image);
cv::waitKey(0);
}
处理过程:原图像减去开运算的过程。
功能:顶帽变换用于校正不均匀关照的影响(补充:均匀光照在从背景中提取目标的处理中扮演核心的角色)。
使用实例:
#include<opencv2/opencv.hpp>
void main()
{
cv::Mat image = cv::imread("Fig0926(a)(rice).tif");
cv::namedWindow("SourceImage");
cv::namedWindow("OutputImage");
cv::imshow("SourceImage", image);
//形态学梯度(MORPH_GRADIENT)
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
cv::morphologyEx(image, image, cv::MORPH_TOPHAT, element);
cv::imshow("OutputImage", image);
cv::waitKey(0);
}
处理过程:闭运算减去原图像的过程。
功能:突出比原图轮廓周围更暗的区域。
使用实例:
#include<opencv2/opencv.hpp>
void main()
{
cv::Mat image = cv::imread("Fig0926(a)(rice).tif");
cv::namedWindow("SourceImage");
cv::namedWindow("OutputImage");
cv::imshow("SourceImage", image);
//形态学梯度(MORPH_GRADIENT)
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(10, 10));
cv::morphologyEx(image, image, cv::MORPH_BLACKHAT, element);
cv::imshow("OutputImage", image);
cv::waitKey(0);
}
查看一下morphologyEx源代码:
void cv::gpu::morphologyEx(const GpuMat& src, GpuMat& dst, int op, const Mat& kernel, GpuMat& buf1, GpuMat& buf2, Point anchor, int iterations, Stream& stream)
{
switch( op )
{
case MORPH_ERODE: erode(src, dst, kernel, buf1, anchor, iterations, stream); break;
case MORPH_DILATE: dilate(src, dst, kernel, buf1, anchor, iterations, stream); break;
case MORPH_OPEN:
erode(src, buf2, kernel, buf1, anchor, iterations, stream);
dilate(buf2, dst, kernel, buf1, anchor, iterations, stream);
break;
case CV_MOP_CLOSE:
dilate(src, buf2, kernel, buf1, anchor, iterations, stream);
erode(buf2, dst, kernel, buf1, anchor, iterations, stream);
break;
case CV_MOP_GRADIENT:
erode(src, buf2, kernel, buf1, anchor, iterations, stream);
dilate(src, dst, kernel, buf1, anchor, iterations, stream);
subtract(dst, buf2, dst, GpuMat(), -1, stream);
break;
case CV_MOP_TOPHAT:
erode(src, dst, kernel, buf1, anchor, iterations, stream);
dilate(dst, buf2, kernel, buf1, anchor, iterations, stream);
subtract(src, buf2, dst, GpuMat(), -1, stream);
break;
case CV_MOP_BLACKHAT:
dilate(src, dst, kernel, buf1, anchor, iterations, stream);
erode(dst, buf2, kernel, buf1, anchor, iterations, stream);
subtract(buf2, src, dst, GpuMat(), -1, stream);
break;
default:
CV_Error(CV_StsBadArg, "unknown morphological operation");
}
}
可以发现,这个函数使用了一个大的switch实现了多种形态学滤波的调用。
C++: void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );
MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT -形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“)
另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。