Python 有没有办法通过对两幅图像进行颜色处理来突出显示图像差异?

Python 有没有办法通过对两幅图像进行颜色处理来突出显示图像差异?,python,opencv,computer-vision,Python,Opencv,Computer Vision,我正在努力比较两个图像版本的差异。图像将始终是黑白的。目前,我有一个解决方案,在从每个图像中删除颜色通道后,使用openCV执行图像添加后,用红色和青色线显示图像差异。我想做的是减少视觉色彩,让一个图像在视觉上保持不变,另一个图像被覆盖。使用此覆盖,线条中的差异将高亮显示为红色,而另一条则保持黑色。(如图所示)。A为原始文件修订版。B是有变化的。C是我想显示的,以突出显示更改,D是我目前可以实现的。 我有一个想法,我可以用减法的图像和结果图像,并以某种方式添加到主图像。我对计算机视觉非常陌生,

我正在努力比较两个图像版本的差异。图像将始终是黑白的。目前,我有一个解决方案,在从每个图像中删除颜色通道后,使用openCV执行图像添加后,用红色和青色线显示图像差异。我想做的是减少视觉色彩,让一个图像在视觉上保持不变,另一个图像被覆盖。使用此覆盖,线条中的差异将高亮显示为红色,而另一条则保持黑色。(如图所示)。A为原始文件修订版。B是有变化的。C是我想显示的,以突出显示更改,D是我目前可以实现的。

我有一个想法,我可以用减法的图像和结果图像,并以某种方式添加到主图像。我对计算机视觉非常陌生,所以我不确定所有合适的术语。我在考虑将减法图像用作修改图像的遮罩,将所有黑色像素变为红色,然后将其添加到“原始”中

下面是一段代码,它将生成与图像块D中类似的输出

np_image_A = np.array(image_A)
np_image_B = np.array(image_B)

# Set the green and red channels respectively to 0. Leaves a blue image
np_image_A[:, :, 1] = 0
np_image_A[:, :, 2] = 0
# Set the blue channels to 0.
np_image_B[:, :, 0] = 0
# Add the np images after color modification
overlay_image = cv2.add(np_image_A, np_image_B)
我的想法如下所示,但不确定如何在这里取得进展:

sub = cv2.subtract(image_b, image_a) # Get the areas of difference in the revised image
alpha = 0.75
revision_img = cv2.addWeighted(sub, alpha, image_a, 1-alpha, 0)

在执行减法步骤后,我得到的是一幅黑白图像。在添加到基础图像以查看修订后,我看到的图像是黑色的。我认为在减法步骤之后,需要做一些事情使黑色透明,白色线条变红,但我不确定如何做到这一点。

这是一种方法。 首先,图像被加载为灰度。这些是反转的,因此背景为黑色(值0),线条为白色(值255)。现在,您可以从B中减去A,以获得在B中添加的线/符号(相对于A)。可以使用生成的遮罩修改a的颜色版本,以显示B添加的内容

结果:

请注意覆盖,这是因为我使用了您提供的图像。考虑到你在D的成绩,这可能不是你的问题

代码:


非常感谢你!这正是我想要的。我从来没有想过反转步骤。你为我节省了几天额外的测试方法。干杯
    import cv2 
    # load image A as color image
    img = cv2.imread('1a.png')
    # load A and B as grayscale
    imgA = cv2.imread('1a.png',0)
    imgB = cv2.imread('1b.png',0)
    # invert grayscale images for subtraction
    imgA_inv = cv2.bitwise_not(imgA)
    imgB_inv = cv2.bitwise_not(imgB)
    # subtract the original (A) for the new version (B)
    diff = cv2.subtract(imgB_inv, imgA_inv)
    # split color image A into blue,green,red color channels
    b,g,r = cv2.split(img)
    # merge channels back into image, subtracting the diff from
    # the blue and green channels, leaving the shape of diff red
    res = cv2.merge((b-diff,g-diff,r))
    # display result
    cv2.imshow('Result',res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()