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
两个图像之间重叠标签的计数-Python/NumPy_Python_Opencv_Numpy_Image Processing_Computer Vision - Fatal编程技术网

两个图像之间重叠标签的计数-Python/NumPy

两个图像之间重叠标签的计数-Python/NumPy,python,opencv,numpy,image-processing,computer-vision,Python,Opencv,Numpy,Image Processing,Computer Vision,我正在尝试使用opencv解决以下问题。作为输入,我将有两个png文件,每个像素设置为0到10之间的值。对于11个值中的每一个,我想看看两个输入文件之间有多少像素重叠。例如,假设img1.png的像素(0,0)到(0,26)设置为3。img2.png将像素(0,2)到(0,30)和(1,0)到(1,5)设置为3。因此img1将27个像素设置为3。img2将35个像素设置为3。其中,有25个重叠像素,即从(0,2)到(0,26)的像素 我想要的是一种快速提取信息的方法:0-10的值有多少像素重叠?

我正在尝试使用opencv解决以下问题。作为输入,我将有两个png文件,每个像素设置为0到10之间的值。对于11个值中的每一个,我想看看两个输入文件之间有多少像素重叠。例如,假设img1.png的像素(0,0)到(0,26)设置为3。img2.png将像素(0,2)到(0,30)和(1,0)到(1,5)设置为3。因此img1将27个像素设置为3。img2将35个像素设置为3。其中,有25个重叠像素,即从(0,2)到(0,26)的像素

我想要的是一种快速提取信息的方法:0-10的值有多少像素重叠?每个图像有多少像素的值为0-10?利用这些信息,我想为每个值制定某种重叠分数

我很天真地知道,我可以逐像素地查看每张图像,并使用累加器计算这些信息。但是这看起来会非常慢,opencv允许对图像进行numpy数组索引,所以我知道可能有一种方法可以加速这些计算。然而,我对opencv或numpy不太熟悉,也不太确定如何进行

目前将此作为参考:

方法#1:第一种方法将涉及以下步骤:

  • 获取两个数组(图像数组)之间相等的掩码

  • 获取其中一个数组和标签范围之间的相等掩码

  • 最后得到前两步得到的两个数组之间的张量和约化,给出所有标签的计数

因此,对于张量和约化,我们将有一个向量化解ab,如下图所示-

def overlap_count(a, b, num_label):
    eq_mask = a==b
    id_mask = a == np.arange(num_label)[:,None, None]
    count = np.einsum('ij,aij->a',eq_mask, id_mask.astype(int))
    return count
样本运行-

In [95]: a
Out[95]: 
array([[0, 1, 2, 1],
       [2, 0, 2, 2],
       [0, 1, 1, 0]])

In [96]: b
Out[96]: 
array([[0, 0, 1, 1],
       [1, 1, 1, 0],
       [1, 0, 1, 0]])

In [97]: overlap_count(a, b, num_label=3)
Out[97]: array([2, 2, 0])
方法#2:我们可以改进第一种方法的内存效率,从而提高性能。想法是-我们可以通过对缩放版的
eq\u mask
进行计数来避免创建巨大的数组
id\u mask
。此缩放版本将通过其中一个数组的值进行缩放。现在,这将对
0
标记的像素进行更多计数,因此我们将分别对这些像素进行计数

因此,第二种方法看起来是这样的-

def overlap_count_improved(a, b, num_label):
    eq_mask = a==b
    r = a * eq_mask
    count = np.bincount(r.ravel())
    count[0] = (eq_mask*(a == 0)).sum() 
    # or count[0] = np.einsum('ij,ij->', eq_mask, (a==0).astype(int))
    return count

我花了一段时间才明白你在这里做什么,但这是解决问题的一种非常明智的方式。非常感谢你的帮助!