膨胀和腐蚀
如实对膨胀和腐蚀不了解需要先看一下这篇文章,了解图像处理 腐蚀 膨胀 细化
膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的.
① 膨胀
是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的.A被B膨胀是所有位移z的集合,这样,和A至少有一个元素是重叠的.我们可以把上式改写为:
结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的.
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为0,结果图像的该像素为0.否则为1
② 腐蚀
对Z中的集合A和B,B对A进行腐蚀的整个过程如下:
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为1,结果图像的该像素为1.否则为0
腐蚀处理的结果是使原来的二值图像减小一圈.
⑷ 击中(匹配)或击不中变换
他们的运用广泛:
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
OpenCV中函数介绍(erode and dilate)腐蚀与膨胀
erode
erode(InputArray src,// 原图像
OutputArray dst,// 输出图像// 腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。// 否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations =1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
)
dilate(参数用途同上)
dilate(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations =1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
)
getStructuringElemen
// 这里 shap 是内核形状,ksize 是内核大小,anchor是锚点位置
Mat getStructuringElement(
int shape,
Size ksize,
Point anchor= Point(-1,-1)
)
shap 有三种形状
矩形:MORPH_RECT
交叉形:MORPH_CROSS
椭圆形:MORPH_ELLIPSE
代码实现
腐蚀
- (void)eroding
{
int erosion_type;
/// dilation_elem 全局变量 int 型,用来控制选择的内核形状
if(dilation_elem == 0) {
erosion_type = MORPH_RECT; // 矩形
} else if(dilation_elem == 1) {
erosion_type = MORPH_CROSS; // 十字
} else {
erosion_type = MORPH_ELLIPSE; // 圆形
}
/// 指定内核 erosion_size 全局变量 我这里用的是 Slider.value 来控制 erosion_size 的
Mat element = getStructuringElement(erosion_type, cv::Size(2*erosion_size+1,2*erosion_size+1),cv::Point(erosion_size,erosion_size));
// 腐蚀操作
erode(src, dst, element);
self.secondImageView.image = MatToUIImage(dst);
}
效果图(其中一种)
膨胀
- (void)diating
{
int erosion_type;
/// dilation_elem 全局变量 int 型,用来控制选择的内核形状
if(dilation_elem == 0) {
erosion_type = MORPH_RECT; // 矩形
} else if(dilation_elem == 1) {
erosion_type = MORPH_CROSS; // 十字
} else {
erosion_type = MORPH_ELLIPSE; // 圆形
}
/// 指定内核 erosion_size 全局变量 我这里用的是 Slider.value 来控制 erosion_size 的
Mat element = getStructuringElement(erosion_type, cv::Size(2*erosion_size+1,2*erosion_size+1),cv::Point(erosion_size,erosion_size));
// 膨胀操作
dilate(src, dst, element);
self.secondImageView.image = MatToUIImage(dst);
}
效果(其中的一种)
参考资料