Выделите различия формы между двумя изображениями с изменением цвета - PullRequest
3 голосов
/ 09 июля 2019

Я пытаюсь сделать мой код более надежным по сравнению с моей первой ревизией.Цель состоит в том, чтобы создать окончательное одиночное изображение, сравнивая изображение 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

Чтобы исправить это, я получил некоторую помощь от 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 A Test Image B

1 Ответ

1 голос
/ 10 июля 2019

Вы почти на месте, но вам нужно создать два отдельных diff-файла. Одна разница представляет черные пиксели, которые находятся в A, но не в B, а другая разница представляет черные пиксели, которые находятся в B, но не в A.

Результат: enter image description here

import cv2
import numpy as np

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

# create two diffs, A - B and B - A
diff1 = cv2.subtract(imgB_inv, imgA_inv)
diff2 = cv2.subtract(imgA_inv, imgB_inv)
# create a combined image of the two inverted 
combined = cv2.add(imgA_inv, imgB_inv)
combined_inv = cv2.bitwise_not(combined)
# convert the combined image back to rbg, 
# so that we can modify individual color channels
combined_rgb = cv2.cvtColor(combined_inv, cv2.COLOR_GRAY2RGB)
# split combined image into blue,green,red color channels
b,g,r = cv2.split(combined_rgb)
# merge channels back into image, adding the first diff to
# the red channel and the second diff to the blue channel
res = cv2.merge((b+diff2,g,r+diff1))
# display result
cv2.imshow('Result',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...