skimage.measure.label和skimage.measure.regionprops()
原博客
https://www.cnblogs.com/denny402/p/5166258.html
skimage.measure.label()函数
对二值图像进行连通区域进行标记,它的返回值就是标记,并没有对二值图像进行改变
在二值图像中,如果两个像素点相邻且值相同(同为0或同为1),那么就认为这两个像素点在一个相互连通的区域内。而同一个连通区域的所有像素点,都用同一个数值来进行标记,这个过程就叫连通区域标记。在判断两个像素是否相邻时,我们通常采用4连通或8连通判断。在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接。4邻接一共4个点,即上下左右,如下左图所示。8邻接的点一共有8个,包括了对角线位置的点,如下右图所示。
在skimage包中,我们采用measure子模块下的label()函数来实现连通区域标记。
函数格式:
skimage.measure.label(image,connectivity=None)
参数中的image表示需要处理的二值图像,connectivity表示连接的模式,1代表4邻接,2代表8邻接。
输出一个标记数组(labels), 从0开始标记。
#coding=utf-8
import numpy as np
import scipy.ndimage as ndi
from skimage import measure,color
import matplotlib.pyplot as plt#编写一个函数来生成原始二值图像
def microstructure(l=256):n = 5x, 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)] = 1mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波return mask > 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()
skimage.measure.regionprops()函数
如果想分别上面的的每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。该函数格式为:
返回所有连通区块的属性列表,常用的属性列表如下表:
属性名称 | 类型 | 描述 |
area | int | 区域内像素点总数 |
bbox | tuple | 边界外接框(min_row, min_col, max_row, max_col) |
centroid | array | 质心坐标 |
convex_area | int | 凸包内像素点总数 |
convex_image | ndarray | 和边界外接框同大小的凸包 |
coords | ndarray | 区域内像素点坐标 |
Eccentricity | float | 离心率 |
equivalent_diameter | float | 和区域面积相同的圆的直径 |
euler_number | int | 区域欧拉数 |
extent | float | 区域面积和边界外接框面积的比率 |
filled_area | int | 区域和外接框之间填充的像素点总数 |
perimeter | float | 区域周长 |
label | int | 区域标记 |
代码
#coding=utf-8
import numpy as np
import scipy.ndimage as ndi
from skimage import measure,color
import matplotlib.pyplot as plt#编写一个函数来生成原始二值图像
def microstructure(l=256):n = 5x, 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)] = 1mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波return mask > mask.mean()data = microstructure(l=128)*1 #生成测试图片labels = measure.label(data,connectivity=2) ##筛选连通区域大于500的
properties = measure.regionprops(labels)
valid_label = set()
for prop in properties:if prop.area > 500:valid_label.add(prop.label)
current_bw = np.in1d(labels, list(valid_label)).reshape(labels.shape)dst = color.label2rgb(current_bw) #根据不同的标记显示不同的颜色
print('regions number:', current_bw.max()+1) #显示连通区域块数(从0开始标记)fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(8, 4))
ax1.imshow(data, plt.cm.gray, interpolation='nearest')
ax1.axis('off')
ax2.imshow(current_bw, plt.cm.gray, interpolation='nearest')
ax2.axis('off')
ax3.imshow(dst,interpolation='nearest')
ax3.axis('off')fig.tight_layout()
plt.show()
skimage.segmentation.clear_border函数
https://blog.csdn.net/qq_36401512/article/details/88252649
clear_border(labels, buffer_size=0, bgval=0, in_place=False)主要作用是清除二值图像中边界的1值。例如
>>> import numpy as np
>>> from skimage.segmentation import clear_border
>>> labels = np.array([[0, 0, 0, 0, 0, 0, 0, 1, 0],
... [0, 0, 0, 0, 1, 0, 0, 0, 0],
... [1, 0, 0, 1, 0, 1, 0, 0, 0],
... [0, 0, 1, 1, 1, 1, 1, 0, 0],
... [0, 1, 1, 1, 1, 1, 1, 1, 0],
... [0, 0, 0, 0, 0, 0, 0, 0, 0]])
>>> clear_border(labels)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 1, 0, 0, 0],[0, 0, 1, 1, 1, 1, 1, 0, 0],[0, 1, 1, 1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0]])
skimage.measure.label和skimage.measure.regionprops()相关推荐
- skimage函数记录之measure.label和measure.regionprops
这两个函数可以用来处理图(一般是二值图)中出现的连通区域,我们来分别分析. 一.skimage.measure.label(input, background = None, return_num = ...
- Android布局measure,Android View的Measure测量流程全解析
相信绝大多数Android开发者都有自定义View来满足各种各样需求的经历,也知道一个View的绘制展示要经过measure.layout.draw三大流程,三者中measure的过程相比是稍微复杂一 ...
- sketch measure 导出html,Sketch measure 导出规范卡住的问题
最近遇到Sketch measure的规范导出完全卡死,我一直以为是文件和系统有问题,反复测试并搜索了很久才找到解决方法,总结了一下发上来,方便有同样困惑的同学们解决问题. 经过: 之前Sketch版 ...
- python安装skimage(no module named ‘skimage‘)
一眼看出报错的原因是因为缺乏skimage的包,于是百度了这个报错,得到的答案如下,需要在小黑窗输入如下的安装命令: sudo apt-get install python-skimage 然而安装的 ...
- skimage函数学习
morphology(凸包) from skimage importmorphology covex_hull_image convex_hull_image将图片中所有目标看作一个整体,计算一个最小 ...
- python中label函数_图像分析函数:skimage.measure中的label、regionprops
算法解释详细,有算法执行过程动态GIF图的:https://blog.csdn.net/icvpr/article/details/10259577 算法文字解释的简介易懂的:https://www. ...
- 鹅妹子的skimage.measure.regionprops
参考:https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops skimage的强大 ...
- 多种方法实现CT肺实质的自动分割
目录 一.序言 二.基于KMean的png分割肺区 2.1.代码实现 2.2.分割算法的流程及结果如下 2.3.结果展示 三.基于Dicom的Hu值的肺区分割(不区分左右) 3.1.代码实现 四.基于 ...
- 【深度学习】肺结节分割项目实战二:分割肺实质
在后续训练模型的时候如果直接使用原始的肺部CT图像,其中的非肺区域会对训练造成干扰,因此我们需要提取分割肺实质.这一部分参考了kaggle上的教程. 从这张CT图像中可以看出扫描器以外的部分为黑色,背 ...
最新文章
- 万能头文件#include<bits/stdc++.h>更新GCC10.2.0版本
- Linux命令之Ethtool
- 5G 承载网 — 前传、中传、回传
- c语言 五子棋 悔棋代码,跪求C语言五子棋悔棋部分实现
- C++N queensN皇后的优化算法(附完整源码)
- 我的Go语言学习之旅八:创建一个简单的WEB服务器
- XML解析(一),SAX解析XML
- 集线器级联增加了网络数量,效率降低了,形成了大的冲突域,怎么解决?
- python编程快速上手
- 51. Element replaceChild() 方法
- 出现java.lang.NoSuchMethodError错误的原因
- 数学建模经验分享及比赛时间汇总
- 【无线链路】无线发射功率以及接收灵敏度
- Python爬取微信公众号文章、标题、文章地址
- 华为机试真题 Python 实现【分月饼】
- java画板小demo
- IDEA的maven命令总是下载很多东西 解决办法
- 思迈特软件Smartbi智能电子表格,为你轻松制作财务报表
- 初中数学老师计算机培训反思,初中数学老师教学反思
- 京东网京东快报超级链接验证
热门文章
- JAI-ImageIO报错为1
- java imageio处理图像_Linux geoserver调优之Java图像处理优化(原生JAI和ImageIO和java默认库相互转换)...
- 基于python的旅游查询系统
- 机房收费系统(一)——整体思路
- /usr/bin/ld: i386 architecture of input file `xx‘ is incompatible with i386:x86-64 output
- 城市大脑建设的3个误区,大脑模型的分歧是关键
- LaTeX - 设置中文字体
- 植物大战僵尸OD给僵尸加防具
- mysql hy000 2013_ERROR 2013 (HY000): Lost connection to MySQL server
- MOS管的工艺和工作原理