ฟังก์ชั่นใดจาก Python Imaging Library ที่จะช่วยฉันค้นหาความแตกต่างระหว่าง 2 รูปภาพ

ฉันกำลังดูเอกสาร 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. หมายเหตุ - ฉันปรับขนาดภาพที่ 2 โดยใช้ตัวปรับขนาดออนไลน์ PIL ทำให้ฉันมีปัญหาเกี่ยวกับความแตกต่างของขนาด...

ป้อนคำอธิบายรูปภาพที่นี่


person whatwhatwhat    schedule 23.12.2016    source แหล่งที่มา
comment
จำเป็นต้องทำด้วยฟังก์ชัน PIL หรือไม่? สิ่งที่คุณพยายามทำคือการลบอาร์เรย์ ดังนั้นไลบรารีเชิงอาร์เรย์จึงเหมาะอย่างยิ่งสำหรับจุดประสงค์นี้ เช่น นัมปี้   -  person Jalo    schedule 23.12.2016
comment
@Jalo ไม่จำเป็นต้องเป็น PIL เพราะเห็นว่านี่เป็นเพียงโครงการสร้างสรรค์ที่สนุกสนานของฉัน   -  person whatwhatwhat    schedule 23.12.2016


คำตอบ (1)


ฉันคิดว่าสิ่งที่คุณกำลังมองหาเรียกว่าการลงทะเบียนรูปภาพ คุณต้องการทราบว่าคุณต้องเลื่อนภาพหนึ่งภาพเพื่อให้ได้อีกภาพหนึ่งมากแค่ไหน แล้วคุณก็ลบแบบง่ายๆ ได้ มีวิธีการที่แตกต่างกันในการทำเช่นนี้ วิธีที่ง่ายที่สุดคือใช้กำลังดุร้าย (ดูโค้ดด้านล่าง) ฉันกำลังปรับแต่งภาพเพื่อลดปัญหาอันเนื่องมาจากความแปรผันของความเข้มของแสง

ทางเลือกอื่นคือการใช้วิธีการจัดตำแหน่งที่ซับซ้อนมากขึ้น มีการใช้งานบางอย่างใน opencv 1, 2 หรือคุณสามารถใช้วิธีการตาม 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
ฉันจะใช้สำหรับ Ibig และ Ismall ได้อย่างไร ฉันลอง Ismall = Image.open("cat1.PNG") และ Ibig = Image.open("cat2.PNG") แล้ว แต่สิ่งนี้ทำให้ฉันมีข้อผิดพลาดประเภทที่ไม่สามารถสั่งซื้อได้ - person whatwhatwhat; 25.12.2016
comment
โปรดทราบว่าเป้าหมายสุดท้ายไม่ใช่เพียงการจัดวางรูปภาพ 2 รูปให้ตรงกันเท่านั้น ฉันต้องการทราบว่าต้องเพิ่มบรรทัดใดบ้างในรูปภาพที่ 1 เพื่อสร้างรูปภาพที่ 2 - person whatwhatwhat; 26.12.2016