如何在opencv python中删除基于掩码的图像组件?
我有两个二进制图像。让我们假设图像A和B 两者都包含像素值为1的对象和像素值为0的背景 图像B是掩模图像 我想保留“图像A”中的组件,这些组件与“图像B”中的对象相接触,甚至是一个像素 我尝试过的 我试过如何在opencv python中删除基于掩码的图像组件?,python,opencv,image-processing,Python,Opencv,Image Processing,我有两个二进制图像。让我们假设图像A和B 两者都包含像素值为1的对象和像素值为0的背景 图像B是掩模图像 我想保留“图像A”中的组件,这些组件与“图像B”中的对象相接触,甚至是一个像素 我尝试过的 我试过numpy.logical\u,它给了我一个交集 现在我必须循环“图像A”的所有组件,以检查所有像素,如果相交像素位于图像A的任何组件中,并且速度非常慢 我在寻找什么 opencv中是否有任何库函数可以完成这一切 或者任何有用的python库 有人能帮我写一下示例代码吗 谢谢 你可以试试这个,看
numpy.logical\u,它给了我一个交集
现在我必须循环“图像A”的所有组件,以检查所有像素,如果相交像素位于图像A的任何组件中,并且速度非常慢
我在寻找什么
opencv中是否有任何库函数可以完成这一切
或者任何有用的python库
有人能帮我写一下示例代码吗
谢谢
你可以试试这个,看看它是否足够快,是否能给你想要的结果
首先对阵列进行连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,将获得相关对象的ID。如果背景为-1。
有关连接组件标签的更深入解释,请参阅
然后用np.nonzero(a&b)提取其中a和b为1的指示符。然后程序将在所有这些标记上循环,并检查标记数组的相应ID。将其添加到我们感兴趣的一组对象中。
现在我们有了要提取的所有对象的ID。因此,我们只是在数组上循环,对于每个单元格,我们检查值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出中,如果不是,我们什么也不做(或者我们可以将其设置为零,但输出是用全零实例化的)
你可以试试这个,看看它是否足够快,是否能给你想要的结果
首先对阵列进行连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,将获得相关对象的ID。如果背景为-1。
有关连接组件标签的更深入解释,请参阅
然后用np.nonzero(a&b)提取其中a和b为1的指示符。然后程序将在所有这些标记上循环,并检查标记数组的相应ID。将其添加到我们感兴趣的一组对象中。
现在我们有了要提取的所有对象的ID。因此,我们只是在数组上循环,对于每个单元格,我们检查值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出中,如果不是,我们什么也不做(或者我们可以将其设置为零,但输出是用全零实例化的)
你可以试试这个,看看它是否足够快,是否能给你想要的结果
首先对阵列进行连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,将获得相关对象的ID。如果背景为-1。
有关连接组件标签的更深入解释,请参阅
然后用np.nonzero(a&b)提取其中a和b为1的指示符。然后程序将在所有这些标记上循环,并检查标记数组的相应ID。将其添加到我们感兴趣的一组对象中。
现在我们有了要提取的所有对象的ID。因此,我们只是在数组上循环,对于每个单元格,我们检查值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出中,如果不是,我们什么也不做(或者我们可以将其设置为零,但输出是用全零实例化的)
你可以试试这个,看看它是否足够快,是否能给你想要的结果
首先对阵列进行连接组件分析,具有4路连接。连接到同一“对象”的所有像素将获得相同的值。因此,如果检查单元格的值,将获得相关对象的ID。如果背景为-1。
有关连接组件标签的更深入解释,请参阅
然后用np.nonzero(a&b)提取其中a和b为1的指示符。然后程序将在所有这些标记上循环,并检查标记数组的相应ID。将其添加到我们感兴趣的一组对象中。
现在我们有了要提取的所有对象的ID。因此,我们只是在数组上循环,对于每个单元格,我们检查值是否在我们感兴趣的objectID列表中。如果是,我们将a的值添加到输出,如果不是,我们什么也不做(或者我们可以将其设置为零,但输出是用全零实例化的)我不太理解这一部分:“现在我必须循环‘图像a’的所有组件,以检查所有像素,如果相交像素位于图像a的任何组件中,并且速度非常慢。”你的意思是你不仅考虑像素,而且还考虑像素所属的“对象”吗?如果是,您如何定义“对象”?您能更清楚地解释输入和输出吗?在OpenCV中,您可以使用cv2。按位_和()?如果是,您如何定义“对象”?您能更清楚地解释输入和输出吗?在OpenCV中,您可以使用cv2。按位_和()
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]