我有两个二进制图像。让我们说图像A和B.
两者都包含具有像素值1且背景具有像素值0的对象。
图像B是一个蒙版图像。
我希望将“图像A”中的组件保留为“图像B”的对象,即使是一个像素。
我尝试了什么
我试过numpy.logical_and
它给了我一个交集。
现在我必须循环“图像A”的所有组件来检查所有像素,如果相交的像素位于图像A的任何组件中并且非常慢。
我在寻找什么
opencv中是否有任何库函数可以完成所有工作?
或任何有用的python库
任何人都可以帮我提供示例代码或其他内容。
由于
答案 0 :(得分:3)
from skimage.morphology import label
labels_a = label(a, 4, 0) #CCL analysis with 4 way connectivity and 0 as background
output = np.zeros_like(a) #output as zeros with same shape as a
intersecting_pixels_indicies = np.nonzero(a&b) #getting the indicies where a&b is true(1)
objectIDs = set()
for i,j in zip(*intersecting_pixels_indicies):
objectIDs.add(labels_a[i,j]) #get the ID's of the indicies.
for i in range(output.shape[0]):
for j in range(output.shape[1]):
if output[i,j] in objectIDs: #if this id is in or list. add the value of a to output.
output[i,j] = a[i,j]
你可以尝试一下,看看它是否足够快,如果它能给你你想要的结果。
首先,在阵列上完成连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,您将获得相关对象的ID。如果背景则为-1 请参阅:http://en.wikipedia.org/wiki/Connected-component_labeling以更深入地了解连接组件标签。
然后,np.nonzero(a& b)提取a和b为1的指示。然后程序将遍历所有这些指标并检查标记数组的相应ID。将它添加到我们感兴趣的一组对象中 我们现在拥有要提取的所有对象的ID。所以我们只是循环遍历数组,对于每个单元格,我们检查该值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出中,否则我们什么都不做(或者我们可以将它设置为零,但输出用全零实例化)