2015-09-20 32 views
2

在旅途中image包,我看不出它可以用來比較兩個圖像的任何方法呢?是否可以像ImageMagick那樣進行圖像比較?如何比較圖像和去?

+2

也許這可以幫助您:http://codereview.stackexchange.com/questions/12700/comparing-two-images –

+0

我用Resemble.js嘗試了這種方法,速度很慢。有什麼方法可以找出圖像之間的百分比差異嗎? – degendra

+2

標準庫不包含這樣的代碼,你將不得不做一些編程。 – Volker

回答

1

如果你想比較兩個圖像,並只需要熬它歸結爲一個單一的數字,下面的工作。這是(例如)遺傳算法,要比較一組候選人,並選擇不同的至少從一個參考圖像的一個有用:

  1. 訪問的每一個像素,把它分解成其組成部分: R,G,B,& A(在去:image.At(x,y).RGBA()
  2. 減去從它們對應的像素的瓦爾斯RGBA瓦爾斯參考圖像英寸
  3. 廣場上的差異,它們加起來。
  4. 取的總和的平方根。

這個數字會給你的形象有多大區別一個大概的瞭解。

如果你知道這兩個圖像都是image.RGBA的實例(或者你可以轉換它們),那麼你可以做更快的事情:直接從RGBA.Pix獲取字節。這就是我在這裏做的,它的大致10倍比做img.At(x,y).RGBA()每一個像素對更快:

func FastCompare(img1, img2 *image.RGBA) (int64, error) { 
    if img1.Bounds() != img2.Bounds() { 
     return 0, fmt.Errorf("image bounds not equal: %+v, %+v", img1.Bounds(), img2.Bounds()) 
    } 

    accumError := int64(0) 

    for i := 0; i < len(img1.Pix); i++ { 
     accumError += int64(sqDiffUInt8(img1.Pix[i], img2.Pix[i])) 
    } 

    return int64(math.Sqrt(float64(accumError))), nil 
} 

func sqDiffUInt8(x, y uint8) uint64 { 
    d := uint64(x) - uint64(y) 
    return d * d 
}