gpt4 book ai didi

python - 如何获取相同维度的两幅图像中每个像素的MSE

转载 作者:行者123 更新时间:2023-11-30 22:26:11 26 4
gpt4 key购买 nike

我有两张尺寸相同的图像。

图像是 numpy 数组,我正在迭代像素并获取每个像素的 r g b,如下所示:

for i in range(len(img1)):
for j in range(len(img1[0])):
pimg1 = img1[i][j]
pimg2 = img2[i][j]

r1 = pimg1[0]
r2 = pimg2[0]
g1 = pimg1[1]
g2 = pimg2[1]
b1 = pimg1[2]
b2 = pimg2[2]

然后我获取两个像素之间的 MSE,例如:

mse = math.sqrt(((r1 - r2) ** 2) + ((g1 - g2) ** 2) + ((b1 - b2) ** 2))

问题是这速度慢得离谱。有没有更有效的方法来做到这一点?

<小时/>

最终目标

我希望将两个图像之间具有一定“阈值”相似性的所有像素设置为黑色。且所有与 img2 像素差异较大的像素。

if mse > threshold:
new_img[i][j] = pimg2
else:
new_img[i][j] = [0, 0, 0] # black pixel

背景图片

enter image description here

输入的图像

enter image description here

<小时/>

我正在捕捉如下图像:

for frame in cam.camera.capture_continuous(raw, format="rgb", use_video_port=True):
img = frame.array
cv2.imwrite("image.png", img)

我得到的图像如下:

dir = 'images/compare/'
bg = cv2.imread(dir+'bg.png')
img = cv2.imread(dir+'in.png')

最佳答案

只需使用 np.linalg.norm 关于差异 -

mse = np.linalg.norm(img1-img2,axis=2)

更快的 np.einsum -

d = (img1-img2).astype(float)
mse = np.sqrt(np.einsum('...i,...i->...',d,d))

运行时测试 -

In [46]: np.random.seed(0)
...: m,n = 1024,1024
...: img1 = np.random.randint(0,255,(m,n,3)).astype(np.uint8)
...: img2 = np.random.randint(0,255,(m,n,3)).astype(np.uint8)

In [47]: %timeit np.linalg.norm(img1-img2,axis=2)
10 loops, best of 3: 26.6 ms per loop

In [49]: %%timeit
...: d = (img1-img2).astype(float)
...: mse = np.sqrt(np.einsum('...i,...i->...',d,d))
100 loops, best of 3: 13 ms per loop
<小时/>

创建一个设置为 black 的输出数组对于具有 MSE 的像素值小于某个阈值 mse_thresh并从 img2 中选择否则,这里是附加代码 -

mask = mse >= mse_thresh
out = np.where(mask[...,None], img2, 0)

将所有内容拼接在一起 - 使用 einsum计算平方MSE值并与平方 MSE 阈值进行比较以获得重大改进,并将输出分配回 img2 -

d = (img1-img2).astype(float)
mse = np.einsum('...i,...i->...',d,d)
img2[mse < mse_thresh**2] = 0

关于python - 如何获取相同维度的两幅图像中每个像素的MSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47305174/

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