2015-09-20 2 views
2

В пакете go image, я не вижу методов, которые можно использовать для сравнения двух изображений? Можно ли сравнивать изображение в go, похожее на ImageMagick?Как сравнить изображения с go?

+2

может быть, это поможет вам: http://codereview.stackexchange.com/questions/12700/comparing-two-images –

+0

Я пробовал этот подход, используя Resemble.js, и был медленным. Есть ли способ узнать процентные различия между изображениями? – degendra

+2

Стандартная библиотека не содержит такого кода, вам нужно будет выполнить некоторое программирование. – Volker

ответ

1

Если вы пытаетесь сравнить два изображения и просто нужно сварить их до одного числа, будет работать следующее. Это полезно (например) генетических алгоритмов, в которых вы хотите сравнить набор кандидатов и выбрать тот, который отличается по меньшей мере от эталонного изображения:

  1. Посетите каждый пиксель, разбить его на части: R, G, B, & A (in go: image.At(x,y).RGBA())
  2. Вычитайте VGB-данные из соответствующих пикселей пикселов в эталонном изображении.
  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 
} 
Смежные вопросы