腐蚀与膨胀
功能:
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
膨胀
对图像中的高亮部分进行膨胀,效果图拥有比原图更大的高亮区域。即白色部分。
void dilate(
InputArray src, //输入
OutputArray dst, //输出
InputArray kernel, //核
Point anchor=Point(-1,-1), //锚
int iterations=1, //迭代次数
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
核kernel若为null,则表示用参考点在中心的3*3的核
一般使用getStructuringElement函数配合使用
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, //内核形状:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形:(MORPH_ELLIPSE)
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1), //内核尺寸
Point( g_nStructElementSize, g_nStructElementSize ) //瞄点位置
);
代码示例
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行膨胀操作
dilate(image, out, element);
腐蚀
和膨胀类似。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
代码示例
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行腐蚀操作
erode(image,out, element);
高级形态学变换
void morphologyEx(
InputArray src,
OutputArray dst,
int op, //形态学运算类型。MORPH_OPEN(开运算)、MORPH_CLOSE(闭运算)、MORPH_GRADIENT(形态学梯度)、MORPH_TOPHAT(“顶帽”)、MORPH_BLACKHAT(“黑帽”) InputArray kernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue()
);
和腐蚀与膨胀类似,morphologyEx函数通过改变op参数即可实现对图像的开闭梯度黑帽顶帽运算。 开运算:对图像先腐蚀再膨胀,可以排除小团块物体 闭运算:对图像先膨胀再腐蚀,可以排除小型黑洞 形态梯度:膨胀图与腐蚀图之差,可以保留边缘轮廓 顶帽:原图与开运算的差 黑帽:闭运算与原图的差
int main( )
{
Mat image = imread("1.jpg");
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_BLACKHAT, element);
//显示效果图
namedWindow("【效果图】黑帽运算");
imshow("【效果图】黑帽运算", image);
waitKey(0);
return 0;
}