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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mahotas小波变换 Wavelet Transforms-无损压缩图片
下一篇:mahotas绘图函数

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月05日 15时34分35秒