gpt4 book ai didi

python - 如何避免使用 opencv 和 numpy 逐像素循环遍历图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:05:59 39 4
gpt4 key购买 nike

我逐个像素地遍历此图像,速度非常慢。我有 2 个要比较的切片和展平图像,因此每个元素都是一个名为 e1e2 的 3 维 rgb 值。虽然它很慢。是否有一些使用 opencvnumpy 的方法可以加快速度?

我在这里所做的是对具有合并颜色(8 种颜色)的图像执行像素比较。
我正在从 jpeg 中读取,所以 [255,0,0] 应该变成 [230,12,11] 所以 clean_key 做的是将值阈值设置为更清洁的值。然后我将此组合出现的次数附加到字典中。因此,例如 dict["255,0,0 0,0,255"] 可能在此图像中出现 300 次,这意味着 im1 有 300 个实例有红色像素并且im2 有一个蓝色像素。

for e1,e2 in itertools.izip(im1_slice.reshape(-1,3),im2_slice.reshape(-1,3)):
key = str(clean_key(e1_row)) + str(clean_key(e2_row))
if key in proportion_dict:
proportion_dict[key] += 1
else:
proportion_dict[key] = 1

return (proportion_dict,total)

最佳答案

您想要执行此操作的方法是首先将每个图像与您希望在该图像中看到的颜色进行比较,这会生成一个 bool 掩码,其中该图像是给定的颜色。您无需拼合图像即可执行此操作。这可以通过说:

image == color

这适用于灰度图像,但如果 color 实际上是沿三维的,您需要确保沿该维度的所有内容都匹配(即,您需要所有的 r、g 和b 组件匹配,所以你使用 np.all 沿最后一个轴(-1 给出最后一个轴):

np.all(image == color, axis=-1)

它给出一个二维 bool 值数组,如果该像素匹配 color,则每个元素为 True,否则为 False。对两个图像(和两种颜色)都执行此操作,然后您将得到一个颜色与两个图像匹配的蒙版:

np.all(im1==c1, -1) & np.all(im2==c2, -1)

这不仅会告诉您有多少像素匹配,还会告诉您它们在哪里(您可以绘制上面的线并在它们匹配的点上看到点)。如果您只想计数,只需在将 True 计为 1False 的掩码上使用 np.sum > 作为 0。一起:

def compare_colors(im1, im2, c1, c2):
matches = np.all(im1==c1, -1) & np.all(im2==c2, -1)
return matches.sum()

并使用/测试随机数据:

>>> a = np.random.choice([0, 255], (20,20,3))
>>> b = np.random.choice([0, 255], (20,20,3))
>>> compare_colors(a, b, [255, 0, 255], [0, 255, 0])
12

但在此之前,您需要根据实际输入,通过阈值“清理”您的颜色。您可以使用 np.where 轻松做到这一点,它会查看数组的每个元素,如果满足条件,则给出一件事,如果不满足,则给出另一件事。这里,如果值小于128,则使用0,否则使用255:

np.where(a<128, 0, 255)

通常,您可以编写这样的函数,将上面的值作为默认值:

def clean(a, thresh=128, under=0, over=255):
return np.where(a<128, under, over)

当然,要建立计数字典,您仍然需要遍历每个颜色组合,但这是一个很短的循环 (8*8)。这是完整的运行:

# some fake data (has values between 0 and 255 for r, g, and b)
H, W = 20, 20
a = np.random.randint(0, 256, (H,W,3))
b = np.random.randint(0, 256, (H,W,3))

# clean the images:
ac = clean(a)
bc = clean(b)

# build a list of all pairs of all 8 colors using itertools.product:
col_combos = itertools.product(itertools.product((0,255), repeat=3), repeat=2)

# now apply the comparison to the images for each pair of colors
col_dict = { (c1,c2): compare_colors(ac, bc, c1, c2) for c1,c2 in col_combos }

然后,col_dict 的键实际上是元组的元组,在我看来,这比字符串更容易处理。以下是您访问示例 key 的方式:

>>> col_dict[((0, 255, 255), (255, 0, 255))]
8

关于python - 如何避免使用 opencv 和 numpy 逐像素循环遍历图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362108/

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