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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
使用python加密自己的密码
Aug 04 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
python 连接sqlite及简单操作
Jun 30 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
win10安装python3.6的常见问题
Jul 01 Python
Python3爬虫中Ajax的用法
Jul 10 Python
python 多线程中join()的作用
Oct 29 Python
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Python OpenCV之常用滤波器使用详解
python Tkinter模块使用方法详解
You might like
windows7下php开发环境搭建图文教程
2015/01/06 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Python测试线程应用程序过程解析
2019/12/31 Python
python实现简单飞行棋
2020/02/06 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
材料物理专业个人求职信
2013/12/15 职场文书
关于爱情的广播稿
2014/01/16 职场文书
自荐信如何制作?
2014/02/21 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
委托证明范本
2014/11/25 职场文书