Как извлечь шум из двух похожих изображений? - PullRequest
2 голосов
/ 13 февраля 2020

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

Original Image

Captured using webcam pointing to monitor displaying original image

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

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

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

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

enter image description here

Код

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 улавливает смещенные пиксели

0 голосов
/ 13 февраля 2020

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

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

...