形态学处理【二】

  • 开操作、闭操作、形态学梯度、顶帽变换、黑帽变换
  • 相关函数有:cv2.morphologyEx()、cv2.getStructuringElement()
  • 有趣的应用:去除皮肤镜中的毛发噪音

一、开操作

  • 开操作(open):先腐蚀后膨胀。

  • 作用

    • 可以去掉小的白噪点,填充小的白洞。
    • 能排除小区域物体、消除孤立点、去噪、平滑物体的轮廓
    • 用于移除一些小物体或者小亮斑点。

如下假设对象是前景色,背景是黑色,腐蚀可把小白点去掉,膨胀又把主对象被腐蚀掉的部分还原回来。

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('open.jpg',1)# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 十字结构# 使用不同结构元素  执行开操作
opening1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel1)
opening2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel2)
opening3 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel3)# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(opening1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(opening2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(opening3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()

可以看出,同大小的结构元素,去除白噪点,使用矩形结构元素效果最佳。当然,去除白点的效果,还跟所选取的结构大小有关。

二、闭操作

  • 闭操作(close):先膨胀后腐蚀(bin2)

  • 作用

    • 可以填充小的黑洞(fill hole补洞),去掉小的黑噪点。
    • 填充目标区域内的离散小空洞和分散部分。

如下假设对象是前景色,背景是黑色.

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('cell.jpg',1)# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10)) # 十字结构# 使用不同结构元素  执行闭操作
closing1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel1)
closing2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel2)
closing3 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel3)# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(closing1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(closing2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(closing3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()

同样可以看出,同大小的结构元素,填补黑点,使用矩形结构元素效果最佳,去除黑点的效果,还跟所选取的结构大小有关。

再比如,去除皮肤镜像中的毛发噪音。

三、形态学梯度

  • 形态学梯度(Gradient):膨胀减去腐蚀,又称为基本梯度。其实就是一幅图像膨胀与腐蚀的差别结果看上去就像前景物体的轮廓。

  • 作用: 边缘提取。对二值图像进行这一操作,可以将团块(blob)的边缘突出出来,保留物体的边缘轮廓。

  • 其它还有内部梯度(原图减去腐蚀)、外部梯度(膨胀减去原图)、方向梯度(x方向和y方向进行计算)

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('tiger.jpg',1)# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) # 矩形结构# 执行梯度操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(121),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(gradient),plt.title('gradient'),plt.xticks([]), plt.yticks([])
plt.show()

越小的结构元素,提取边缘的时候越精细。

四、顶帽

  • 顶帽(top hat):是原图像与开操作之间的差值图像。

  • 原始图像与进行开运算之后得到的图像的差。

  • 作用:显示开操作所去掉的小白噪点

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('open.jpg',1)# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构# 执行开、顶帽操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(opening),plt.title('opening'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(tophat),plt.title('tophat'),plt.xticks([]), plt.yticks([])
plt.show()

五、黑帽

  • 黑帽(black hat):闭操作图像与源图像的差值图像

  • 作用:显示闭操作所填充的小黑洞,或者是闭操作去除的东西

下面,以闭操作中去除的毛发噪音为例,我们使用黑帽将其显示出来

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('cell.jpg',1)# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构# 执行闭、顶帽操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(closing),plt.title('closing'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(blackhat),plt.title('blackhat'),plt.xticks([]), plt.yticks([])
plt.show()

opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())相关推荐

  1. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽

    图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...

  2. 形态学操作——开闭运算、顶帽底(黑)帽变换

    膨胀和腐蚀运算的问题: 边缘形状发生了变化,膨胀发生了扩张,腐蚀发生了收缩 目标物体变形,对识别时的特征提取会造成影响 解决方法: 开操作: B对A的开操作就是先B对A腐蚀,紧接着用B对结果进行膨胀 ...

  3. opencv 膨胀_【3】OpenCV图像处理模块(5)更多的形态学变换(开、闭、形态梯度、顶帽、黑帽)...

    形态学变换有多种类型,上一节展示了最基本的腐蚀和膨胀.本节使用OpenCV提供的 cv::morphologyEx()函数实现多种形态学变换,如开运算.闭运算.形态学梯度.顶帽变换.黑帽变换等. 理论 ...

  4. OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 45 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  5. 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  6. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  7. opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽

    上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上. 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体和 ...

  8. OpenCV 【十八】图像平滑处理/腐蚀与膨胀(Eroding and Dilating)/开闭运算,形态梯度,顶帽,黑帽运算

    图像滤波总结(面试经验总结)https://blog.csdn.net/Darlingqiang/article/details/79507468 目录 part one 图像平滑处理 1原理 2代码 ...

  9. 形态学处理:膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽

    形态学处理 一 膨胀 二 腐蚀 三 开运算 四 闭运算 五 形态学梯度 六 顶帽 七 黑帽 形态学处理 一 膨胀  代码: #include <opencv2/core/core.hpp> ...

最新文章

  1. 云原生时代,Java还是Go?
  2. java高并发(十四)ReetrantLock 与锁
  3. 实现一个通用的中英文排序工具
  4. 科学存储数据格式-HDF5
  5. debian如何安装Let's Encrypt
  6. css --- 行内框和内容区
  7. github怎么切换到gitee_AOSP-RISCV 的开源仓库在 Gitee 上新建了镜像
  8. 上传附件_留学落户|上传附件预审时一定一定要注意的问题!
  9. javascript-阻止默认行为发生
  10. 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
  11. 线程间操作无效: 从不是创建控件“listBox1”的线程访问它
  12. 微信服务号获取地理位置
  13. 世界芯中国芯RISC-V相关资源及进展
  14. 图片裁剪源代码+php,php进行图片裁剪及生成缩略图程序源代码
  15. 使用SQLite打开本地.db文件
  16. linux环境下解压rar文件
  17. 用css给video视频标签上添加渐变效果
  18. post请求将formdata 转json
  19. Javascript vue 数组中的对象分离 获取对象属性名称 对象属性值
  20. POI 设置单元格背景色,背景色编码与实际颜色对照表(SXSSFWorkbook4.1.2)

热门文章

  1. 如何使用 Python 操作 .npy 文件?详细教程分享
  2. 【screen】Linux下screen的使用
  3. java获取图片相对路径_相对路径和绝对路径的区别,java获取项目访问路径的方法...
  4. unity 相同材质不同属性怎么合批
  5. 2020年开春最新面试!今日头条 Android 面试题及答案 (已拿到 offer)
  6. java 怎么让打印信息换行?
  7. 在Linux系统上运行.jnlp文件
  8. C# winfrom NPOI导出Excel 添加视频、音频文件
  9. 计算机视觉——SIFT特征提取与检索
  10. 贝叶斯例题(一)先验分布与后验分布