Я не думаю, что интегральный образ является наиболее адекватным инструментом для этой задачи. Обнаружение изменений интенсивности в ROI может быть легко реализовано путем сравнения значений интенсивности в ROI с помощью any
и нарезка, как показано ниже.
Для начала импортируем необходимые модули и загружаем несколько примеров изображений:
import numpy as np
from skimage import io
import matplotlib.pyplot as plt
reference = io.imread('https://i.stack.imgur.com/9fmvl.png')
same = io.imread('https://i.stack.imgur.com/u1wlT.png')
changed = io.imread('https://i.stack.imgur.com/H2dIu.png')
Вот как выглядят изображения:
fig, [ax0, ax1, ax2] = plt.subplots(1, 3)
ax0.imshow(reference)
ax0.axis('off')
ax0.set_title('Reference')
ax1.imshow(same)
ax1.axis('off')
ax1.set_title('Same')
ax2.imshow(changed)
ax2.axis('off')
ax2.set_title('Changed')
plt.show(fig)
Затем мы определяем функцию, которая возвращает True
всякий раз, когда есть хотя бы один пиксель области интереса, интенсивность которого на тестовом изображении отличается от интенсивности эталонного изображения:
def detect_change(ref, img, roi):
upper, left, lower, right = roi
return np.any(ref[upper:lower, left:right] != img[upper:lower, left:right])
Наконец, нам просто нужно настроить ROI (красный квадрат) и вызвать detect_change
с соответствующими аргументами:
In [73]: roi = [32, 32, 96, 96]
In [74]: detect_change(reference, same, roi)
Out[74]: False
In [75]: detect_change(reference, changed, roi)
Out[75]: True
08.02.2018