Учитывая два изображения одной и той же сцены с потенциальным выравниванием, фокусировкой, различием освещения и шумом, я ищу операцию, которую я могу запустить на этих изображениях, которая создает другое изображение разницы между ними, которое минимизирует эти различия или больше чувствительны к структурным различиям между ними, чем глобальные различия. Моей первоначальной мыслью было сравнение между соответствующими окрестностями вокруг пикселя на изображении A, и один и тот же пиксель на изображении B мог бы работать.
Эта функция уже реализована в OpenCV или какой-либо другой библиотеке Python (scipy, numpy et c)?
Мои размышления:
Простой разница кадров скажет мне, где возникают абсолютные различия, но очень хрупкая для выравнивания, различия в освещении. Может быть, есть способ найти стандартное отклонение по окрестности пикселя. Std Numpy работает только по оси ...
Кажется, что я хочу корреляцию между двумя сигналами, но я не знаю, как расширить это до неповторяющегося 2D мир. scipy.signal.correlate2d похоже, что это может сработать, если бы был эффективный способ просто передать ему соответствующие окрестности. Тем не менее, я не очень хорошо понимаю, что происходит под капотом.
A свертка одного изображения, где ядро происходит из соответствующих мест на других изображениях, даст сравнение, которое бы хорошо справлялось с проблемами шума и фокусировки, но я не знаю, как использовать dynamici c ядро для свертки.
Если бы у меня была библиотека в основном идентичных изображений (не оригинальное предположение, но выполнимое) для сравнения одного изображения, я мог бы использовать среднюю разницу или смесь гауссиан . Но я не думаю, что это поможет с выравниванием или освещением. Я мог сначала выровнять изображение, а затем сделать сравнение.
Согласно приведенному ниже комментарию, я посмотрел метод SSIM (индекс структурного сходства), который используется для измерения ухудшения изображения из-за таких вещей, как сжатие с потерями и декомпрессия. На самом деле он ожидает две копии одного и того же изображения - один источник правды, другой в потенциально ухудшенном состоянии из-за сжатия с потерями и декомпрессии. Этот метод мягок в отношении глобального смещения (освещения), который хорош, но чувствителен к шуму (по конструкции) и особенно чувствителен к смещению.
Комментарий привел меня к MSE , который действует глобально, но если перебирать изображение по окрестности, он дает хороший результат - нечувствителен к смещению, шуму, но не структурным различиям. Однако он довольно чувствителен к различиям выравнивания и очень медленный в python ...
# Mean Squared Error
def mse(imageA, imageB):
return np.mean((imageA - imageB)**2)
from scipy import misc
import numpy as np
face = misc.face()
nface = np.array(face)
nface[295:305,395:415] = face[195:205,495:515] #discontinuous region
nface = cv2.blur(nface, (3,3)) # focus effects
nface = nface + (np.random.randn(*face.shape) * 10 - 5) # noise
nface = (nface * .9 + 20).astype(int) #lighting
n = m = 3
output = np.zeros(face.shape[:2])
for i in range(face.shape[0]):
for j in range(face.shape[1]):
if i > n and i < face.shape[0]-n and j > m and j < face.shape[1]-m:
output[i,j] = mse(nface[i-n:i+n, j-m:j+m], face[i-n:i+n, j-m:j+m])
Является ли это распространенным методом обработки изображений? Есть имя для этого или оптимизированная реализация в openCV или Numpy?