news 2026/4/26 7:04:36

python数字图像处理之高级形态学处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python数字图像处理之高级形态学处理

形态学处理,除了最基本的膨胀、腐蚀、开/闭运算、黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等。

1、凸包

凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内。

函数为:

1

skimage.morphology.convex_hull_image(image)

输入为二值图像,输出一个逻辑二值图像。在凸包内的点为True, 否则为False

例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

importmatplotlib.pyplot as plt

fromskimageimportdata,color,morphology

#生成二值测试图像

img=color.rgb2gray(data.horse())

img=(img<0.5)*1

chull=morphology.convex_hull_image(img)

#绘制轮廓

fig, axes=plt.subplots(1,2,figsize=(8,8))

ax0, ax1=axes.ravel()

ax0.imshow(img,plt.cm.gray)

ax0.set_title('original image')

ax1.imshow(chull,plt.cm.gray)

ax1.set_title('convex_hull image')

convex_hull_image()是将图片中的所有目标看作一个整体,因此计算出来只有一个最小凸多边形。如果图中有多个目标物体,每一个物体需要计算一个最小凸多边形,则需要使用convex_hull_object()函数。

函数格式:skimage.morphology.convex_hull_object(image,neighbors=8)

输入参数image是一个二值图像,neighbors表示是采用4连通还是8连通,默认为8连通。

例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

importmatplotlib.pyplot as plt

fromskimageimportdata,color,morphology,feature

#生成二值测试图像

img=color.rgb2gray(data.coins())

#检测canny边缘,得到二值图片

edgs=feature.canny(img, sigma=3, low_threshold=10, high_threshold=50)

chull=morphology.convex_hull_object(edgs)

#绘制轮廓

fig, axes=plt.subplots(1,2,figsize=(8,8))

ax0, ax1=axes.ravel()

ax0.imshow(edgs,plt.cm.gray)

ax0.set_title('many objects')

ax1.imshow(chull,plt.cm.gray)

ax1.set_title('convex_hull image')

plt.show()

2、连通区域标记

在二值图像中,如果两个像素点相邻且值相同(同为0或同为1),那么就认为这两个像素点在一个相互连通的区域内。而同一个连通区域的所有像素点,都用同一个数值来进行标记,这个过程就叫连通区域标记。在判断两个像素是否相邻时,我们通常采用4连通或8连通判断。在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接。4邻接一共4个点,即上下左右,如下左图所示。8邻接的点一共有8个,包括了对角线位置的点,如下右图所示。

在skimage包中,我们采用measure子模块下的label()函数来实现连通区域标记。

函数格式:

1

skimage.measure.label(image,connectivity=None)

参数中的image表示需要处理的二值图像,connectivity表示连接的模式,1代表4邻接,2代表8邻接。

输出一个标记数组(labels), 从0开始标记。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

importnumpy as np

importscipy.ndimage as ndi

fromskimageimportmeasure,color

importmatplotlib.pyplot as plt

#编写一个函数来生成原始二值图像

defmicrostructure(l=256):

n=5

x, y=np.ogrid[0:l,0:l]#生成网络

mask=np.zeros((l, l))

generator=np.random.RandomState(1)#随机数种子

points=l*generator.rand(2, n**2)

mask[(points[0]).astype(np.int), (points[1]).astype(np.int)]=1

mask=ndi.gaussian_filter(mask, sigma=l/(4.*n))#高斯滤波

returnmask > mask.mean()

data=microstructure(l=128)*1#生成测试图片

labels=measure.label(data,connectivity=2)#8连通区域标记

dst=color.label2rgb(labels)#根据不同的标记显示不同的颜色

print('regions number:',labels.max()+1)#显示连通区域块数(从0开始标记)

fig, (ax1, ax2)=plt.subplots(1,2, figsize=(8,4))

ax1.imshow(data, plt.cm.gray, interpolation='nearest')

ax1.axis('off')

ax2.imshow(dst,interpolation='nearest')

ax2.axis('off')

fig.tight_layout()

plt.show()

在代码中,有些地方乘以1,则可以将bool数组快速地转换为int数组。

结果如图:有10个连通的区域,标记为0-9

如果想分别对每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。该函数格式为:

1

skimage.measure.regionprops(label_image)

返回所有连通区块的属性列表,常用的属性列表如下表:

属性名称类型描述
areaint区域内像素点总数
bboxtuple边界外接框(min_row, min_col, max_row, max_col)
centroidarray质心坐标
convex_areaint凸包内像素点总数
convex_imagendarray和边界外接框同大小的凸包
coordsndarray区域内像素点坐标
Eccentricityfloat离心率
equivalent_diameterfloat和区域面积相同的圆的直径
euler_numberint区域欧拉数
extentfloat区域面积和边界外接框面积的比率
filled_areaint区域和外接框之间填充的像素点总数
perimeterfloat区域周长
labelint区域标记

3、删除小块区域

有些时候,我们只需要一些大块区域,那些零散的、小块的区域,我们就需要删除掉,则可以使用morphology子模块的remove_small_objects()函数。

函数格式:skimage.morphology.remove_small_objects(ar,min_size=64,connectivity=1,in_place=False)

参数:

ar: 待操作的bool型数组。

min_size: 最小连通区域尺寸,小于该尺寸的都将被删除。默认为64.

connectivity: 邻接模式,1表示4邻接,2表示8邻接

in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False.

返回删除了小块区域的二值图像。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

