mahotas标记图像Labeled Image
发布日期:2021-06-29 14:44:28
浏览次数:3
分类:技术文章
本文共 11815 字,大约阅读时间需要 39 分钟。
1.函数: mahotas.labeled.bbox(f, as_slice=False) # 标记数组中所有对象的边界框参数: f:int ndarray as_slice:bool可选--是否返回切片对象而不是整数坐标(默认值:False) 返回值:bboxes:ndarray 实例: bboxes = mh.labeled.bbox(f) bboxes[34] will contain the bounding box of (f == 34). ================================================================================== mh.bbox # 该函数的二进制版本 ==================================================================================mahotas.labeled.borders(labeled, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)}) # 计算边框像素 - 获取所有边界 # 如像素值为i,其附近像素(由Bc定义)值为j,i != j则该像素位于边界上. # 边界像素是在其邻域中有多个区域的像素(这些区域之一可以是背景). 参数: labeled : ndarray of integer type 输入标签数组 Bc:结构元素,可选 out:与标签形状相同ndarray,dtype = bool,可选 输出的存储位置.为None分配一新数组 mode : {‘reflect’, ‘nearest’, ‘wrap’, ‘mirror’, ‘constant’ [default], ‘ignore’} 如何处理边界 返回值:border_img : boolean ndarray 像素恰好在标签上有边框的地方为True mahotas.labeled.border(labeled, i, j, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)}, always_return=True)# 计算i和j区域之间的边界区域# 获取仅一对区域对之间边界的函数来检索边界像素 # 如像素值为i(或j)且其附近像素(由Bc定义)值为j(或i),则该像素位于边界上. 参数: labeled : ndarray of integer type 输入标签数组 i:整数 j:整数 Bc:结构元素,可选 out:与标签形状相同的ndarray,dtype = bool,可选--输出存储位置.为None分配一新数组 always_return:布尔值,可选--为false则在边框上没有像素的情况下,返回None.否则(默认),即使它为空,它也总是返回一个数组 返回值:border_img:布尔ndarray 像素恰好在标签中的i和j之间有边界的地方为True ====================================================================================mahotas.labeled.filter_labeled(labeled, remove_bordering=False, min_size=None, max_size=None) # 根据一系列条件过滤标记区域 参数: labeled : labeled array remove_bordering:bool,可选是否删除接触边界的区域 min_size:int,可选要保留对象最小大小(像素单位)(默认为最小) max_size:int,可选要保留对象最大大小(像素单位)(默认为最大) 返回值:filtered : labeled array nr:int 新标签数 ======================================================================================mahotas.labeled.label(array, Bc={3x3 cross}, output={new array}) # 标记数组,该数组被解释为二进制数组 # 也称为标记为已连接组件,其中连接性由结构元素定义Bc 参数: array : ndarray这将被解释为二进制数组 Bc:ndarray,可选这是要使用的结构元素 out:ndarray,可选输出数组.必须是np.int32类型的C数组 返回值: labeled : ndarray标记结果--将图像相应区域全部标记为int值,从0(背景)1,2,3.. nr_objects:Int标记总数量 ======================================================================================= mahotas.labeled.labeled_sum(array, labeled, minlength=None) # 标记的总和# sum将是一个大小数组,其中 等于.labeled.max() + 1sum[i]np.sum(array[labeled == i]) 参数: array:任何类型的ndarray labeled : int ndarray Label map这与从中返回的类型相同mahotas.label() minlength:int,可选 返回数组的最小大小.如果标记的minlength 区域少于区域,则将0加到结果中.(可选的) 返回值: sums : 1-d ndarray of array.dtype ======================================================================================== mahotas.labeled.labeled_max(array,标记为,minlength = None ) # 标为最小值.# mins将是一个大小数组,其中 等于.labeled.max() + 1 mins[i] np.min(array[labeled == i]) 参数: array:任何类型ndarray labeled : int ndarray Label map.这与从中返回的类型相同mahotas.label() 返回值: mins:的一维数组array.dtype =========================================================================================mahotas.labeled.labeled_size(labeled) #标签图像中每个标签像素数量 首个元素[0]是背景像素数量# 相当于:for i in range(...):sizes[i] = np.sum(labeled == i) #自然会快得多. 参数: labeled : int ndarray Returns: sizes : 1-d ndarray of int ========================================================================================= mahotas.labeled.relabel(labeled, inplace=False) # 重新relabeled标记# 可确保该图像是经过标记的图像,以便relabeled.max()使用从1到的每个标签(0保留用于背景并通过). 参数: relabeled : ndarray of int标记数组 inplace : boolean, optional是否就地执行重新标记,擦除中的值 labeled(默认值:False) 返回值: relabeled: ndarray nr_objs : int Number of objects 例: labeled,n = label(some_binary_map) for region in range(n): if not good_region(labeled, region + 1): # This deletes the region: labeled[labeled == (region + 1)] = 0 relabel(labeled, inplace=True) ==========================================================================================mahotas.labeled.is_same_labeling(labeled0, labeled1) # 检查labeled0和labeled1表示相同的标签(即,除了可能更改标签值外,它们是否相同). 参数: labeled0:int ndarray标记数组 labeled1:int ndarray标记数组 返回值:same : bool如果作为参数传递的标签等效,则为真 注意,对背景(值0)的处理方式有所不同.即 is_same_labeling(a, b) implies np.all( (a == 0) == (b == 0) ) ==========================================================================================mahotas.labeled.perimeter(bwimage, n=4, mode="constant") # 计算二进制图像中所有对象的总周长. 参数: bwimage : array二进制图像 n:int,可选 照bwperim原样传递passed to bwperim as is mode : str, optional照bwperim原样传递 返回值:p : float二进制图像中所有对象的总周长 ==========================================================================================mh.labeled.bwperim(bw, n=4, mode='constant') perim = bwperim(bw, n=4) # 求二元图像中物体周长 参数: bw : ndarray黑白图像n : int, optionalConnectivity连接. Must be 4 or 8 (default: 4) 最近的像素 mode : {反射'reflect', 最近'nearest',包裹 'wrap', 镜像'mirror', 'constant' [default], 'ignore'} 如何处理边界 返回:perim : ndarray 周长的bool图像 """原图像 周长图像============= ================ ================ ================ ========================== ============="""===========================================================================================mahotas.labeled.remove_bordering(labeled, [rsize=1, out={np.empty_like(im)}]) # 删除接触边界的对象. 参数: labeled : ndarray标记数组 rsize : int or tuple, 到边界最小距离(以曼哈坦距离为单位),以使物体能够生存.可以是len ==标记为indim的int或元组. out:ndarray,就地操作--如果以im形式传递out,则它将内联运行. 返回值:slabeled : ndarray删除边界接触对象后的标签图像 ===========================================================================================mahotas.labeled.remove_regions(labeled, regions, inplace=False) #删除标签图像中regions(索引)满足条件的区域 removed = remove_regions(labeled, regions, inplace=False): 参数: relabeled : ndarray of int标签图像 regions : sequence of int将被删除区域--标签的索引 inplace : boolean, optional是否就地执行删除操作,清除其中的值 labeled(默认值:False) 返回值:removed : ndarray # 不会重新标记;删除区域后最好重新标记标签图像: removed = relabel(remove_regions(labeled, regions)) # 或保存一个图像分配: removed = relabel(remove_regions(labeled, regions), inplace=True)#重复使用了内存 ===========================================================================================mahotas.labeled.remove_regions_where(labeled, conditions, inplace=False) # 根据布尔数组为True删除区域 # 不会重新标记.最好重新标记: removed = relabel(remove_regions_where(labeled, conditions)) # 或保存一个图像分配: removed = relabel(remove_regions(labeled, conditions), inplace=True)#重复使用内存.
2.实例: # 标记图像是整数图像,其中值对应于不同区域.# 即,区域1是所有具有值1的像素,区域2是具有值2的像素,依此类推.实例1: import mahotas as mhimport numpy as npfrom pylab import imshow, showimage = np.zeros((8,8), bool)image[:3,:3] = 1image[6:,6:] = 1labeled, n_label = mh.label(image)labeled1, n_label1 = mh.label(image)b=mh.labeled.is_same_labeling(labeled, labeled1)#标记是否相同print('b=',b)#Trueprint(labeled.shape,n_label)# 标记形状(8, 8) 标记数量2print(labeled)"""[ [1 1 1 0 0 0 0 0] [1 1 1 0 0 0 0 0] [1 1 1 0 0 0 0 0] [0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0] [0 0 0 0 0 0 2 2] [0 0 0 0 0 0 2 2]]"""a=mh.labeled.labeled_max(image, labeled)print('a=',a.shape,a.dtype,a)#a= (3,) bool [False True True]a=mh.labeled.labeled_min(image, labeled)print('a=',a.shape,a.dtype,a)#a= (3,) bool [False True True]sums = mh.labeled_sum(image, labeled) #测量每个区域的总重量print(sums,sums.dtype,sums.shape) #[False True True] bool (3,)print('Sum of first region: {}'.format(sums[1]))# 收集有关标记区域的一些统计信息:sizes = mh.labeled.labeled_size(labeled)print('sizes=', sizes,sizes.dtype,sizes.shape,type(sizes))#[51 9 4] uint32 (3,)print('Background size', sizes[0]) #背景区域像素数 51print('Size of first region: {}'.format(sizes[1])) #标记区域1像素数9print('Size of second region: {}'.format(sizes[2])) #标记区域2像素数4p=mh.labeled.perimeter(image, n=4, mode="constant")#标记图像总周长print('p=',p)#p= 8.0p=mh.labeled.perimeter(labeled, n=4, mode="constant")print('p=',p)#p= 8.0p11=mh.labeled.bwperim(image, n=4, mode='constant')#标记图像周长print('p11=',p11)"""p11= [ [False False True False False False False False] [False False True False False False False False] [ True True True False False False False False] [False False False False False False False False] [False False False False False False False False] [False False False False False False False False] [False False False False False False True True] [False False False False False False True False]]"""p12=mh.labeled.bwperim(labeled, n=4, mode='constant')print('p12=',p12)"""p12= [ [False False True False False False False False] [False False True False False False False False] [ True True True False False False False False] [False False False False False False False False] [False False False False False False False False] [False False False False False False False False] [False False False False False False True True] [False False False False False False True False]]"""imshow(labeled, cmap='gray')show()imshow(p11, interpolation='nearest')show()
实例2:过滤区域Filtering Regions - 分步处理import mahotas as mhimport numpy as np,sysimport pylab as pnp.set_printoptions(threshold=sys.maxsize)#显示设置def _view(image,shape=(2,2,1),mode=True): if isinstance(image,np.ndarray): p.subplot(shape[0],shape[1],shape[2]) if mode: p.imshow(image,cmap='gray') else: p.imshow(image)def view(image1,image2,image3=None,image4=None,graymode=[True,True,True,True]): b3,b4=isinstance(image3,np.ndarray),isinstance(image3,np.ndarray) rows=2 if b3 and b4 else 1 # p.figure(figsize=(15,15)) _view(image1,(rows,2,1),graymode[0]) _view(image2,(rows,2,2),graymode[1]) if rows==2: _view(image3,(rows,2,3),graymode[2]) _view(image4,(rows,2,4),graymode[3]) p.show()# 1.寻找种子def searchSeeds(gray,k=8): """ 寻找团块中心点并计算中心点的个数。 灰度图上团块中心的地方比较亮,最亮的地方就是最中心的地方。这个东西叫regional maxima,相当于山脉的最高峰。 我们找到这个点之后,进行标亮,并且与原来的灰度图重叠在一起。 """ img=mh.gaussian_filter(gray,8).astype('uint8') regional_max=mh.regmax(img)#区域最大值 view(img,regional_max,mh.overlay(gray,regional_max),graymode=[True,True,False,True]) p.show()def imag_Binary(gray): gray = mh.gaussian_filter(gray, 4) #高斯滤波 float64-过滤掉小的目标 # gray= gray.astype(np.uint8) # thresholdvalue=mh.thresholding.otsu(gray)#92 # binary = (gray>thresholdvalue) #bool阈值处理-显示原子核较少 binary = (gray> gray.mean()) #bool阈值处理等价上面3句;但是显示更多原子核 return binaryrgb = mh.demos.nuclear_image() #原子核图像--边缘会非常嘈gray = rgb[:,:,0]#uint8searchSeeds(gray,k=8) #查看原子核的中心点searchSeeds(gray,k=15) #查看更大原子核的中心点binary=imag_Binary(gray)# 标记使图像中所有原子核:统计核算数量labeled, n_label = mh.label(binary)print('n_label=',n_label) #发现42细胞核# 测量尺寸并进行过滤:过滤掉不完整原子核或原子核上有肿块的物质.sizes = mh.labeled.labeled_size(labeled)# too_big = np.where(sizes > 10000)# labeled = mh.labeled.remove_regions(labeled, too_big)labeled=mh.labeled.remove_regions_where(labeled, sizes > 10000)#同以上两行等效p.imshow(labeled)p.show()# 删除边界区域的原子核:labeled = mh.labeled.remove_bordering(labeled)# labeled现在值范围0~n_label,但有值丢失(如区域7是接触边界,则7未在标签中使用).# 可以relabel得到一个更干净版本:relabeled, n_left = mh.labeled.relabel(labeled)print('After filtering and relabeling, there are {} nuclei left.'.format(n_left))# 有24原子核, labeled值范围:0(背景)~24.p.imshow(relabeled)p.show()
实例3:V1.4一次调用来进行多处理import mahotas as mhimport numpy as np,sysfrom pylab import imshow, shownp.set_printoptions(threshold=sys.maxsize)def base_operator(): image = mh.demos.nuclear_image() #原子核图像--边缘会非常嘈 image = image[:,:,0] image = mh.gaussian_filter(image, 4) #高斯滤波 image = (image> image.mean()) #阈值处理 return imageimage=base_operator()# 标记使图像中所有原子核:labeled, n_label = mh.label(image)#过滤过大原子核,删除边界处原子核relabeled,n_left = mh.labeled.filter_labeled(labeled, remove_bordering=True, max_size=10000)imshow(relabeled)show()
转载地址:https://chunyou.blog.csdn.net/article/details/106306672 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月05日 15时34分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
excel文本函数
2019-04-29
电商大战二十年
2019-04-29
编程程软件测试思维方式:如何科学制定测试计划
2019-04-29
BLE蓝牙4.0串口调试助手
2019-04-29
树莓派WIFI设置
2019-04-29
nanopi2 启动信息
2019-04-29
phpstudy https
2019-04-29
Linux下EasyPanel版本安装及升级
2019-04-29
raspberry pi(树莓派) + easycap d60 视频采集
2019-04-29
WebRTC
2019-04-29
rfc5766-turn-server NAT
2019-04-29
webrtc详细教程
2019-04-29
Android IOS WebRTC 音视频开发总结
2019-04-29
报表图表样式
2019-04-29
android模板图例
2019-04-29
树莓派网线直连
2019-04-29
复合材料培训(I第七期)
2019-04-29
复合材料生活中的应用
2019-04-29