skimage函数学习

morphology(凸包)

from skimage importmorphology

covex_hull_image

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

from skimage import morphology
morphology.convex_hull_image(image)
#凸包是指一个凸多边形,凸多边形将图片中所有的白色像素点都包含在内
#输入:二值图像
#输出:逻辑二值图像,在凸包内的点为True,否则为False

convex_hull_object

from skimage import morphology
morphology.convex_hull_object(image, neighbors=8)
#输入:image是一个二值图像
#输入:neighbors表示采用4连通还是8连通,默认为8连通。
#输出:逻辑二值图像,在凸包内的点为True,否则为False

remove_small_objects

from skimage import morphology
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如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False。
#输出:删除小块区域的二值图像

measure(连通标记+边缘轮廓)

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

from skimage import measure

label

from skimage import measure
measure.label(image, connectivity=None)
#输入:image表示需要处理的二值图像
#输入:connectivity表示连接的模式,1代表4邻接,2代表8邻接
#输出:标记数组(labels),从0开始标记。

regionprops

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

from skimage import measure
measure.regionprops(label_image)
#输入:label_image标记数组
#输出:area 区域内像素点总数
#输出:bbox 边界外接框
#输出:centroid 质心坐标
#输出:convex_area 凸包内像素点总数
#输出:convex_image 和边界外接框同大小的凸包
#输出:coords区域内像素点坐标
#输出:eccentricity 离心率
#输出:equivalent_diamenter和区域面积相同的圆的直径
#输出:euler_number区域欧拉数
#输出:extent区域面积和边界外接框面积的比率
#输出:filled_area区域和外接框之间填充的像素点总数
#输出:perimeter区域周长
#输出:label区域标记
label_img = measure.label(mask_erode, connectivity=2)
props = measure.regionprops(label_img)
if props:
    areas = [r.area for r in props]
    areas.sort(reverse=True)
    img_result = morphology.remove_small_objects(label_img, areas[0], connectivity=8, in_place=True)
    # props_sort = sorted(props, key=lambda p: p.area, reverse=True)
    # img_result = morphology.remove_small_objects(label_img, props_sort[0].area, connectivity=8, in_place=True)
    # img_result = morphology.convex_hull_image(img_result)
    img_result = np.where(img_result > 0, 255, 0)

find_contours

from skimage import measure
measure.find_contours(array, level)
#功能:检测二值图像的边缘轮廓
#输入:array一个二值数组图像
#输入:level在图像中查找轮廓的级别值
#输出:轮廓列表集合,可用for循环取出每一条轮廓。

subdivide_polygon

采用B样条(B-Splines)来细分多边形的曲线,该曲线通常在凸包线的内部。

from skimage import measure
measure.subdivide_polygon(coords, degree=2, preserve_ends=False)
#功能:逼近多边形曲线
#输入:coords坐标点序列
#输入:degreeB样条的度数,默认为2
#输入:perserve_ends如果曲线Wie非闭合曲线,是否保存开始和结束点坐标,默认为False。
#输出:细分多边形的曲线的坐标点序列。

approximate_polygon

基于Douglas-Peucker算法的一种近似曲线模拟。它根据指定的容忍值来近似一条多边形曲线链,该曲线也在凸包线的内部。

from skimage import measure
measure.approximate_polygon(coords, tolerance)
#功能:逼近多边形曲线
#输入:coords坐标点序列
#输入:tolerance容忍值
#输出:近似的多边形曲线坐标序列

参考资料

1.python数字图像处理(18):高级形态学处理
2.python数字图像处理(19):骨架提取与分水岭算法
3.python数字图像处理(17):边缘与轮廓
4.opencv+python机读卡识别(二)边缘检测及分割

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值