第七章形态学处理总结

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)
#结构元半径
r = 1
Max_R = 20
#显示膨胀效果窗口
cv2.namedWindow("dilate",1)
#创建回调函数
def nothing(*arg):pass
#创建结构元半径调整条
cv2.createTrackbar("r","dilate",r,Max_R,nothing)
while True:#得到当前的r值r = cv2.getTrackbarPos('r','dilate')#创建结构元s = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*r+1,2*r+1))#若为(1,2*r+1),则只有垂直方向发生变化,水平方向不变#膨胀图像d = cv2.dilate(I,s)#显示膨胀效果cv2.imshow("dilate",d)ch = cv2.waitKey(5)#按下Esc退出if ch==27:break
cv2.destroyAllWindows()#r=3不错 plt打印一下吧
r1 = 3
s1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*r1+1,2*r1+1))
d1 = cv2.dilate(I,s1)
plt.subplot(1,2,1)
plt.imshow(I)
plt.subplot(1,2,2)
plt.imshow(d1)
plt.show()

7.3_开闭运算

通过将腐蚀与膨胀进行先后组合,也就是开,闭运算。

  • 开运算:先腐蚀后膨胀,消除高亮细节,消除暗处的较亮区域。对较大物体可不改变面积情况下平滑边界。

  • 闭运算:先膨胀后腐蚀,填充亮处的黑色区域。同一个结构元,多次迭代处理可在不改变面积情况下平滑边界。

cv2.morphologyEx(src,op,element[, dst[, anchor[, iterations[, borderType[,borderValue]]]]])
op:

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

增加调节结构元半径进度条与迭代次数进度条

开运算

#-*- coding:utf-8 -*-
import sys
import cv2
import matplotlib.pyplot as plt
I_open = cv2.imread("open.jpg",0)
cv2.imshow("I_open",I_open)
#结构元半径与迭代次数调节条
r,i=1,1
MAX_R,MAX_I = 20,20
cv2.namedWindow("morphology",1)
def nothing(*arg):pass
cv2.createTrackbar("r","morphology",r,MAX_R,nothing)
cv2.createTrackbar("i","morphology",i,MAX_I,nothing)
while True:r = cv2.getTrackbarPos("r","morphology")i = cv2.getTrackbarPos("i","morphology")s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*r+1,2*r+1))#形态学处理d_open = cv2.morphologyEx(I_open,cv2.MORPH_OPEN,s,iterations=i)cv2.imshow("morphology",d_open)ch = cv2.waitKey(5)if ch ==27:break
cv2.destroyAllWindows()#r=3,iterations=5不错
plt.subplot(1,2,1)
plt.imshow(I_open)
plt.subplot(1,2,2)
s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*3+1,2*3+1))
d_open = cv2.morphologyEx(I_open,cv2.MORPH_OPEN,s,iterations=5)
plt.imshow(d_open)
plt.show()


开运算,暗处中间高亮被消除

#-*- coding:utf-8 -*-
import sys
import cv2
import matplotlib.pyplot as plt
I_close = cv2.imread("open.jpg",0)
cv2.imshow("I_close",I_close)
#结构元半径与迭代次数调节条
r,i=1,1
MAX_R,MAX_I = 20,20
cv2.namedWindow("morphology",1)
def nothing(*arg):pass
cv2.createTrackbar("r","morphology",r,MAX_R,nothing)
cv2.createTrackbar("i","morphology",i,MAX_I,nothing)
while True:r = cv2.getTrackbarPos("r","morphology")i = cv2.getTrackbarPos("i","morphology")s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*r+1,2*r+1))#形态学处理d_close = cv2.morphologyEx(I_close,cv2.MORPH_CLOSE,s,iterations=i)cv2.imshow("morphology",d_close)ch = cv2.waitKey(5)if ch ==27:break
cv2.destroyAllWindows()#r=5,i=3不错,打印一下
plt.subplot(1,2,1)
plt.imshow(I_close)
plt.subplot(1,2,2)
s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*5+1,2*5+1))
d_close = cv2.morphologyEx(I_close,cv2.MORPH_CLOSE,s,iterations=3)
plt.imshow(d_close)
plt.show()


闭运算,高亮中间暗处被消除

7.4_其他形态学操作

其他形态学操作:

  • 白顶帽变换(cv2.MORPH_TOPHAT): 图像减去开运算,得到被消除高亮区域。

  • 黑底帽变换(cv2.MORPH_BLACKHAT):图像减去闭运算,得到被消除的暗部区域。

  • 形态学梯度变换(cv2.MORPH_GRADIENT):膨胀减去腐蚀,得到物体边界。(边缘检测)

