(数字图像处理MATLAB+Python)第九章图像形态学运算-第三节:二值图像的形态学处理

news2024/9/29 23:24:36

文章目录

  • 一:形态滤波
    • (1)概述
    • (2)程序
  • 二:图像的平滑处理
    • (1)概述
    • (2)程序
  • 三:图像的边缘提取
    • (1)概述
    • (2)程序
  • 四:区域填充
    • (1)概述
    • (2)程序
  • 五:目标探测(击中与否变换)
    • (1)概述
    • (2)程序
  • 六:细化
    • (1)概述
    • (2)程序

一:形态滤波

(1)概述

形态滤波:是一种在数字图像处理中常用的图像处理技术,用于改善图像的质量、提取图像的特定特征或去除图像中的噪声。形态滤波主要基于形态学运算,通过结构元素(也称为模板)对图像进行局部区域的操作,从而改变图像的形状和结构。选择不同形状(如各向同性的圆、十字架、矩形、不同朝向的有向线段等)、不同尺寸的结构元素可以提取图像的不同特征

(2)程序

如下:实现对二值图像的特征提取

在这里插入图片描述


matlab实现

I=imread(‘pattern.jpg’);
BW1=im2bw(I,h);
BW1=1-BW1;
se=strel('square',3); 
BW2=1-imopen(BW1,se);
figure;imshow(BW2);title('矩形块提取');
se45=strel('line',25,45);     
BW3=1-imopen(BW1,se45);
figure;imshow(BW3);title('线段提取');