importnumpy as np

importscipy.ndimage as ndi

fromskimageimportmorphology

importmatplotlib.pyplot as plt

#编写一个函数来生成原始二值图像

defmicrostructure(l=256):

n=5

x, y=np.ogrid[0:l,0:l]#生成网络

mask=np.zeros((l, l))

generator=np.random.RandomState(1)#随机数种子

points=l*generator.rand(2, n**2)

mask[(points[0]).astype(np.int), (points[1]).astype(np.int)]=1

mask=ndi.gaussian_filter(mask, sigma=l/(4.*n))#高斯滤波

returnmask > mask.mean()

data=microstructure(l=128)#生成测试图片

dst=morphology.remove_small_objects(data,min_size=300,connectivity=1)

fig, (ax1, ax2)=plt.subplots(1,2, figsize=(8,4))

ax1.imshow(data, plt.cm.gray, interpolation='nearest')

ax2.imshow(dst,plt.cm.gray,interpolation='nearest')

fig.tight_layout()

plt.show()

在此例中,我们将面积小于300的小块区域删除(由1变为0),结果如下图:

4、综合示例:阈值分割+闭运算+连通区域标记+删除小区块+分色显示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

importnumpy as np

importmatplotlib.pyplot as plt

importmatplotlib.patches as mpatches

fromskimageimportdata,filter,segmentation,measure,morphology,color

#加载并裁剪硬币图片

image=data.coins()[50:-50,50:-50]

thresh=filter.threshold_otsu(image)#阈值分割

bw=morphology.closing(image > thresh, morphology.square(3))#闭运算

cleared=bw.copy()#复制

segmentation.clear_border(cleared)#清除与边界相连的目标物

label_image=measure.label(cleared)#连通区域标记

borders=np.logical_xor(bw, cleared)#异或

label_image[borders]=-1

image_label_overlay=color.label2rgb(label_image, image=image)#不同标记用不同颜色显示

fig,(ax0,ax1)=plt.subplots(1,2, figsize=(8,6))

ax0.imshow(cleared,plt.cm.gray)

ax1.imshow(image_label_overlay)

forregioninmeasure.regionprops(label_image):#循环得到每一个连通区域属性集

#忽略小区域

ifregion.area <100:

continue

#绘制外包矩形

minr, minc, maxr, maxc=region.bbox

rect=mpatches.Rectangle((minc, minr), maxc-minc, maxr-minr,

fill=False, edgecolor='red', linewidth=2)

ax1.add_patch(rect)

fig.tight_layout()

plt.show()

以上就是本文的全部内容,希望对大家的学习有所帮助

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 7:01:14

数据治理模型分析

数据治理模型是一套涵盖战略、管理、技术与流程的系统性工程,旨在将数据从“混乱的原材料”转化为可信、可用、可运营的核心资产。它在数据管理与数据价值之间搭建桥梁,保障数据安全合规的同时,最大化释放数据潜能。 📈 主流框架体系对比 当前全球主流的数据治理框架可归…

作者头像 李华
网站建设 2026/4/26 7:00:51

入职新公司,如何快速融入团队?

入职新公司&#xff0c;如何快速融入团队&#xff1f; 对于职场新人来说&#xff0c;入职新公司既充满期待&#xff0c;也伴随着挑战。能否快速融入团队&#xff0c;不仅影响工作效率&#xff0c;还关系到个人职业发展。面对陌生的环境、新的同事和不同的企业文化&#xff0c;…

作者头像 李华
网站建设 2026/4/26 6:56:09

Outis:自动化渗透测试侦察框架,整合Nuclei、Naabu等工具链

1. 项目概述&#xff1a;一个被低估的渗透测试利器如果你在网络安全领域&#xff0c;特别是渗透测试和红队行动中摸爬滚打过一段时间&#xff0c;大概率会听说过或者用过像nmap、masscan这样的端口扫描器&#xff0c;也用过gobuster、dirsearch这样的目录枚举工具。这些工具都是…

作者头像 李华
网站建设 2026/4/26 6:52:24

ARM Cortex-R5双发射与ECC内存优化实战

1. ARM Cortex-R5处理器双发射机制深度解析1.1 双发射技术基础原理双发射(Dual Issue)是现代处理器提升指令级并行度(ILP)的关键技术之一。在ARM Cortex-R5处理器中&#xff0c;这一机制允许在单个时钟周期内同时发射两条指令到不同的执行单元。这种并行执行能力直接提升了每周…

作者头像 李华
网站建设 2026/4/26 6:51:27

智能体开发框架实战:从模块化设计到生产部署全解析

1. 项目概述&#xff1a;一个面向开发者的智能体开发框架最近在开源社区里&#xff0c;我注意到一个名为little51/agent-dev的项目开始受到一些开发者的关注。乍一看这个名字&#xff0c;可能会让人联想到一些小型硬件或者51单片机相关的开发工具&#xff0c;但实际深入探究后&…

作者头像 李华
网站建设 2026/4/26 6:47:25

GitNexus:让AI编程助手拥有代码库全局视野的智能知识图谱工具

1. 项目概述&#xff1a;当AI助手真正“看懂”你的代码库 如果你和我一样&#xff0c;每天都要和Cursor、Claude Code这类AI编程助手打交道&#xff0c;那你一定遇到过这个令人头疼的场景&#xff1a;你让AI助手修改一个看似简单的函数&#xff0c;它自信满满地给出了代码&…

作者头像 李华