所以我有一个类型为np.array的灰色(2D)图像,里面有很多零和对象。每个对象由其具有相同值的像素定义,例如, 1.23e15。
我现在想要标记图像,即我想将某个值的所有像素(例如,上述值1.23e15的200个像素)重新缩放为一个整数。 除了背景为零之外,我希望每个区域都设置为范围中的一个值(1,nbr_of_regions_in_img + 1)。
如果没有明显的循环解决方案,我怎样才能有效地完成这段时间(我有成千上万的图像)?
答案 0 :(得分:1)
Scipy有extensive library用于图像处理和分析。您正在寻找的功能可能是scipy.ndimage.label
import scipy.ndimage
import numpy as np
pix = np.array([[0,0,1,1,0,0],
[0,0,1,1,1,0],
[1,1,0,0,1,0],
[0,1,0,0,0,0]])
mask_obj, n_obj = scipy.ndimage.label(pix)
输出为您提供两个标记的掩码,每个标识的对象具有不同的编号,以及标识的对象的数量。
>>>print(n_obj)
>>>2
>>>print(mask_obj)
>>>[[0 0 1 1 0 0]
[0 0 1 1 1 0]
[2 2 0 0 1 0]
[0 2 0 0 0 0]]
您还可以使用structure
参数定义应该计为相邻单元格的内容:
s = np.asarray([[1,1,1],
[1,1,1],
[1,1,1]])
mask_obj, n_obj = scipy.ndimage.label(pix, structure = s)
>>>print(n_obj)
>>>1
>>>print(mask_obj)
>>>[[0 0 1 1 0 0]
[0 0 1 1 1 0]
[1 1 0 0 1 0]
[0 1 0 0 0 0]]
如果不同的物体彼此接触,即它们没有被零值分开,则会出现困难。