python+opencv图像形态变换

news2024/11/18 11:34:25

        形态变换主要用于二值图像的形状操作,形态变换的实现原理基于数字形态学。数字形态学也称形态学,它主要从图像内部提取信息来描述图像形态。形态学广泛应用于视觉检测、文字识别、医学图像处理、图像压缩编码等。形态变换主要包括腐蚀、膨胀和高级形态操作。

        特别注意:图像的腐蚀和膨胀都是相较于高亮部分而言

        形态变换是一些基于图像形状的简单操作。通常在二进制图像上执行,当然也可以在多通道图像上执行。它有两个输入,一个是我们的原始图像,而另外的一个是决定操作性质的结构元素或者说内核。正是基于这样的内核,才使得我们通过指定的方法实现关于内核下的形态变化。

        形态变换包括:腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽操作、黑帽操作(用于二值化图像)膨胀与腐蚀是图像形态学最基础的两个操作,形态学的其它操作都是基于这两个操作基础上得到的,图像形态学是二值图像分析的重要分支学科。二值图像的腐蚀和膨胀就是将一个结构元素(小型二值图,一般为3*3大小)在一个大的二值图上逐点移动并进行比较,根据比较的结果作出相应处理而已。

        对二值图像来说,白色被腐蚀即为黑色的膨胀,白色的膨胀就是黑色被腐蚀。要注意的是,膨胀和腐蚀都是不可逆的,即两者不能完全的相互抵消。

膨胀:结构元素的白点与要处理的图形对应像素点只要有一个相同,则该点设为白色,否则仍然为黑色。膨胀可以看成是最大值滤波,即用最大值替换中心像素点。

腐蚀:结构元素的白点与要处理的图形对应像素点全部相同,则该点为白色,否则变为黑色(即被腐蚀掉了)。腐蚀可以看出是最小值滤波,即用最小值替换中心像素点。

开操作:先腐蚀后膨胀的过程称为开运算:具有消除细小物体,来去除噪声,在纤细处分离物体和平滑较大物体边界的作用。

闭操作:先膨胀后腐蚀的过程称为闭运算:具有填充前景物体内细小空洞或者前景物体上的小黑点,连接邻近物体和平滑边界的作用。

形态学梯度:膨胀操作与腐蚀操作的差值,形态学梯度还包括内部梯度和方向梯度,作用:提取前景物体的轮廓。

顶帽操作:原图像与开操作的差值,作用:提取图像中的噪声。

黑帽操作:闭操作与原图像的差值,作用:突出噪声与原始图像的交界处,可近似表现出一些轮廓。

形态操作内核

retval = cv2.getStructuringElement(shape, ksize)

shape为内核的形状(矩形、十字形和椭圆形)

ksize为内核的大小

import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
print("矩形矩阵\n",k1)
k2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
print("十字矩阵\n",k2)
k3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
print("椭圆形矩阵\n",k3)

 打印结果:

侵蚀(Erosion)

内核区域存在的像素值全为1,整个区域才置1,否则置为0

其作用是,传入内核,实现对原输入图像的侵蚀——本质是侵蚀前景物体的边界。
其侵蚀的形式是——内核在图像中滑动(如2D卷积),仅在当内核下的所有像素均为1时,原始图像中的像素(1或0)才被视为1,否则它将被侵蚀(设为零)。

方法参数如下:

输入图像(src )
输入内核(kernel )
锚点(anchor )——默认为元素中心,一般不修改
迭代数(iterations)——也就是侵蚀次数
边界像素处理类型(borderType )——一般不设置
边界不变时的边界值(borderValue )——默认值

import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
print("矩形矩阵\n",k1)
k2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
print("十字矩阵\n",k2)
k3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
print("椭圆形矩阵\n",k3)
img = cv2.imread('test01.png',0)
erosion1 = cv2.erode(img,k1,iterations = 1)
erosion2 = cv2.erode(img,k2,iterations = 1)
erosion3 = cv2.erode(img,k3,iterations = 1)
cv2.imshow("origion",img)
cv2.imshow("erosion1",erosion1)
cv2.imshow("erosion2",erosion2)
cv2.imshow("erosion3",erosion3)
cv2.waitKey(-1)
cv2.destroyAllWindows()

 

膨胀(Dilation)

内核区域存在像素值为1,整个区域就置1

方法参数如下:

  1. 输入图像(src )
  2. 输入内核(kernel )
  3. 锚点(anchor )——默认为元素中心,一般不修改
  4. 迭代数(iterations)——也就是扩张次数
  5. 边界像素处理类型(borderType )——一般不设置
  6. 边界不变时的边界值(borderValue )——默认值
import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
print("矩形矩阵\n",k1)
k2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
print("十字矩阵\n",k2)
k3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
print("椭圆形矩阵\n",k3)
img = cv2.imread('test01.png',0)
erosion1 = cv2.dilate(img,k1,iterations = 1)
erosion2 = cv2.dilate(img,k2,iterations = 1)
erosion3 = cv2.dilate(img,k3,iterations = 1)
cv2.imshow("origion",img)
cv2.imshow("erosion1",erosion1)
cv2.imshow("erosion2",erosion2)
cv2.imshow("erosion3",erosion3)
cv2.waitKey(-1)
cv2.destroyAllWindows()

 

开运算 (Opening)
实现:开运算是通过先对图像腐蚀再膨胀实现的


dst = open( src, element) = dilate( erode( src, element ) )
作用:能够排除小团块物体(物体较背景明亮),可以消除高于邻近点的孤立点,达到去噪作用,可以平滑物体轮廓、断开较窄的狭颈。

import numpy as np
import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img = cv2.imread('tt.png',0)
r=cv2.morphologyEx(img,cv2.MORPH_OPEN,k1,1)
cv2.imshow("origion",img)
cv2.imshow("r",r)
cv2.waitKey(-1)
cv2.destroyAllWindows()

源文件

 

 运行结果:

 

 

闭运算 (Closing)
实现:闭运算是通过先对图像膨胀再腐蚀实现的

dst = close( src, element) = erode( dilate( src, element ) )
作用:能够排除小型黑洞(黑色区域),可以消除低于邻近点的孤立点,达到去噪作用,可以平滑物体轮廓、弥合较窄的间断和细长的沟壑,消除小孔洞,填补轮廓线中的断裂。

import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img = cv2.imread('tt.png',0)
r=cv2.morphologyEx(img,cv2.MORPH_CLOSE,k1,1)
cv2.imshow("origion",img)
cv2.imshow("r",r)
cv2.waitKey(-1)
cv2.destroyAllWindows()

 运行效果:

 形态梯度(Morphological Gradient)

实现:膨胀图与腐蚀图之差
dst = morph_{grad}( src, element ) = dilate( src, element ) - erode( src, element )
作用:可以保留物体的边缘轮廓

import cv2
# 形态操作内核
k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img = cv2.imread('tt.png',0)
r=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,k1)
cv2.imshow("origion",img)
cv2.imshow("r",r)
cv2.waitKey(-1)
cv2.destroyAllWindows()

运行效果: 

顶帽(Top Hat)
实现:原图像与开运算结果图之差
dst = tophat( src, element ) = src - open( src, element )
作用:分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取

 待补充测试

看一下对比图:

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。

黑帽(Black Hat)
实现:闭运算结果图与原图像之差
dst = blackhat( src, element ) = close( src, element ) - src
作用:分离比邻近点暗的斑块,突出黑暗的区域
对比效果图:


因为黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关,所以,黑帽运算常用来分离比邻近点暗一些的斑块。

 

 待补充测试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux aarch64架构中使用docker安装mysql8

Linux aarch64架构中使用docker安装mysql8 1、遇到问题: 官网下载mysql包,安装完成后,启动mysql一直显示-bash: ./mysqld: 无法执行二进制文件。 网上找了各种资料,但是都没有作用,怀疑自己操作姿势不正确&#xff…

面试题集合

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。 从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提…

DNS:DNS域名解析过程及原理

一、理解IP和域名 我们首先要了解域名和IP地址的区别。 IP地址是互联网上计算机唯一的逻辑地址。 通过IP地址实现不同计算机之间的相互通信,每台联网计算机都需要通过IP地址来互相联系和分别。 但由于IP地址是由一串容易混淆的数字串构成,人们很难记忆所…

C基础 --- 因为整型提升导致的BUG

为什么会做整型提升 通常情况下,在对int类型的数值作运算时,CPU的运算速度是最快的。在x86上,32位算术运算的速度比16位算术运算的速度快一倍。C语言是一个注重 效率的语言,所以它会作整型提升,使得程序的运行速度尽可…

基于ChatGPT AI自动产生Shader,AI自动产生AICommand

AIEngine 基于ChatGPT AI自动产生Shader 代码地址:https://github.com/ManoKing/AIEngine 使用方法: 1,打开 Window/Package Manager 2,选择 /Add package from git URL… 3,添加URL: https://github.com/ManoKing/…

VMware Aria Automation Orchestrator 8.12 - 现代工作流程自动化平台

VMware Aria Automation Orchestrator 8.12 - 现代工作流程自动化平台 请访问原文链接:https://sysin.org/blog/vmware-aria-automation-orchestrator/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 现代工作流程…

民谣女神唱流行,基于AI人工智能so-vits库训练自己的音色模型(叶蓓/Python3.10)

