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的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
python re模块的高级用法详解
Jun 06 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
通用的Django注册功能模块实现方法
Feb 05 Python
Python进程间的通信之语法学习
Apr 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中使用Oracle数据库(2)
2006/10/09 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
python计数排序和基数排序算法实例
2014/04/25 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
python生成器用法实例详解
2019/11/22 Python
python装饰器代替set get方法实例
2019/12/19 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
社区庆中秋节活动方案
2014/02/07 职场文书
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android