Python OpenCV形态学运算示例详解


Posted in Python onApril 07, 2022

1. 腐蚀 & 膨胀

1.1什么是腐蚀&膨胀

腐蚀&膨胀是图像形态学中的两种核心操作

腐蚀可以描述为是让图像沿着自己的边界向内收缩

而膨胀则刚好与收缩相反,可以描述为是让图像沿着边界向内扩张。

这两种操作的逻辑和作用都和上篇讲到的使用滤波器做平滑处理有些类似,不同之处在于,腐蚀求的是滤波核内像素的最小值,而膨胀求的是最大值。并将计算出的值复制给锚点位置的像素。

作用上同平滑处理类似,可以消除噪声。

因为腐蚀求的是最小值,膨胀求的是最大值,所以经过腐蚀操作的图像的总体亮度会有所降低,而经过膨胀操作的图像的总体亮度会有所升高。

为方便示例,准备以下图片素材(test1.jpg):

Python OpenCV形态学运算示例详解

1.2 腐蚀方法 cv2.erode()

python中OpenCV使用cv2.erode()方法实现腐蚀操作。

该方法语法如下:

cv2.erode(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)

  • scr 原图像
  • kernel 腐蚀要用到的核
  • anchor 锚点
  • iterations 可选参数,腐蚀操作的迭代次数,默认为1。
  • borderType 边界样式,可选。
  • borderValue 边界值,可选。

其中kernel这个参数,核,需要手动取创建一个数组,而不能是像滤波器那样指定一个大小。

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 创建3*3的数组作为滤波核
k = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

腐蚀效果如下,如图,我们的鱼骨显得年代更久远了,鱼刺消失、变暗了相当一部分。

Python OpenCV形态学运算示例详解

1.3 膨胀方法 cv2.dilate()

python中OpenCV使用cv2.dilate()方法实现膨胀操作。

该方法语法如下:

dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

可以看出,其参数用法同cv2.erode()的参数。

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 创建16*16的数组作为核
k = np.ones((16, 16), np.uint8)
dst = cv2.dilate(img, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

膨胀效果如下,如图所示,图片众多鱼的亮度明显变高了。

Python OpenCV形态学运算示例详解

这种图像效果,也被称之为“近视眼”效果。

2. 开运算 & 闭运算

2.1 简述

开运算就是将图像先进性腐蚀操作,再进行膨胀操作。其可以用来抹除图像外部的细节(噪声)。

闭运算则与之相反

闭运算是先对图像进行膨胀操作,在进行腐蚀操作。其可以用来抹除图像的内部细节(噪声)。

腐蚀和膨胀虽然是逆操作,但是开运算和闭运算都不会使图像恢复原状。

2.2 开运算

以 3 为核

代码示例如下

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
k = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, k)
dst = cv2.dilate(dst, k)
cv2.imshow("dst", dst)
cv2.waitKey()  
cv2.destroyAllWindows()

Python OpenCV形态学运算示例详解

2.3 闭运算

以 10 为核

代码示例如下

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
k = np.ones((10, 10), np.uint8)
dst = cv2.dilate(img, k)
dst = cv2.erode(dst, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

Python OpenCV形态学运算示例详解

3. morphologyEx()方法

3.1 morphologyEx()方法 介绍

在python中OpenCV还提供了morphologyEx()方法(形态学方法),可以用来完成所有常用的形态学运算。

morphologyEx()语法如下:

morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

其中

  • scr 表示图像
  • op 表示操作类型
  • kernel 表示 核
  • anchor 表示锚点
  • iterations 为迭代次数,默认为1
  • borderType 是边界样式,默认1
  • borderValue 是边界值,默认1

可以供op选择的操作类型有:

参数值 描述
cv2.MORPH_ERODE 腐蚀
cv2.MORPH_DILATE 膨胀
cv2.MORPH_ OPEN 开运算,先腐蚀后膨胀
cv2.MORPH_CLOSE 闭运算,先膨胀后腐蚀
cv2.MORPH_GRADIENT 梯度运算,膨胀图减腐蚀图
cv2.MORPH_TOPHAT 顶帽运算,原始图减开运算图
cv2.MORPH_BLACKHAT 黑帽运算,闭运算图,减开运算图

接下来我们使用图片"test2.jpg"(下图)来继续下边的示例:

Python OpenCV形态学运算示例详解

3.2 梯度运算

对“test2.jpg”以 4 为核做梯度运算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")  
k = np.ones((4, 4), np.uint8)  
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k) 
cv2.imshow("dst", dst)  
cv2.waitKey()  
cv2.destroyAllWindows()

梯度运算,即膨胀图减去腐蚀图,因为膨胀运算得到的图像中我物体比原图中的“大”,而腐蚀运算得到的图像中的物体是收缩过的,比原图中的“小”,所以膨胀的结果减去腐蚀的结果,会得到一个大概的、不精准的轮廓。

test2.jpg梯度运算执行效果如下:

Python OpenCV形态学运算示例详解

3.3 顶帽运算

对“test2.jpg”以 4 为核做顶帽运算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")
k = np.ones((4, 4), np.uint8)
cv2.imshow("img", img)
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

顶帽运算,即原图减去开运算图,因为开运算抹除了图像的外部细节,所以顶帽运算即“有外部细节的图像 减去 无外部细节的图像”,得到的结果也就只剩外部细节了。

顶帽运算处理效果如下:

Python OpenCV形态学运算示例详解

3.4 黑帽运算

对“test2.jpg”以 4 为核做顶帽运算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")
k = np.ones((4, 4), np.uint8)
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

黑帽运算,即原图像的闭运算减去原图像

因为闭运算可以抹除图像的内部细节,所以黑帽运算即 “无内部细节的图像减去有内部细节的图像”,结果只剩下内部细节。

黑帽运算处理效果如下:

Python OpenCV形态学运算示例详解

以上就是Python OpenCV形态学运算示例详解的详细内容,更多关于Python OpenCV形态学运算的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用python分割TXT文件成4K的TXT文件
May 23 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
python 上下文管理器使用方法小结
Oct 10 Python
python2.7到3.x迁移指南
Feb 01 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Python3编码问题 Unicode utf-8 bytes互转方法
Oct 26 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
python里运用私有属性和方法总结
Jul 08 Python
django实现支付宝支付实例讲解
Oct 17 Python
Python 生成短8位唯一id实战教程
Jan 13 Python
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Python OpenCV之常用滤波器使用详解
python Tkinter模块使用方法详解
You might like
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
Python random模块常用方法
2014/11/03 Python
Python中暂存上传图片的方法
2015/02/18 Python
Ubuntu下安装PyV8
2016/03/13 Python
Python内存读写操作示例
2018/07/18 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
大三学习计划书范文
2014/05/02 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers
box-shadow单边阴影的实现
2023/05/21 HTML / CSS