python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
I = cv2.imread('pattern.jpg', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW1 = cv2.threshold(I, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
BW1 = 255 - BW1

# 矩形块提取
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
BW2 = cv2.morphologyEx(BW1, cv2.MORPH_OPEN, se)
BW2 = 255 - BW2

# 显示矩形块提取结果
plt.imshow(BW2, cmap='gray')
plt.title('矩形块提取')
plt.show()

# 线段提取
se45 = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
se45 = cv2.rotate(se45, cv2.ROTATE_90_CLOCKWISE)
BW3 = cv2.morphologyEx(BW1, cv2.MORPH_OPEN, se45)
BW3 = 255 - BW3

# 显示线段提取结果
plt.imshow(BW3, cmap='gray')
plt.title('线段提取')
plt.show()

二:图像的平滑处理

(1)概述

图像的平缓处理:是数字图像处理中的一项重要任务,它有助于减少图像中的噪声和细节,并使图像更加平滑和连续。通过结合开运算和闭运算,可以实现图像的更加全面的平滑处理。首先,使用开运算可以消除细小的噪声和不连续区域,平滑边缘,同时保留较大的结构。接着,使用闭运算可以填补空洞,连接区域,消除缺陷和断裂,使图像更加连续和平滑。对二值图像平滑处理的形态学变换为

Y = ( X ∘ S ) ⋅ S Y = ( X ⋅ S ) ∘ S \begin{array}{l}\boldsymbol{Y}=(\boldsymbol{X} \circ \boldsymbol{S}) \cdot \boldsymbol{S} \\\boldsymbol{Y}=(\boldsymbol{X} \cdot \boldsymbol{S}) \circ \boldsymbol{S}\end{array} Y=(XS)SY=(XS)S

例如下图,结构元素 S S S大于所有噪声和噪声块的尺寸

在这里插入图片描述

(2)程序

如下

在这里插入图片描述


matlab实现

Image=imread('A.bmp');
BW=im2bw(Image);
SE=strel('square',3);
result1=imclose(imopen(BW,SE),SE); 
figure,imshow(result1);
result2=imopen(imclose(BW,SE),SE);               
figure,imshow(result2);

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
Image = cv2.imread('A.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 创建结构元素
SE = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 先开运算再闭运算
result1 = cv2.morphologyEx(cv2.morphologyEx(BW, cv2.MORPH_OPEN, SE), cv2.MORPH_CLOSE, SE)

# 显示结果1
plt.imshow(result1, cmap='gray')
plt.show()

# 先闭运算再开运算
result2 = cv2.morphologyEx(cv2.morphologyEx(BW, cv2.MORPH_CLOSE, SE), cv2.MORPH_OPEN, SE)

# 显示结果2
plt.imshow(result2, cmap='gray')
plt.show()

三:图像的边缘提取

(1)概述

图像的边缘提取:是数字图像处理中的一项重要任务,它有助于凸显图像中的边缘和轮廓信息,以便于进一步的分析和处理。结合开运算和闭运算可以实现图像的边缘提取。首先,应用闭运算可以填补图像中的空洞和断裂,连接边缘区域,使边缘更加连续。然后,应用开运算可以平滑边缘、去除细小的孤立点和细线条,突出边缘特征。提取物体的轮廓边缘的形态学变换

  • 内边界 Y = X − ( X ⊖ S ) \boldsymbol{Y}=\boldsymbol{X}-(\boldsymbol{X} \ominus \boldsymbol{S}) Y=X(XS)
  • 外边界 Y = ( X ⊕ S ) − X \boldsymbol{Y}=(\boldsymbol{X} \oplus \boldsymbol{S})-\boldsymbol{X} Y=(XS)X
  • 形态学梯度 Y = ( X ⊕ S ) − ( X ⊖ S ) \boldsymbol{Y}=(\boldsymbol{X} \oplus \boldsymbol{S})-(\boldsymbol{X} \ominus \boldsymbol{S}) Y=(XS)(XS)

例如下图,使用结构元素 S S S对图像 X X X进行边缘提取

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZwmGF6cR-1685365220132)(image/第九章图像形态学运算-第三节:二值图像的形态学处理/image-20230529202220478.png)]

(2)程序

如下

在这里插入图片描述


matlab实现

Image=imread('menu.bmp');
BW=im2bw(Image);
SE=strel('square',3);
result1=BW-imerode(BW,SE); 
result2=imdilate(BW,SE)-BW; 
result3=imdilate(BW,SE)-imerode(BW,SE);     
figure,imshow(result1);
figure,imshow(result2);
figure,imshow(result3);

python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
Image = cv2.imread('menu.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 创建结构元素
SE = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 边缘提取结果1
result1 = BW - cv2.erode(BW, SE)

# 显示结果1
plt.imshow(result1, cmap='gray')
plt.show()

# 边缘提取结果2
result2 = cv2.dilate(BW, SE) - BW

# 显示结果2
plt.imshow(result2, cmap='gray')
plt.show()

# 边缘提取结果3
result3 = cv2.dilate(BW, SE) - cv2.erode(BW, SE)

# 显示结果3
plt.imshow(result3, cmap='gray')
plt.show()

四:区域填充

(1)概述

概述:是数字图像处理中的一项常见任务,它有助于填补图像中的空洞或断裂,并连接相邻的区域,使图像中的区域变得连续和完整。结合开运算和闭运算可以实现图像的区域填充。首先,通过应用开运算,可以去除图像中的小型空洞、断裂和孤立点,使得区域边缘更加连续。接着,再应用闭运算,可以填补空洞、连接区域,使得图像中的区域变得完整和连续

X k = ( X k − 1 ⨁ S ) ∩ A C , k = 1 , 2 , 3 , ⋯ X_{k}=\left(X_{k-1} \bigoplus S\right) \cap A^{C}, \quad k=1,2,3, \cdots Xk=(Xk1S)AC,k=1,2,3,

如下图,边界点用灰色表示,赋值为1;所有非边界点是白色部分,赋值为0

在这里插入图片描述

(2)程序

如下

在这里插入图片描述


matlab实现

Image=imread('coin.bmp');
BW=im2bw(Image);
imshow(BW); title('二值图像');
result1=imfill(BW,'holes');
figure,imshow(result1);title('二值图像的区域填充');

python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
Image = cv2.imread('coin.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示二值图像
plt.imshow(BW, cmap='gray')
plt.title('二值图像')
plt.show()

# 区域填充
result1 = cv2.fillHoles(BW)

# 显示区域填充结果
plt.imshow(result1, cmap='gray')
plt.title('二值图像的区域填充')
plt.show()

五:目标探测(击中与否变换)

(1)概述

目标探测(击中与否变换):击中与否变换的原理利用腐蚀特性——腐蚀的过程相当于对可以填入结构元素的位置作标记的过程。目标检测既要检测目标内部,也要检测外部,即在一次运算中要同时捕获内外标记。因此,进行目标探测,需要采用两个结构元素 S 1 S_{1} S1 S 2 S_{2} S2,构成一个结构元素对 S = ( S 1 , S 2 ) S=(S_{1},S_{2}) S=(S1,S2)

  • S 1 S_{1} S1:探测目标内部
  • S 2 S_{2} S2:探测目标外部

则图像 X X X用结构元素 S S S进行击中与否变换,记为

X ∗ S = ( X ⊖ S 1 ) ∩ ( X C ⊖ S 2 ) X ∗ S = ( X ⊖ S 1 ) ∩ ( X C ⨁ S ^ 2 ) X ∗ S = { x ∣ S 1 + x ⊆ X  and  S 2 + x ⊆ X C } \begin{array}{l}\boldsymbol{X} * \boldsymbol{S}=\left(\boldsymbol{X} \ominus \boldsymbol{S}_{\mathbf{1}}\right) \cap\left(\boldsymbol{X}^{\boldsymbol{C}} \ominus \boldsymbol{S}_{\mathbf{2}}\right) \\\boldsymbol{X} * \boldsymbol{S}=\left(\boldsymbol{X} \ominus \boldsymbol{S}_{\mathbf{1}}\right) \cap\left(\boldsymbol{X}^{\boldsymbol{C}} \bigoplus \widehat{\boldsymbol{S}}_{\mathbf{2}}\right) \\\boldsymbol{X} * \boldsymbol{S}=\left\{\boldsymbol{x} \mid \boldsymbol{S}_{\mathbf{1}}+\boldsymbol{x} \subseteq \boldsymbol{X} \quad \text { and } \quad \boldsymbol{S}_{\mathbf{2}}+\boldsymbol{x} \subseteq \boldsymbol{X}^{\boldsymbol{C}}\right\}\end{array} XS=(XS1)(XCS2)XS=(XS1)(XCS 2)XS={xS1+xX and S2+xXC}

当且仅当结构元素 S 1 S_{1} S1平移到某一点可填入集合 X X X的内部,结构元素 S 2 S_{2} S2平移到该点可填入集合 的外部时,该点才在击中击不中变换的输出中

例如下图,(a)为由四个物体:矩形、小方形、大方形、带有小凸出部分的大方形组成的图像 X X X;(b)为结构元素对 S = ( S 1 , S 2 ) S=(S_{1},S_{2}) S=(S1,S2)。要求通过击中与否运算,能正确识别方形

在这里插入图片描述

效果如下

在这里插入图片描述

(2)程序

如下

在这里插入图片描述


matlab实现

Image=imread('test.bmp');
BW=im2bw(Image);                 
interval=[-1  -1  -1  -1  -1
                  -1  -1  -1  -1  -1
                  -1  -1  1   1   1
                  -1  -1  1   1   1
                  -1  -1  1   1   1];      %定义结构元素对
result=bwhitmiss(BW,interval);   %击中击不中
figure,imshow(result); title('击中与否变换结果');

python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
Image = cv2.imread('coin.bmp', cv2.IMREAD_GRAYSCALE)

# 二值化处理
_, BW = cv2.threshold(Image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示二值图像
plt.imshow(BW, cmap='gray')
plt.title('二值图像')
plt.show()

# 区域填充
result1 = cv2.fillHoles(BW)

# 显示区域填充结果
plt.imshow(result1, cmap='gray')
plt.title('二值图像的区域填充')
plt.show()

六:细化

(1)概述

细化:骨架化结构是目标图像的重要拓扑描述。对目标图像进行细化处理,就是求图像的中央骨架的过程,是将图像上的文字、曲线、直线等几何元素的线条沿着其中心轴线将其细化成一个像素宽的线条的处理过程。基于数学形态学变换的细化算法为

X ⊙ S = X − ( X ∗ S ) \boldsymbol{X} \odot \boldsymbol{S}=\boldsymbol{X}-(\boldsymbol{X} * \boldsymbol{S}) XS=X(XS)

可见,细化实际上为从集合 X X X中去掉被结构元素 S S S击中的结果。具体采用的细化方法为

X 1 = X ⊙ S , X 2 = X 1 ⊙ S , ⋯ ⋯ X n = X n − 1 ⊙ S \boldsymbol{X}_{\mathbf{1}}=\boldsymbol{X} \odot \boldsymbol{S}, \boldsymbol{X}_{\mathbf{2}}=\boldsymbol{X}_{\mathbf{1}} \odot \boldsymbol{S}, \cdots \cdots \boldsymbol{X}_{n}=\boldsymbol{X}_{n-1} \odot \boldsymbol{S} X1=XS,X2=X1S,⋯⋯Xn=Xn1S

如下示例

在这里插入图片描述

在这里插入图片描述

(2)程序

如下

在这里插入图片描述


matlab实现

Image=imread('menu.bmp');
BW=im2bw(Image); 
result1=bwmorph(BW,'thin',1); 
result2=bwmorph(BW,'thin',Inf); 
figure,imshow(result1);title('细化一次');
figure,imshow(result2);title('细化至只有一个像素宽');

python实现

Image=imread('menu.bmp');
BW=im2bw(Image); 
result1=bwmorph(BW,'thin',1); 
result2=bwmorph(BW,'thin',Inf); 
figure,imshow(result1);title('细化一次');
figure,imshow(result2);title('细化至只有一个像素宽');

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

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

相关文章

redux与react-redux状态集中管理

一、redux:可用于react、Vue等中 redux应用:状态的管理,共享状态,Redux用一个单独的常量状态树(state对象)保存这一整个应用(如tab选项卡的状态、城市等需要应用在整个页面的信息)的状态。其本…

算法|13.贪心

1.字典序最小的字符串连接方案 题意&#xff1a;给定一个由字符串组成的数组strs&#xff0c;必须把所有的字符串拼接起来&#xff0c;返回所有可能的拼接结果中字典序最小的结果。 public static class MyCom implements Comparator<String>{Overridepublic int compa…

@程序员【提升代码质量,快走出学习迷茫的状态吧】

思路清晰&#xff0c;能上钻一 思路清晰&#xff0c;能上钻一写代码如同打游戏上分。写代码如同中医治病。 思路清晰&#xff0c;能上钻一 ⭐⭐想成为一名优秀的电玩高手&#xff0c;你需要有清晰的思路;想成为一名顶级的电玩高手&#xff0c;你需要的是顶级的思路和异于常人的…

裁员后投递了300次简历,面试22家,终于上岸!

这是一位群友的励志故事&#xff0c;生活虽然很苦&#xff0c;但是朝着自己想要的方向去努力很值得&#xff01; 求职109天&#xff0c;沟通2212次&#xff0c;投简历355次&#xff0c;面试22家&#xff0c;涨薪10%&#xff0c;终于上岸&#xff0c;在这里复盘下我的经历&#…

[创业之路-72] :创业公司发展模式的选择:技工贸还是贸工技?

目录 前言&#xff1a; 一、什么是技、工、贸&#xff1f; 二、概述 2.1 推动力不同 2.2 适合领域不同 2.3 经营模式的主导地位不同 三、技、工、贸详解 3.1 常见的七种营销模式 3.2 常见的三种生产模式 3.3 常见的三种研发模式 四、经营模式的战略选择与影响因素 …

短视频矩阵源码如何做应用编程?

短视频矩阵源码&#xff0c; 短视频矩阵系统技术文档&#xff1a; 可以采用电子文档或者纸质文档的形式交付&#xff0c;具体取决于需求方的要求。电子文档可以通过电子邮件、远程指导交付云存储等方式进行传输、 短视频矩阵{seo}源码是指将抖音平台上的视频资源进行筛选、排…

C++ Primer Plus 第一,二章笔记

目录 第一章笔记 1、C简介 2、C简史 3、可移植性和标准 第二章笔记 1. 进入C 1.3、预处理器和头文件 1.4、名称空间&#xff08;namespace&#xff09; 1.5、使用cout进行C的输出 2. C语句 3. 其他C语句 4. 函数 第一章笔记 1、C简介 C融合了3种不同的编程方式&a…

vsdx文件怎么打开,安装什么软件打开这种后缀名(教程)

目录 简介 安装配置 其他 总结 简介 VSDX 文件是 Microsoft Visio 文件格式&#xff0c;它是一种二进制文件&#xff0c;用于保存 Visio 中的绘图和图表。如果你想要打开 VSDX 文件&#xff0c;可以考虑以下几种方法&#xff1a; 方法一&#xff1a;使用 Microsoft Visio …

C++IO流(详解)

C语言的输入与输出 在C语言当中&#xff0c;我们使用最频繁的输入输出方式就是scanf与printf&#xff1a; scanf&#xff1a; 从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将读取到的值存放到某一指定变量当中。 printf&#xff1a; 将指定的数据输出到…

Vivado综合属性系列之十三 FSM_ENCODING

目录 一、前言 二、FSM_ENCODING ​2.1 属性介绍 ​2.2 工程代码 2.3 结果 ​2.4 参考资料 一、前言 ​状态机的实现有很多方式&#xff0c;如auto&#xff0c;one_hot&#xff0c;sequential&#xff0c;如下图中Synthesis中-fsm_extraction的配置项&#xff0c;但此处作用范…

【AI面试】降低过拟合的方式方法横评探究

对于一个“训练调参工程师”来说&#xff0c;在训练过程遇到过拟合现象&#xff0c;是常事。当然&#xff0c;如何降低过拟合&#xff0c;也是在面试过程中&#xff0c;经常被面试官问到的问题&#xff08;没啥可问的&#xff0c;就只能这样问了&#xff09;。以下是我们会常考…

HEVC中,mvd怎么写进码流的?

文章目录 Motion vector difference syntax 标准文档描述语义解释设计意义 Motion vector difference syntax 标准文档描述 语义解释 MvdL1[ x0 ][ y0 ][ compIdx ] L1列表的mvd x0,y0 表示亮度快左上角坐标 compIdx 0表示水平 compIdx 0表示垂直 mvd_l1_zero_flag&#xff1a…

DRF之JWT认证

一、JWT认证 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。我们不再使用Session认证机制&#xff0c;而使用Json Web Token&#xff08;本质就是token&#xff09;认证机制。 Json web token (JWT), 是为了在网络应用环…

给osg::Geometry(自己绘制的几何体)添加纹理(二)

目录 1. 前言 2. 自会集合体贴纹理 2.1. 一张图贴到整个几何体 2.2. 几何体每个面贴不同的图片纹理 3. 说明 1. 前言 前文讲述了如何给osg自带的几何体&#xff0c;如&#xff1a;BOX等&#xff0c;添加纹理&#xff0c;文章参考链接如下&#xff1a; osg给osg::Geometry&…

动态规划专题一(动态规划的基本模型)

先上例题1 1258&#xff1a;【例9.2】数字金字塔 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn) 1258&#xff1a;【例9.2】数字金字塔 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 36341 通过数: 21547 【题目描述】 观察下面的数字…

HotSpot虚拟机OutOfMemoryError异常

目录 一、JVM内存区域 二、堆中对象 1. 对象的创建 2. 对象的内存布局 3. 对象的访问定位 三、OOM异常 1. 堆OOM异常测试 2. 栈SOF异常测试 1)&#xff1a;栈容量过小 2)&#xff1a;大量本地变量 3. 常量池OOM异常测试 4. 方法区测试 5. 堆外内存测试 四、参考资料…

详解FreeRTOS:嵌入式多任务系统的任务互斥和优先级反转(理论篇—9)

在嵌入式多任务系统中,有些资源必须是独占使用的,多个任务对这样的资源的并发访问将导致错误的发生。一般来说,对需要独占使用的资源必须使用互斥方法将对其的并发访问串行化。 在优先级多任务系统中引入互斥方案,会导致任务优先级反转的问题:假如某时低优先级的任务占有…

Zabbix之2023 Zabbix6.4最新高级特性、优缺点及其实现原理总结

目录 Zabbix高级特性1. 自动发现 Zabbix高级特性2. 分布式监控 Zabbix高级特性3. 高级报警 Zabbix高级特性4. 可视化 Zabbix高级特性5. API Zabbix高级特性6. 高可用性 Zabbix高级特性7. 安全性 Zabbix高级特性8. 无代理监控 SNMP IPMI JMX Zabbix高级特性9. Agent…

【Windows】局域网内远程桌面控制

【Windows】局域网内远程桌面控制 1、背景2、设置登录密码3、启用远程桌面4、远程示例 1、背景 工作中的很多场景需要远程操作&#xff0c;这时候可以借助远程桌面应用程序实现&#xff0c; 比如AnyDesk、向日葵、TeamViewer等。 windows10系统&#xff0c;其操作系统自带了远…

python基础知识(三):比较运算符、布尔运算符和位运算

目录 1. 比较运算符2. 布尔运算符3. 位运算 1. 比较运算符 比较运算符通常为以下6种&#xff1a; (1) 大于">“&#xff0c;比较两个数a、b的大小&#xff0c;比较的结果如果a大于b则为True&#xff0c;否则为False&#xff1b; (2) 大于等于”>“&#xff0c;比较…