簡體   English   中英

我如何使用 pil 在 python 中查看兩個圖像之間的區別?

[英]how do i see the difference between two images in python using pil?

我正在嘗試制作一個程序,它可以從我的 macbook 的相機(或任何相機)中查看並讓我知道發生了什么事情(燈光打開/關閉、任何動作等),該程序每 1 秒截取一次屏幕截圖並比較最后一張照片是用剛剛拍攝的照片拍攝的。

這是我的 while 循環中的代碼

while True:
    time.sleep(1)

    image = capture_image()

    if last_image == None:
        last_image = image

    # compare the two images

    print('image', image)
    print('last image', last_image)
    print('')

    last_image = image

這是一個了解 2 張圖片之間差異的示例。也許它可以解決您的問題。

from PIL import Image
from PIL import ImageChops
img1 = Image.open(yourPath)
img2 = Image.open(yourPath)
# make sure img1,img2 have the same picture width and height.
diff = ImageChops.difference(img1, img2)
diff.show()

在您的情況下,這可能有效。

from PIL import ImageChops
While True:
    time.sleep(1)

.......

    diff = ImageChops.difference(Now_Image,Last_Image)
    If diff.getbbox() is None:
        print("Now_Image and Last_Image are same.")    
    # diff.show()
    # or you can handle the diff picture.

diff Image 將顯示這些圖片之間的差異。 兩張圖片之間的差異將向您展示,相同的組件將是黑色的。

這會給你兩個圖像的差異,但你當然想增加一些容差,也許通過統計測量。 不過,我不確定您是否想使用實時圖像,也許可以通過捕獲圖像然后稍后獨立運行腳本來分離您的關注點。 但這取決於您的應用目的。

from PIL import Image
import numpy as np

image1Url = "./img1.jpg"
image2Url = "./img2.jpg"
image1  = Image.open(image1Url)
image2  = Image.open(image2Url)

analyze_img1 = np.asarray(image1)
analyze_img2 = np.asarray(image2)

substr_img  = analyze_img1 - analyze_img2

last_image  = Image.fromarray(substr_img)

last_image.show()

你的問題在某種程度上暗示你處於這個項目的初始階段,事情有點模糊,所以我只是把一些一般性的想法放在一起,直到你走得更遠。

  1. 考慮遷移到OpenCV,因為它具有大量有用的功能,並且在 Stack Overflow 上有很多示例。 查找cv2.VideoCapture()以獲取您的相機流,並使用cv2.imshow()cv2.waitKey()來顯示您的幀。 PIL 不太適合顯示動態變化的圖像,例如視頻, cv2.imshow()會為您提供更好的服務。 此外,您會發現自己將 PIL 圖像轉換為 Numpy 數組進行處理,因此您不妨使用 OpenCV 並直接使用 Numpy 數組。

  2. 如果您想檢測光照變化,請嘗試將您的圖像轉換為灰度cv2.cvtColor(...BGR2GRAY...)並使用np.mean()取平均值。 嘗試運行您的循環,這看起來是正確的,並在每次迭代時在終端中打印平均值,同時打開和關閉燈。 然后你可以看到它有多少變化並計算出一個合理的閾值。

  3. 至於運動,您可能不是在像素級別尋找運動,否則您會檢測到風在移動窗外可見的葉子。 所以,你想要大規模的改變。 因此,如果您的相機是 1080p (1920x1080),請嘗試使用cv2.resize(im, (16,9),... INTER_LINEAR ...)將您的圖像大小調整為 16 x 9,那么您只有 144 像素可以快速查看並比較圖像。 您始終可以將這些圖像縮放到 300-400 的邊長cv2.resize(...NEAREST_NEIGHBOUR..)以顯示前一幀和當前幀。 然后查看 144 個圖像矩形中的每一個之間的顏色距離,看看它們中的任何一個是否超過了您從測試中得出的閾值。

嘗試開發您的代碼並獲得一些經驗,然后如果遇到問題,請回來再問一個問題 - 問題和答案都是免費的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM