Python-OpenCV中的图像处理-形态学转换

Python-OpenCV中的图像处理-形态学转换

  • 形态学转换
    • 腐蚀
    • 膨胀
    • 开运算
    • 闭运算
    • 形态学梯度
    • 礼帽
    • 黑帽
    • 形态学操作之间的关系
  • 形态学代码例程

形态学转换

  • 形态学操作:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽等
  • 主要涉及函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx()
  • 原理:形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。

腐蚀

就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。这回产生什么影响呢?根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(img, kernel=kernel, iterations=1)plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(erosion, cv2.COLOR_BGR2RGB)), plt.title('erode'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

膨胀

与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。

import numpy as np
import cv2
from matplotlib import pyplot as plt# 膨胀
img = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Original_Image.png', cv2.IMREAD_GRAYSCALE)kernel = np.ones((5,5), np.uint8)
dilation = cv2.dilate(img, kernel=kernel, iterations=1)plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(dilation, cv2.COLOR_BGR2RGB)), plt.title('dilate'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

开运算

先腐蚀再膨胀就叫做开运算。它被用来去除噪声。这里我们用到的函数是 cv2.morphologyEx()
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

闭运算

先膨胀再腐蚀就叫做闭运算。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

形态学梯度

其实就是一幅图像膨胀与腐蚀的差别,结果看上去就像前景物体的轮廓。
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

礼帽

原始图像与进行开运算之后得到的图像的差。下面的例子是用一个 9x9 的核进行礼帽操作的结果。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽

进行闭运算之后得到的图像与原始图像的差
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

形态学操作之间的关系

形态学转换

  • Opening:
    dst = open(src, element) = dilate(erode(src, element), element)
  • Closing:
    dst = close(src, element) = erode(dilate(src, element), element)
  • Morphological gradient:
    dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)
  • “Top hat”:
    dst = tophat(src, element) = src - open(src, element)
  • “Black hat”:
    dst = blackhat(src, element) = close(src, element) - src

形态学代码例程

