Какие функции из библиотеки изображений Python помогут мне найти разницу между двумя изображениями?

Я просматриваю документы Python Imaging Library, чтобы найти способ сделать 2 похожих изображения и " вычесть одно из другого ". Вот наглядное пособие:

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

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

Мы все видели эти изящные вещи, «превращающие слово в его значение», верно? Я хочу взять второе изображение и вычесть первое изображение, поэтому я хочу вернуть только строки, добавленные к слову «кошка», чтобы создать настоящего кота. Какие функции мне в этом помогут?

Обновление: я постоянно работал над этим, пока ждал. Это то, что я пробовал.

import numpy as np
from PIL import Image
from PIL import ImageChops
import math,operator, matplotlib.cm as cm

img1 = Image.open("cat1.PNG")
img2 = Image.open("cat2.PNG")


img1array = (list(img1.getdata()))
img1new = Image.fromarray(np.uint8(cm.gist_earth(img1array)*255))

img2array = (list(img2.getdata()))
img2new = Image.fromarray(np.uint8(cm.gist_earth(img2array)*255))

dif = np.fabs(np.subtract(img2array[:], img1array[:]))

difimg = Image.fromarray(np.uint8(cm.gist_earth(dif)*255))

difimg.save("out1.PNG")

Однако это выводит файл, который Windows 10 даже не может открыть. Моя идея заключалась в том, чтобы преобразовать оба изображения в массив, вычесть их, а затем воссоздать разницу в виде изображения. Это действительно сохраняет файл с именем out1.PNG, но Windows выдает ошибку при попытке его открыть: We can't open this file. Примечание. Я изменил размер второго изображения с помощью онлайн-средства изменения размера, PIL вызывал у меня проблемы с различиями в размерах ...

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


person whatwhatwhat    schedule 23.12.2016    source источник
comment
Обязательно ли это делать с помощью функции PIL? То, что вы пытаетесь сделать, - это вычитание массивов, и поэтому библиотека, ориентированная на массивы, очень хорошо подходит для этой цели, например. NumPy   -  person Jalo    schedule 23.12.2016
comment
@Jalo, это не обязательно PIL, потому что это просто мой забавный творческий проект   -  person whatwhatwhat    schedule 23.12.2016


Ответы (1)


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

Другой альтернативой является использование более сложного метода выравнивания. Некоторые из них реализованы в opencv 1, 2, или вы можете использовать метод, основанный на БПФ.

import numpy as np
import matplotlib.pylab as plt


th = 170 #arbitrary threshold, you can use automatic methods like otsu or even better some adaptative thresholding.
Ibth = (Ibig < th).astype(np.int)
Isth = (Ismall < th).astype(np.int)

dxt = (Ibth.shape[1] - Isth.shape[1])-1
dyt = (Ibth.shape[0] - Isth.shape[0])-1

xdiff = np.zeros((dyt, dxt))

S = Isth.shape
for dx in range(dxt):
    for dy in range(dyt):

        dpix = Isth-Ibth[dy:(S[0]+dy), dx:(S[1]+dx)]

        #I am only considering pixels that get overlaped in the bigger image.
        #The non-uniform illumination spoils minimization if I use np.abs.
        #This could be corrected using opencv adaptativeThreshold
        xdiff[dy,dx] = np.sum(dpix>0)

#find the global minima
im_shift = np.unravel_index(xdiff.argmin(), xdiff.shape)

#show the result
im_diff = np.copy(Ibth).astype(np.int)
im_diff[im_shift[0]:(S[0]+im_shift[0]), im_shift[1]:(S[1]+im_shift[1])] -= Isth


plt.figure()

plt.subplot(2,2,1)
plt.imshow(Ib,  cmap='gray', interpolation='none')

plt.subplot(2,2,3)
plt.imshow(Is,  cmap='gray', interpolation='none')

plt.subplot(1,2,2)
plt.imshow(im_diff,  cmap='gray', interpolation='none')
person ver228    schedule 24.12.2016
comment
Что я использую для Ibig и Ismall? Я пробовал Ismall = Image.open("cat1.PNG") и Ibig = Image.open("cat2.PNG"), но это дало мне ошибку неупорядочиваемых типов. - person whatwhatwhat; 25.12.2016
comment
Обратите внимание, что конечная цель - не просто выровнять 2 изображения. Я хочу знать, какие строки нужно добавить к первому изображению, чтобы создать второе изображение. - person whatwhatwhat; 26.12.2016