流行天后孙燕姿的音色固然是极好的,但是目前全网都是她的声音复刻,听多了难免会有些审美疲劳,在网络上检索了一圈,还没有发现民谣歌手的音色模型,人就是这样,得不到的永远在骚动,本次我们自己构…

艺术家林曦老师新书《无用之美》即将发售,其中甘美提前与君共享~

十多年前,艺术家林曦老师做了一次主题为“无用之美”的演讲,从那时到现在,也一直教授着以“美”为核心的课程。经过十年的教学、和糯糯小朋友的相处,林曦老师觉得自己对这个主题有了更多的感触。      “有用的世界”繁复疲惫…

科技云报道:Serverless或许没有你想象中的安全

科技云报道原创。 随着云计算技术的进一步成熟,Serverless已成为引领云计算下一个十年的技术热点。 Serverless能够帮助开发者无需关注服务器、按照实际使用付费且可以享受服务自动弹性伸缩,将更多的精力放到业务逻辑本身。据Gartner预测,2…

Swift AsyncThrowingStream 和 AsyncStream Demo 演示

文章目录 前言什么是 AsyncThrowingStream?调整现有代码以使用流什么是 AsyncStream?AsyncThrowingStreamAsyncThrowingStream 迭代调试 AsyncStream取消一个 AsyncStream结论 前言 AsyncThrowingStream 和 AsyncStream 是 Swift 5.5 中由 SE-314 引入的并发框架的…

JUC并发编程15 | Java内存模型JMM与volatile

尚硅谷(56-70) JMM 引入一些大厂的面试题 Java内存模型JMM是什么JMM与volatile之间的关系是什么JMM有哪些特性or它的三大特性是什么为什么要有JMM,它为什么出现?功能和作用是什么?happens-before 先行发生原则是什么…

LaTeX极简入门

​LaTeX是什么? LaTeX是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利兰伯特(Leslie Lamport)在20世纪80年代初期开发。 LaTeX是一款开源免费,并且应用相当广泛的排版工具。不但能够对文字、公式、图片进行精确而复…

电容笔和触控笔有什么区别?电容笔牌子排行榜

而现在,在无纸化教育的大热之下,电容笔这个配件,也被很多人所关注。许多人对电容笔与触控笔的不同之处感到困惑,事实上,这二者是非常容易分辨的,电容笔是适用在我们最常见的电容屏上才能进行操作&#xff0…

算法工程师面试题

1.关于边缘提取的算法有那些?各有什么优缺点? Canny算法:Canny算法是一种经典的边缘检测算法,具有较高的准确性和良好的鲁棒性。该算法利用高斯滤波器对图像进行平滑处理,然后计算图像中每个像素的梯度和方向&#xff…

TinyHttpd 运行过程出现的问题

最近拉了个 TinyHttpd 的工程下来,不过好像各个都有些改动,最后挑了篇阅读量最多的。工程也是从这里面给的链接下载的。 参考自:https://blog.csdn.net/jcjc918/article/details/42129311 拿下来在编译运行前,按这里说的&#x…

词云图制作(R)

词云图制作 文章目录 词云图制作[toc]1 工作准备2 实际操作 1 工作准备 材料准备: 文本数据txt文件,或者其他文本文件。R语言软件 2 实际操作 第一步:从网上相关新闻网站复制粘贴或下载相关文本数据,转化为txt格式文件或其他&…

【设计模式】桥接模式

【设计模式】桥接模式 参考资料: Java 设计模式:实战桥接模式 一起来学设计模式之桥接模式 《设计模式之美》设计模式与范式(结构型-桥接模式) 桥接模式在项目中的应用 文章目录 【设计模式】桥接模式一、桥接模式概述二、案例场…

GPT-4 开始内测32k输入长度的版本了!你收到邀请了吗?

要说现在 GPT-4 最大的问题是什么?可能除了一时拿他没有办法的机器幻觉,就是卡死的输入长度了吧。尽管在一般的对话、搜索的场景里目前普通版本 GPT-4 的 8000 左右的上下文长度或许绰绰有余,但是在诸如内容生成、智能阅读等方面当下基础版的…

京东短网址高可用提升最佳实践 | 京东云技术团队

作者:京东零售 郝彦军 什么是短网址? 短网址,是在长度上比较短的网址。简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址。 当我们在腾讯、新浪发微博时,有时发很长的网址连接,但由于微博只限制140个字&a…

Android Studio中android: baselineAligned属性认识及用途

文章目录 使用Button控件来演示使用TextView控件来演示 android:baselineAligned 设置子元素都按照基线对齐&#xff0c;默认是true 使用Button控件来演示 在项目中经常使用layout_weight属性利用比重来设置控件的大小&#xff0c;代码如下&#xff1a; <?xml version&qu…