【问题标题】:How to get the MSE of each pixel in two images of the same dimension如何获得两个相同维度的图像中每个像素的 MSE
【发布时间】:2018-04-28 13:06:35
【问题描述】:

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

图像是 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

背景图片

输入图片


我正在捕捉如下图像:

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')

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    只需在差异上使用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
    

    要为MSE 值小于某个阈值mse_thresh 的像素创建一个设置为black 的输出数组,否则从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
    

    【讨论】:

    • 问题是这仍然会影响 ~0.1fps 到 ~0.4fps 的 fps :(
    • @Maximilian 是时候改变算法了 :)
    • @Maximilian 或者您可以将结果写入img2吗?
    • @Maximilian 查看最后一部分(3 行代码)。
    • 请查看我添加了两个测试图像的问题中的编辑。差异提取返回i.imgur.com/4O7ZX3s.png
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多