美文网首页
OpenCV (iOS)中的腐蚀和膨胀(9)

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

作者: 傻傻小萝卜 | 来源:发表于2017-05-04 15: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)

    图像处理 腐蚀 膨胀 细化

    相关文章

      网友评论

          本文标题:OpenCV (iOS)中的腐蚀和膨胀(9)

          本文链接:https://www.haomeiwen.com/subject/mkurtxtx.html