Я пытаюсь сделать мой код более надежным по сравнению с моей первой ревизией.Цель состоит в том, чтобы создать окончательное одиночное изображение, сравнивая изображение A и изображение B, чтобы получить изображение C. В настоящее время я работаю над тем, чтобы показать различия в изображениях, состоящих из черных линий.В этом случае это будут изображения A и B. У меня есть рабочий метод с изменением размера изображения и выполнением предварительной обработки (изменение размера, уменьшение шума и т. Д.).Код, который я разработал, чтобы показать различия (изображение C), показан ниже:
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)
В настоящее время я не считаю его достаточно надежным и может привести к некоторым проблемам в будущем.Я хочу использовать метод, который показывает различия изображений между изображениями A и B в одном изображении.И для изображения A будет назначен один цвет для различий, а для изображения B будет назначен другой цвет (например, синий и красный, а черный представляет области, которые являются одинаковыми).Это выделено на изображении ниже: ![image differences](https://i.stack.imgur.com/R2FQe.png)
Чтобы исправить это, я получил некоторую помощь от StackOverflow и теперь у меня есть метод, который использует маскирование и слияние в OpenCV.Проблема, которую я обнаружил, заключается в том, что отображаются только аддитивные изменения, и если элемент удален, он не отображается на изображении разницы.
Вот обновленный код, который дает мне часть пути к решению, которое я ищу. Проблема с этим кодом заключается в том, что он производит то, что находится на изображении D, а не на изображении C. Я пытался по существузапустите этот блок кода дважды, переключив img = imageA и imageB, но по какой-то причине выходные данные искажены.
# 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()
Результат, который я ищу, - это изображение C, но в настоящее время я могу получить только изображениеD с исправленным кодом.
Редактировать: Вот тестовые изображения A и B для использования.
![Test Image B](https://i.stack.imgur.com/qjozQ.png)