灰值形态学中的腐蚀与膨胀

膨胀与腐蚀一般用于二值图,也很好理解。但是对于灰度图,显然也存在腐蚀与膨胀,这是如何进行的呢?

可以使用OpenCV中的库函数cv2.erode和cv2.dilate,但这次是探究其中的原理。

 

灰值形态学

结构元素(structure element)

$5 \times 5$结构元素示例:

(2)欧几里得距离(Euclidean distance)

01110
12221
12221
12221
01110

(2)城市街区距离(city block distance)

00100
01210
12321
01210
00100

 

(3)棋盘距离(Chess board distance)

11111
12221
12321
12221
11111

 

腐蚀(Erosion)

灰度图像的腐蚀运算的数学定义为:

 $(f\oplus b) = max\{f(s-x,t-y) + b(x,y)|(s-x,t-y) \in D_f;(x,y) \in D_b \}$

即加上权重后取最大值。

膨胀(Dilation)

数学定义:

$(f\circledast  b) = min\{f(s-x,t-y) - b(x,y)|(s-x,t-y) \in D_f;(x,y) \in D_b \}$

即减去权重取最小值

在灰度形态学中,一般选择平坦的结构元素。所谓“平坦”,就是指结构元素的高度为零,即b的值全为0,则上面两个公式可以重写为:

$$(f\oplus  b) = max\{f(s-x,t-y)|(s-x,t-y) \in D_f;(x,y) \in D_b \}$$
$$(f\circledast  b) = min\{f(s-x,t-y)|(s-x,t-y) \in D_f;(x,y) \in D_b \}$$

代码

(写得太丑了)

def my_dilation(img, kernel):
    ret = img.copy()
    l1 = int((kernel.shape[0] - 1) / 2)
    l2 = int((kernel.shape[1] - 1) / 2)
    for i in range(l1,img.shape[0]-l1):
        for j in range(l2,img.shape[1]-l2):
            values = []
            for k1 in range(-l1, l1 + 1):
                for k2 in range(-l2, l2 + 1):
                    v = int(img[i+k1][j+k2]) + int(kernel[k1+l1][k2+l2])
                    if v > 255:
                        v = 255
                    values.append(v)
            ret[i][j] = max(values)
    return ret     

def my_erosion(img, kernel):
    ret = img.copy()
    l1 = int((kernel.shape[0] - 1) / 2)
    l2 = int((kernel.shape[1] - 1) / 2)
    for i in range(l1,img.shape[0]-l1):
        for j in range(l2,img.shape[1]-l2):
            values = []
            for k1 in range(-l1, l1 + 1):
                for k2 in range(-l2, l2 + 1):
                    v = int(img[i+k1][j+k2]) - int(kernel[k1+l1][k2+l2])
                    if v > 255:
                        v = 255
                    values.append(v)
            ret[i][j] = min(values)
    return ret 

 

 

 

参考链接:https://blog.csdn.net/guoyk1990/article/details/8134134

 

转载于:https://www.cnblogs.com/lfri/p/10626563.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值