如何将图像与go进行比较?

In go image package, i don't see any methods which can be used to compare two images? Is it possible to do image comparison in go similar to ImageMagick?

If you are trying to compare two images and just need to boil it down to a single number, the following will work. This is useful in (for example) genetic algorithms, where you want to compare a set of candidates and choose the one that differs the least from a reference image:

  1. Visit every pixel, break it down into its parts: R, G, B, & A (in go: image.At(x,y).RGBA())
  2. Subtract the RGBA vals from their corresponding pixel vals in the reference image.
  3. Square the differences, add them up.
  4. Take the square root of the total sum.

This number will give you a rough idea of how much the images differ.

If you know that the two images are both instances of image.RGBA (or you can convert them), then you can do something even faster: just grab the bytes directly from RGBA.Pix. That's what I do here, and it's roughly 10x faster than doing img.At(x,y).RGBA() for every pixel pair:

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
}