Есть ли способ выделить различия в изображениях с помощью цветовой манипуляции с двумя изображениями? - PullRequest
1 голос
/ 01 июля 2019

Я работаю, чтобы сравнить различия в двух версиях изображения.Изображение всегда будет черно-белым.В настоящее время у меня есть решение, в котором различия изображений отображаются с красными и голубыми линиями после использования openCV для добавления изображений после удаления цветового канала из каждого изображения.То, что я хочу сделать, чтобы уменьшить визуальный цвет, это сделать одно изображение визуально нетронутым, а другое изображение наложить.С этим наложением разница в линиях будет выделена красным цветом, а остальные остаются черными.(Показано на изображении).A - оригинальная редакция документа.B тот, с изменениями.C - это то, что я хотел бы отобразить, чтобы выделить изменения, а D - то, чего я могу достичь в настоящее время.Idea of the revision display

У меня была идея, где я мог бы каким-то образом использовать вычитание изображений и полученное изображение и каким-то образом добавить его к основному изображению.Я очень плохо знаком с компьютерным зрением, поэтому я не уверен в правильности всех терминов.Я думал о том, чтобы это изображение вычитания служило маской для исправленного изображения, повернуло все черные пиксели красным, а затем добавило это к «оригиналу».

Вот фрагмент кода, который сгенерируетвывод аналогичен таковому в блоке 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)

После выполнения шага вычитания у меня остался черныйи белое изображение.И после добавления к базовому изображению, чтобы увидеть ревизии, я остаюсь с темным изображением.Я думаю, что после шага вычитания нужно что-то сделать, чтобы черные были прозрачными, а белые линии стали красными, но я не уверен, как этого добиться.

1 Ответ

2 голосов
/ 02 июля 2019

Это один из способов подойти к этому. Сначала изображения загружаются в оттенках серого. Они инвертированы, поэтому фон черный (значение 0), линии белые (значение 255). Теперь вы можете вычесть A из B, чтобы получить строки / символы, которые были добавлены в B (относительно A). Вы можете использовать полученную маску, чтобы изменить цветную версию A, чтобы отобразить то, что добавил B.

Результат:

enter image description here

Обратите внимание на наложение, потому что я использовал предоставленное вами изображение. Учитывая результат, который вы получили в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...