《OpenCV算法精解——基于Python与C++》第七章形态学处理

第七章形态学处理总结

Github地址
形态学处理主要对图像处理,提取高亮区域的暗部,提取暗部区域的高光。

基础构建结构元element:

  • element = cv2.getStructuringElement(shape,ksize)
  • shape: cv2.MORPH_RECT(矩形),cv2.MORPH_ELLIPSEM(椭圆形),cv2.MORPH_CROSS(十字交叉形)

7.1_腐蚀:领域最小灰度做输出灰度。图像亮度降低。亮度区域减小。

  • dst = cv2.erode(src,element,iterations迭代次数)

7.2_膨胀:领域最大灰度做输出灰度。图像亮度提高。亮度区域增加。

  • dst = cv2.dilate(src,element,iterations)

7.3/7.4_开运算&闭运算&白顶帽&黑底帽&形态学梯度

  • 开运算: erode * dilate,消除暗部高亮区域,不改变面积情况下平滑边界

  • 闭运算:dilate * erode,消除高光部分的暗部,多次迭代处理不改变面积情况平滑边界

  • 白顶帽:src - open,得到暗部被消除的高光

  • 黑底帽:src - close,得到高光消除的暗部

  • 形态学梯度:dilate - erode,边缘检测作用

  • dst = cv2.morphologyEx(src,op,element)

    • MORPH_OPEN:开运算
    • MORPH_CLOSE:闭运算
    • MORPH_TOPHAT:顶帽运算
    • MORPH_BLACKHAT:底帽运算
    • MORPH_GRADIENT:梯度运算

7.3还介绍了OpenCV用调节条实时调节结构元半径&迭代次数

7.1_腐蚀erode

本章形态学用来优化分割区域的形状以达到更好的效果。

腐蚀:原理同中值平滑,但选取领域内最小值作为输出灰度。总体亮度平均值会降低。

  • erode(src,element[, dst[, anchor锚点[, iterations迭代次数[, borderType边界扩充类型镜像最好[, borderValue]]]]])

仅需要调节element结构元,与iterations迭代次数即可,其他默认

element为结构元,有三种形状:cv2.MORPH_RECT(矩形),cv2.MORPH_ELLIPSEM(椭圆形),cv2.MORPH_CROSS(十字交叉形)

  • cv2.getStructuringElement(shape, ksize[, anchor])
#-*- coding:utf-8 -*-
import cv2
import matplotlib.pyplot as plt
I = cv2.imread("img2.jpg",0)

#创建3*3,
s3 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
#腐蚀图像,迭代次数默认为1
r3 = cv2.erode(I,s3)
#边界提取
e3 = I - r3

#7*7尺寸结构元
s7 = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
r7 = cv2.erode(I,s7)
e7 = I - r7 
#11*11尺寸结构元
s11 = cv2.getStructuringElement(cv2.MORPH_RECT,(11,11))
r11 = cv2.erode(I,s11)
e11 = I - r11 

#显示图像和腐蚀后结果,边界提取效果
for i in range(7):
    titles = ["src","dst3","dst7","dst11","edge3","edge7","edge11"]
    images = [I,r3,r7,r11,e3,e7,e11]
    plt.subplot(2,4,i+1)
    plt.title(titles[i])
    plt.imshow(images[i])
plt.show

在这里插入图片描述
效果很好,随着结构元尺寸增加,白色主体腐蚀越多,结构元形状也形如马赛克被凸显出来。

7.2_膨胀dilate

膨胀与腐蚀相反,选择领域最大灰度值作为输出。输出图像亮度平均值上升,亮部主体尺寸变大。

  • cv2.dilate(src, element[, dst[, anchor[, terations[, borderType[, borderValue]]]]])
#-*- coding:utf-8 -*-
import cv2
import matplotlib.pyplot as plt
I = cv2.imread("img2.jpg",0)
cv2.imshow("I",I)
#结
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值