千家信息网

Python OpenCV形态学运算示例分析

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,今天小编给大家分享一下Python OpenCV形态学运算示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获
千家信息网最后更新 2025年02月23日Python OpenCV形态学运算示例分析

今天小编给大家分享一下Python OpenCV形态学运算示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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 cv2import numpy as npimg = 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形态学运算示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

运算 图像 方法 细节 效果 顶帽 示例 原图 边界 形态 形态学 参数 梯度 知识 篇文章 结果 处理 亮度 噪声 图片 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 饥荒独立服务器 设置管理员 网络安全口诀教学 如何备份数据库表中的指定字段 安徽省网络安全小组会议 人物可以转移到其他服务器吗 怎么把数据库复制发给别人 服务器虚拟化技术比较 tomcat的数据库配置 邵阳服务器维保 小学生家庭教育与网络安全1 iis服务器 php 暗黑2重置战网无法找到服务器 不正常关机后SQL数据库坏了 时空数据库与传统数据库的差异 新吴区软件开发设计规范 阿里云服务器注册淘宝店 学习通连接服务器失败请稍后重试 我的世界服务器禁止tnt指令 利诺网络安全 网络安全攻击主要分为哪五种 永川区舰拓网络技术有限公司 二维码生产软件开发 易数据库查找怎么用 运输数据库设计 虚拟网络技术应用技术 数据库连接驱动是什么 计算机网络技术第一章 软件开发案例图片 中国技术期刊数据库工业c 在家怎么使用学校里的数据库
0