gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:34 24 4
gpt4 key购买 nike

我正在尝试使用 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,也不太清楚如何去做。

目前正在查看此作为引用:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

最佳答案

方法 #1:第一种方法包括以下步骤:

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

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

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

因此,我们将有一个矢量化解决方案 ab - 使用 NumPy broadcastingnp.einsum对于张量和减少,就像这样 -

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

sample 运行-

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:我们可以通过np.bincount改进第一种方法的内存效率和性能。 .这个想法是 - 我们可以避免创建巨大的数组 id_mask,而是对 eq_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

关于python - 两个图像之间重叠标签的计数 - Python/NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45886933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com