OpenCV (iOS)中的腐蚀和膨胀(9)

2017-05-04  本文已影响204人  傻傻小萝卜

膨胀和腐蚀

如实对膨胀和腐蚀不了解需要先看一下这篇文章,了解图像处理 腐蚀 膨胀 细化

膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的.

① 膨胀

是以得到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);

}

效果(其中的一种)

参考资料

OpenCV for iOS 学习笔记(八)—— 腐蚀与膨胀(Eroding and Dilating)

腐蚀与膨胀(Eroding and Dilating)

图像处理 腐蚀 膨胀 细化

上一篇 下一篇

猜你喜欢

热点阅读