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 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
python实现人民币大写转换
Jun 20 Python
Django中多种重定向方法使用详解
Jul 17 Python
Python循环实现n的全排列功能
Sep 16 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
python 如何用map()函数创建多线程任务
Apr 07 Python
详解Python描述符的工作原理
Jun 11 Python
4种方法python批量修改替换列表中元素
Apr 07 #Python
Python+OpenCV实现图片中的圆形检测
Python中文分词库jieba(结巴分词)详细使用介绍
基于Python实现对比Exce的工具
Apr 07 #Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Python OpenCV之常用滤波器使用详解
python Tkinter模块使用方法详解
You might like
php实现二进制和文本相互转换的方法
2015/04/18 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php生成动态验证码gif图片
2015/10/19 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python去掉行尾的换行符方法
2017/01/04 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
python的sorted用法详解
2019/06/25 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
python图形用户接口实例详解
2019/12/16 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
Django-imagekit的使用详解
2020/07/06 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
课前三分钟演讲稿
2014/04/24 职场文书