import numpy as np
import cv2
from matplotlib import pyplot as plt'''
形态学转换
Opening: dst = open(src, element) = dilate(erode(src, element), element)Closing:dst = close(src, element) = erode(dilate(src, element), element)Morphological gradient:dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)"Top hat":dst = tophat(src, element) = src - open(src, element)"Black hat":dst = blackhat(src, element) = close(src, element) - src
'''# 开运算
# 先进行腐蚀在进行膨胀叫做开运算。用来去除噪音
# opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 闭运算
# 先进行膨胀再进行腐蚀叫做闭运算。用来填充前景物体中的小洞,或者全景上的小黑点。
# closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 形态学梯度
# 就是一副图像膨胀与腐蚀的差别,结果看上去就像前景物体的轮廓。
# gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 礼帽
# 原始图像与进行开运算之后得到的图像的差
# tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)# 黑帽
# 原始图像与进行闭运算之后得到的图像的差
# blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 结构化元素
kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))       # 矩形核
kernel_elli = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))    # 椭圆核
kernel_cros = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))      # 十字核# 卷积核
# kernel = kernel_rects
# kernel = kernel_elli
# kernel = kernel_cros
kernel = np.ones((5,5), np.uint8)
kernel9x9 = np.ones((15,15), np.uint8)img_origin = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_COLOR)
img_gray = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_GRAYSCALE)# 开运算 腐蚀=>膨胀
opening = cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)# 闭运算 膨胀=>腐蚀
closing = cv2.morphologyEx(img_gray, cv2.MORPH_CLOSE, kernel)# 梯度 膨胀-腐蚀 
gradient = cv2.morphologyEx(img_gray, cv2.MORPH_GRADIENT, kernel)# 礼帽  原始图像与进行开运算之后得到的图像的差
tophat = cv2.morphologyEx(img_gray, cv2.MORPH_TOPHAT, kernel9x9)# 黑帽 进行闭运算之后与原始图像的图像的差
blackhat = cv2.morphologyEx(img_gray, cv2.MORPH_BLACKHAT, kernel9x9)# 腐蚀
erosion = cv2.erode(img_gray, kernel=kernel, iterations=1)# 膨胀 
dilation = cv2.dilate(img_gray, kernel=kernel, iterations=1)plt.subplot(331), plt.imshow(cv2.cvtColor(img_origin,cv2.COLOR_BGR2RGB), 'gray'), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(332), plt.imshow(img_gray, 'gray'), plt.title('gray'), plt.xticks([]), plt.yticks([])
plt.subplot(333), plt.imshow(opening, 'gray'), plt.title('open'), plt.xticks([]), plt.yticks([])
plt.subplot(334), plt.imshow(closing, 'gray'), plt.title('close'), plt.xticks([]), plt.yticks([])
plt.subplot(335), plt.imshow(gradient, 'gray'), plt.title('gradient'), plt.xticks([]), plt.yticks([])
plt.subplot(336), plt.imshow(tophat, 'gray'), plt.title('tophat'), plt.xticks([]), plt.yticks([])
plt.subplot(337), plt.imshow(blackhat, 'gray'), plt.title('blackhat'), plt.xticks([]), plt.yticks([])
plt.subplot(338), plt.imshow(erosion, 'gray'), plt.title('erode'), plt.xticks([]), plt.yticks([])
plt.subplot(339), plt.imshow(dilation, 'gray'), plt.title('dilate'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60017.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter-第三方组件

卡片折叠 stacked_card_carousel 扫一扫组件 qr_code_scanner 权限处理组件 permission_handler 生成二维码组件 pretty_qr_code 角标组件 badges 动画组件 animations app更新 app_installer 带缓存的图片组件 cached_network_image 密码输入框 collection 图片保存 image_g…

Modelsim恢复编辑器的解决方案——只能将外部编辑器删除后,重新匹配编辑器

Modelsim恢复编辑器的解决方案——只能将外部编辑器删除后,重新匹配编辑器 1,Modelsim和Questasim是相互兼容的,配置的编辑器变成了sublime,且更换不了编辑器2,解决问题的方案,还是没得到解决3,…

微服务02-docker

1、Docker架构 1.1 镜像和容器 Docker中有几个重要的概念: 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。Docker镜像是用于创建 Docker 容器的模板 。就像面向对象编…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em

​ 鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内…

【Linux】详解进程状态之僵尸进程——孤儿进程

目录 🌞专栏导读 🌛什么是进程 ⭐什么是PCB? 🌛查看进程 🌛如何通过系统调用查看进程PID 🌛fork 🌞认识进程状态 🌛查看进程状态 🌛R状态 ⭐例如&#xff1a…

postman如何添加token

参考博客:https://blog.csdn.net/Mrbignose/article/details/107237581 1.添加token: 2.设置token: 3.发送时携带token:

Nginx 负载均衡

Nginx 负载均衡 负载均衡由反向代理来实现的 其中反向代理分为七层代理和四层代理,一般常用的是七层代理,接下来分别介绍一些 NGINX 七层代理 七层是最常用的反向代理方式,只能配置在Nginx配置文件的http模块。 配置方法名称:…

logistic的分叉图

logistic是最基础、最常用的混沌序列。 了解其分叉图很关键。 下面,是混沌序列的分叉图。 分叉图是怎么得到的呢,实际上就是通过不断地迭代,观察其最终值在哪。 那到底在哪呢,我们分别绘制了最后20个序列的分叉图如下。 很显然…

Java源码解析-重点集合框架篇

Java 源码解析,集合篇 一:故事背景二:数据结构2.1 线性结构2.2 非线性结构 三:集合分类3.1 结构图 四:详细分析4.1 List4.1.1 ArrayList4.1.1.1 底层结构4.1.1.2 主要特点 4.1.2 LinkedList4.1.2.1 底层结构4.1.2.2 主…

MySQL5.7数据库、Navicat Premium1.6可视化工具安装教程【详细教程】

文章目录 一、MySQL、Navicat、注册机地址二、安装(一)、MySQL安装(二)、Navicat Premium安装(三)、集活Navicat Premium 三、遇到的问题1、Are you sure your navicat has not beenpatched/modified befor…

计算机是怎么存储和识别人类高级语言的

目录 1、计算机是怎么“存储”人类的高级语言的?2、 UTF-8和UTF-32的区别3、UTF-8是如何区分字节的长度呢?(即如何识别这一串二进制是多少个字节的?)4、计算机是如何识别人类的高级语言的? 1、计算机是怎么…

STM32 CubeMX USB_MSC(存储设备U盘)

STM32 CubeMX STM32 CubeMX USB_MSC(存储设备U盘) STM32 CubeMX前言 《使用内部Flash》——U盘一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择FATFS功能 二、代码部分修改代码"usbd_storage_if.c"修改代码"user_diskio.c"main函数初始化插…