Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在opencv python中删除基于掩码的图像组件?_Python_Opencv_Image Processing - Fatal编程技术网

如何在opencv python中删除基于掩码的图像组件?

如何在opencv python中删除基于掩码的图像组件?,python,opencv,image-processing,Python,Opencv,Image Processing,我有两个二进制图像。让我们假设图像A和B 两者都包含像素值为1的对象和像素值为0的背景 图像B是掩模图像 我想保留“图像A”中的组件,这些组件与“图像B”中的对象相接触,甚至是一个像素 我尝试过的 我试过numpy.logical\u,它给了我一个交集 现在我必须循环“图像A”的所有组件,以检查所有像素,如果相交像素位于图像A的任何组件中,并且速度非常慢 我在寻找什么 opencv中是否有任何库函数可以完成这一切 或者任何有用的python库 有人能帮我写一下示例代码吗 谢谢 你可以试试这个,看

我有两个二进制图像。让我们假设图像A和B

两者都包含像素值为1的对象和像素值为0的背景

图像B是掩模图像

我想保留“图像A”中的组件,这些组件与“图像B”中的对象相接触,甚至是一个像素

我尝试过的

我试过
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]