首页 > 编程 > Python > 正文

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

2020-02-22 23:53:01
字体:
来源:转载
供稿:网友

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

1、凸包

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

函数为:

skimage.morphology.convex_hull_image(image)

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

例:

import matplotlib.pyplot as pltfrom skimage import data,color,morphology#生成二值测试图像img=color.rgb2gray(data.horse())img=(img<0.5)*1chull = 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连通。

例:

import matplotlib.pyplot as pltfrom skimage import data,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()函数来实现连通区域标记。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表