2012-07-02 35 views
0

我正在尋找一種算法來比較兩個圖像(我使用python)。如何比較圖像與python

我找到了PIL庫,numpy/scipy和opencv。我知道如何在灰度,二進制,直方圖,....沒關係,但我不知道我要做的兩個圖像說:「是的,他們是類似的//他們可能類似//他們不匹配「。

你知道正確的方法嗎?

+0

也許這個回答可以幫助你:http://stackoverflow.com/questions/4196453/simple-and-fast-method-to-compare-images-for-similarity – Blubber

回答

1

如果你想檢查它們是否二進制相等,你可以計算它們的校驗和並進行比較。如果你想檢查它們是否以某種其他方式相似,它將會變得更加複雜,並且絕對不適合Stack Overflow上發佈的簡單答案。這取決於你如何定義相似性,但無論如何,這需要良好的編程技巧和大量的代碼編寫。

1

一個簡單的實現方式是聚合兩個圖像之間對應的歸一化像素座標之間的誤差/不相似度。更先進的技術將涉及比較空間特徵(使用feature detection /計算機視覺技術)和顏色分佈/頻率技術。您還可以在比較它們以提供更多容差之前,嘗試縮放圖像(算法上,或者使用硬件/ mipmapping如果3D上下文)。出血邊緣AFAIK是圖像的小波變換/表示。

當然,你也可以搜索,這是否如pHash

0

,我放在一起,在圖像變化的目視檢查腳本現有的庫。結果是一個白色的圖像,除了不同的像素。像素比例越深,差異越大;並且它們被「着色」以顯示顏色變化,例如如果 舊圖像更紅,則diff圖像將顯示青色區域;如果更多地讀取新的 圖像,diff圖像將顯示紅色區域。

唯一的缺陷是速度緩慢,但我相信它可以使用numpy或簡單地使用處理像素組的解析來改進。

#!/usr/bin/env python 

TINT = 1 # exxagerate differences in tone 
MINUTE = 5 # less than "x" points of difference 
INCREASE_MINUTE = 2 # boost of minute differences 

import sys 
from PIL import Image 

img1 = Image.open(sys.argv[1]) 
img2 = Image.open(sys.argv[2]) 

i1 = img1.load() 
i2 = img2.load() 

if img1.size != img2.size: 
    print "Images %s and %s have different sizes, cannot compare" \ 
     % (sys.argv[1], sys.argv[2]) 
    sys.exit(1) 

imgmap = Image.new('RGB', img1.size, "white") 
imap = imgmap.load() 

row_averages = [] 
for y in range(img1.size[1]): 
    for x in range(img1.size[0]): 
      p1 = i1[x, y] 
      p2 = i2[x, y] 
     diffpixel = [255, 255, 255] 

     # color differences 
     diffs = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]] 
     absdiff = reduce(lambda a, b: abs(a) + abs(b), diffs) 
     diffsmag = [a * TINT for a in diffs] 
     diffplus = [max(0, a) for a in diffs] 
     totplus = reduce(lambda a, b: a + b, diffplus) 
     diffminus = [min(0, a) for a in diffs] 

     # apply negative differences (e.g. less red -> take red) 
     diffpixel = [ a + b for a, b in zip(diffpixel, diffminus)] 
     # subtract positive differences (e.g. more red -> take from non-red channels) 
     diffpixel = [ a - totplus for a in diffpixel ] 
     # ... put back what we took from red 
     diffpixel = [ a + b for a, b in zip(diffpixel, diffplus)] 

     if absdiff > 0 and absdiff < MINUTE: 
      # Increase contrast of minute differences 
      diffpixel = [a - INCREASE_MINUTE for a in diffpixel] 
     diffpixel = [max(0, a) for a in diffpixel] 

     imap[x, y] = tuple(diffpixel) 

imgmap.save(sys.argv[3])