我正在努力比较两个图像版本之间的差异。图像将始终为黑白。目前,我有一个解决方案,在使用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 :(得分:2)
这是解决此问题的一种方法。 首先将图像加载为灰度。它们是倒置的,因此背景为黑色(值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()