Fungsi apa dari Python Imaging Library yang akan membantu saya menemukan perbedaan antara 2 gambar?

Saya sedang mencari dokumen Perpustakaan Pencitraan Python untuk mengetahui cara mengambil 2 gambar serupa dan " kurangi satu dari yang lain". Berikut adalah alat bantu visual:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Kita semua pernah melihat hal-hal bagus tentang "mengubah sebuah kata menjadi maknanya", bukan? Pada dasarnya saya ingin mengambil gambar kedua dan mengurangi gambar pertama, jadi saya hanya ingin mengembalikan garis yang ditambahkan ke kata "kucing" untuk membuat kucing sebenarnya. Fungsi apa yang akan membantu saya melakukan ini?

Pembaruan: Saya telah mengerjakan ini terus menerus sambil menunggu. Inilah yang saya coba.

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

Namun, ini menghasilkan file yang bahkan Windows 10 tidak dapat dibuka. Ide saya adalah mengonversi kedua gambar menjadi array, menguranginya, dan kemudian membuat ulang perbedaannya sebagai gambar. Ini memang menyimpan file bernama out1.PNG, tetapi Windows memberikan kesalahan saat mencoba membukanya: We can't open this file. Catatan - Saya mengubah ukuran gambar ke-2 menggunakan resizer online, PIL memberi saya masalah tentang perbedaan ukuran...

masukkan deskripsi gambar di sini


person whatwhatwhat    schedule 23.12.2016    source sumber
comment
Apakah ini perlu dilakukan dengan fungsi PIL? Apa yang Anda coba lakukan adalah pengurangan array, dan dengan demikian perpustakaan berorientasi array sangat cocok untuk tujuan ini, misalnya. NomorPy   -  person Jalo    schedule 23.12.2016
comment
@Jalo tidak perlu PIL, mengingat ini hanyalah proyek kreatif saya yang menyenangkan   -  person whatwhatwhat    schedule 23.12.2016


Jawaban (1)


Menurut saya apa yang Anda cari disebut pendaftaran gambar. Anda ingin tahu seberapa banyak Anda harus menggeser satu gambar untuk mendapatkan gambar lainnya. Kemudian Anda bisa melakukan pengurangan sederhana. Ada beberapa metode berbeda untuk melakukan ini. Yang paling sederhana adalah menggunakan brute force (lihat kode di bawah). Saya melakukan ambang batas gambar untuk mengurangi masalah akibat variasi intensitas pencahayaan.

Alternatif lain adalah dengan menggunakan metode penyelarasan yang lebih canggih. Ada beberapa yang diimplementasikan di opencv 1, 2, atau Anda dapat menggunakan metode berdasarkan FFT.

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
Apa yang saya gunakan untuk Ibig dan Ismall? Saya mencoba Ismall = Image.open("cat1.PNG") dan Ibig = Image.open("cat2.PNG") tetapi ini memberi saya kesalahan tipe yang tidak dapat diurutkan. - person whatwhatwhat; 25.12.2016
comment
Harap dicatat bahwa tujuan akhirnya bukan sekadar menyelaraskan 2 gambar. Saya ingin tahu garis apa yang perlu ditambahkan pada gambar pertama untuk membuat gambar ke-2. - person whatwhatwhat; 26.12.2016