Python OpenCV形态学运算示例详解
作者:侯小啾 发布时间:2022-03-04 12:23:39
1. 腐蚀 & 膨胀
1.1什么是腐蚀&膨胀
腐蚀&膨胀是图像形态学中的两种核心操作
腐蚀可以描述为是让图像沿着自己的边界向内收缩
而膨胀则刚好与收缩相反,可以描述为是让图像沿着边界向内扩张。
这两种操作的逻辑和作用都和上篇讲到的使用滤波器做平滑处理有些类似,不同之处在于,腐蚀求的是滤波核内像素的最小值,而膨胀求的是最大值。并将计算出的值复制给锚点位置的像素。
作用上同平滑处理类似,可以消除噪声。
因为腐蚀求的是最小值,膨胀求的是最大值,所以经过腐蚀操作的图像的总体亮度会有所降低,而经过膨胀操作的图像的总体亮度会有所升高。
为方便示例,准备以下图片素材(test1.jpg):
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()
腐蚀效果如下,如图,我们的鱼骨显得年代更久远了,鱼刺消失、变暗了相当一部分。
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()
膨胀效果如下,如图所示,图片众多鱼的亮度明显变高了。
这种图像效果,也被称之为“近视眼”效果。
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()
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()
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"(下图)来继续下边的示例:
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梯度运算执行效果如下:
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()
顶帽运算,即原图减去开运算图,因为开运算抹除了图像的外部细节,所以顶帽运算即“有外部细节的图像 减去 无外部细节的图像”,得到的结果也就只剩外部细节了。
顶帽运算处理效果如下:
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()
黑帽运算,即原图像的闭运算减去原图像
因为闭运算可以抹除图像的内部细节,所以黑帽运算即 “无内部细节的图像减去有内部细节的图像”,结果只剩下内部细节。
黑帽运算处理效果如下:
来源:https://blog.csdn.net/weixin_48964486/article/details/123870336


猜你喜欢
- 当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?使用type()首先,我们来判断对象类型,使用type()函数:基本类
- 今天闲逛在网上时,看到一个11px大小的字体,显示却很清晰,赶紧查看站点的CSS,这字体称叫做:PMingLiu。效果相当不错,相比于我们使
- OpenCV 对象跟踪这篇文章使用 OpenCV 中内置的八种不同的对象跟踪算法,实现对物体的跟踪。首先,介绍一下8种跟踪算法。然后,演示如
- 前言最近完整地看了一遍TypeScript的官方文档,发现文档中有一些知识点没有专门讲解到,或者是讲解了但却十分难以理解,因此就有了这一系列
- 阅读前:Pro Javascript Techniques翻译连载说明和目录JavaScript的演化是渐进而稳固的。历经过去十年的进程,J
- 一、注册自定义指令以下实例都是实现一个输入框自动获取焦点的自定义指令。1.1、全局自定义指令在vue2中,全局自定义指令通过 directi
- 应该是很方便的了,支持几乎所有主流浏览器(ie5,6,7,8;ff;傲游;Opera)已更新至可提交录入内容<script type=
- let str = '这是一个字符串[html]语句;[html]字符串很常见';alert(str.replace(/\[
- 申明本博客不提供任何服务器端程序,也不提供任何收费抢购软件。该博客仅用于学习selenium自动化工具。如有侵犯到任何公司的合法权益,请私信
- 截图源码Translator.py#!/usr/bin/python# -*- coding: UTF-8 -*-from copy imp
- python共有两种浅拷贝的方法,一个是python的内置函数copy(),另一个是copy模块中的copy.copy()。python的六
- 由于最近有个任务需要在python环境下跑,项目是python3.6 + tensorflow1.3.1.现总结安装环境:卸载Python3
- 引子:在windows中python3使用 pycryptodemo 模块实现Aes加密解密。Aes加密有多种方式,自己可以上网了解下。 A
- 简介:type() 函数可以对数据的类型进行判定。isinstance() 与 type() 区别:type() 不会认为子类是一种父类类型
- 发帖或者回帖的时候,系统会提示银两或经验增加的效果,慢慢出现又慢慢消失,用于取代对话框的那种是如何实现的?用google的jquery ap
- 一年一度的春运又来了,今年我自己写了个抢票脚本。使用Python+Splinter自动刷新抢票,可以成功抢到。(依赖自己的网络环境太厉害,还
- 本文实例讲述了Python多进程multiprocessing、进程池用法。分享给大家供大家参考,具体如下:内容相关:multiproces
- python删除缓存文件的方法:首先输入“find.-name '__pycache__' -type d -exec rm
- 本文实例为大家分享了python放大图片和画方格的具体代码,供大家参考,具体内容如下1、Python 放大图片和画方格算法#!C:/Pyth
- 本文实例讲述了MySQL查看、创建和删除索引的方法。分享给大家供大家参考。具体如下:1.索引作用在索引列上,除了上面提到的有序查找之外,数据