import cv2
import matplotlib.pyplot as plt
I = cv2.imread("open.jpg",0)
cv2.imshow("I",I)r,i = 1,1
MAX_R,MAX_I = 20,20
cv2.namedWindow("morphology",1)
def nothing(*arg):pass
cv2.createTrackbar("r","morphology",r,MAX_R,nothing)
cv2.createTrackbar("i","morphology",i,MAX_I,nothing)
while True:r = cv2.getTrackbarPos("r","morphology")i = cv2.getTrackbarPos("i","morphology")s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*r+1,2*r+1))d_TOPHAT = cv2.morphologyEx(I,cv2.MORPH_TOPHAT,s,iterations=i)d_BLACKHAT = cv2.morphologyEx(I,cv2.MORPH_BLACKHAT,s,iterations=i)d_GRADIENT = cv2.morphologyEx(I,cv2.MORPH_GRADIENT,s,iterations=i)cv2.imshow("TOPHAT",d_TOPHAT)cv2.imshow("BLACKHAT",d_BLACKHAT)cv2.imshow("GRADIENT",d_GRADIENT)ch = cv2.waitKey(5)if ch == 27:break
cv2.destroyAllWindows()#r=5,i=3时,顶帽,底帽效果出的好
s = cv2.getStructuringElement(cv2.MORPH_RECT,(2*5+1,2*5+1))
d_TOPHAT = cv2.morphologyEx(I,cv2.MORPH_TOPHAT,s,iterations=3)
d_BLACKHAT = cv2.morphologyEx(I,cv2.MORPH_BLACKHAT,s,iterations=3)
#r=1,i=1时,形态学梯度使边缘出现明显
d_GRADIENT = cv2.morphologyEx(I,cv2.MORPH_GRADIENT,cv2.getStructuringElement(cv2.MORPH_RECT,(2*1+1,2*1+1)),iterations=1)
titles = ["I","TOPHAT","BLACKHAT","GRADIENT"]
images = [I,d_TOPHAT,d_BLACKHAT,d_GRADIENT]
for i in range(4):plt.subplot(2,2,i+1)plt.title(titles[i])plt.imshow(images[i])
plt.show()


白顶帽显示暗部高亮,黑底部显示高亮暗部。形态学梯度显示边缘检测。

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

  1. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  2. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  3. Simhash算法详解及python实现

    Simhash算法详解及python实现 GoogleMoses Charikar发表的一篇论文"detecting near-duplicates for web crawling&quo ...

  4. 利用python处理dna序列_详解基于python的全局与局部序列比对的实现(DNA)

    程序能实现什么 a.完成gap值的自定义输入以及两条需比对序列的输入 b.完成得分矩阵的计算及输出 c.输出序列比对结果 d.使用matplotlib对得分矩阵路径的绘制 一.实现步骤 1.用户输入步 ...

  5. kmeans算法详解和python代码实现

    kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...

  6. python selenium爬虫_详解基于python +Selenium的爬虫

    详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...

  7. AdaBoost算法详解与python实现

    AdaBoost算法详解与python实现 https://tangshusen.me/2018/11/18/adaboost/

  8. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  9. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  10. RRT(Rapidly-Exploring Random Trees)算法详解及python实现

    RRT(Rapidly-Exploring Random Trees)算法详解及python实现 前言 一.原理 二.伪代码 三.代码详解 总结 前言 快速探索随机树(RRT):作为一种随机数据结构, ...

最新文章

  1. 语言 全排列 函数_Power Query 中日期时间格式转换需要了解的区域语言对照表
  2. java获取服务器信息吗_java获取服务器一些信息的方法
  3. 整合Hibernate3.x
  4. [BZOJ3203][SDOI2013]保护出题人(凸包+三分)
  5. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析
  6. win7 时间服务器地址修改,win7 时间服务器地址修改
  7. 圆形体癣是什么样子的图片_这是高手!只用一个「圆形」,也能做出高大上的PPT!...
  8. 怎样用matlab拟合,怎么用用matlab拟合两条直线
  9. php中的refresh,PHP mysqli_refresh() 函数用法及示例
  10. C语言输出平行四边形,菱形
  11. 快门速度,光圈,感光度
  12. Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接
  13. ASCII码_字符与数字转换等问题
  14. shell脚本中使用sudo的前置条件
  15. C51单片机的压缩BCD码相加程序
  16. 求生之路2 服务器 修改难度,《求生之路2》服务器指令及难度参数设置难度篇.pdf...
  17. 有关/mnt/asec /mnt/secure文件夹及app2sd原理
  18. CHIL-SQL-UNIQUE 约束
  19. 【微信小程序】悬浮按钮
  20. HashMap的时间复杂度分析

热门文章

  1. 机器学习【系列】之第六章随机森林模型
  2. redis数据库实例
  3. 【电子技术基础(精华版)】整流与滤波电路
  4. Embedded ProC(嵌入式ProC)与Tuxedo中间件
  5. 秒杀或游戏让电脑时间与阿里淘宝时间同步的完整方法
  6. 【Multisim仿真】双向晶闸管功能演示
  7. css 日语字体,css字体
  8. 系统签名文件pk8x509.pem 转成jks或者keystore签名文件
  9. 蓝桥杯官网 试题 PREV-274 历届真题 分果果【第十二届】【省赛】【研究生组】【C++】【Java】两种解法
  10. Foobar2000的配置及优化