Как извлечь шум из двух одинаковых изображений?

У меня есть два похожих (не идентичных) изображения. Один с шумом, а другой оригинальный без шума. Я хочу извлечь шум по разнице обоих изображений и добавить извлеченный шум к исходному изображению, чтобы оба изображения были идентичными. Исходное изображение захвачено цифровой камерой. Зашумленное изображение снято с монитора (отображающего исходное изображение) с помощью веб-камеры.

Исходное изображение

Снято с помощью веб-камеры, направленной на монитор, на котором отображается исходное изображение

import cv2

orig_image = cv2.imread("./00029_68.jpg")
cam_image = cv2.imread("/home/ankit/Captured_using_webcam.png")

cv2.imshow("Subtracted Image : cam_image - orig_image", 
cv2.subtract(cam_image, orig_image))
cv2.waitKey(0)
cv2.destroyAllWindows()

person Mitesh Patel    schedule 13.02.2020    source источник
comment
Не могли бы вы привести минимальный рабочий пример?   -  person kalzso    schedule 13.02.2020
comment
Код обновлен в посте.   -  person Mitesh Patel    schedule 13.02.2020
comment
Похоже на передачу стиля. Шум — это стиль второго изображения, который комбинируется с исходным изображением.   -  person B200011011    schedule 14.02.2020


Ответы (2)


Чтобы найти различия между двумя изображениями, вы можете использовать Индекс структурного подобия (SSIM), который был представлен в Оценка качества изображения: от видимости ошибок до структурного сходства. Этот метод уже реализован в scikit-image. библиотека для обработки изображений. Вы можете установить scikit-image с pip install scikit-image.

Используя функцию compare_ssim() из scikit-image, он возвращает score и разностное изображение diff. score представляет индекс структурного сходства между двумя входными изображениями и может находиться в диапазоне [-1,1] со значениями, близкими к единице, представляющей более высокое сходство. Но поскольку вас интересует только то, где различаются два изображения, изображение diff то, что вы ищете. Изображение diff содержит фактические различия между двумя изображениями.

Вот фактические различия между двумя изображениями. Рассмотрите возможность использования изображений .png, так как они не имеют потерь. .jpg изображений с потерями и шумами из-за сжатия изображения.

введите здесь описание изображения

Код

from skimage.measure import compare_ssim
import cv2

# Load images
image1 = cv2.imread('1.jpg')
image2 = cv2.imread('2.jpg')

# Convert images to grayscale
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

# Compute SSIM between two images
(score, diff) = compare_ssim(image1_gray, image2_gray, full=True)
# The diff image contains the actual image differences between the two images
# and is represented as a floating point data type in the range [0,1] 
# so we must convert the array to 8-bit unsigned integers in the range
# [0,255] before we can use it with OpenCV
diff = (diff * 255).astype("uint8")

cv2.imshow('diff',diff)
cv2.waitKey()

Примечание. Два исходных изображения не совсем одинаковы, они немного сдвинуты, поэтому SSIM улавливает смещенные пиксели.

person nathancy    schedule 13.02.2020

Я не уверен, что вы осознаете всю сложность вашей проблемы. Ваши проблемы: - Разное разрешение оригинала и "шумного" изображения - Ошибка перевода - Перспективное искажение при съемке оригинала

Теоретически вы можете найти инструменты для обработки изображений в cv2, которые могут справиться с этими проблемами. Когда вы сможете избавиться от искажений, вы можете просто применить код, который вы разместили, чтобы увидеть шум в результате систематических ошибок камеры, монитора и всех вычислений, которые вы сделали.

person Meredith    schedule 13.02.2020