当前位置: 首页 > 工具软件 > Mahotas > 使用案例 >

mahotas标记图像Labeled Image

邹海荣
2023-12-01
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 mh
import numpy as np
from pylab import imshow, show

image = np.zeros((8,8), bool)

image[:3,:3] = 1
image[6:,6:] = 1

labeled, n_label = mh.label(image)
labeled1, n_label1 = mh.label(image)

b=mh.labeled.is_same_labeling(labeled, labeled1)#标记是否相同
print('b=',b)#True

print(labeled.shape,n_label)# 标记形状(8, 8)  标记数量2
print(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,) <class 'numpy.ndarray'>
print('Background size', sizes[0])		                            #背景区域像素数 51
print('Size of first region: {}'.format(sizes[1]))                   #标记区域1像素数9
print('Size of second region: {}'.format(sizes[2]))              #标记区域2像素数4


p=mh.labeled.perimeter(image, n=4, mode="constant")#标记图像总周长
print('p=',p)#p= 8.0
p=mh.labeled.perimeter(labeled, n=4, mode="constant")
print('p=',p)#p= 8.0

p11=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 mh
import numpy as np,sys
import pylab as p

np.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 binary

rgb = mh.demos.nuclear_image()     #原子核图像--边缘会非常嘈
gray = rgb[:,:,0]#uint8

searchSeeds(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 mh
import numpy as np,sys
from pylab import imshow, show

np.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 image

image=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()

 

 

 

 

 

 

 

 类似资料: