go计算图片相似度

870 阅读1分钟

一、前言

公司需要获取两张图片的相似度

二、过程

我查了资料发现,几乎都是基于OpenCV来完成,OpenCV安装扩展比较麻烦,想着能不能使用粗暴点的方式完成。 问了chatgpt,他说可以通过像素比较法,于是想着遍历像素来计算差异

三、实践

// 主要函数
func compareImages(img1, img2 image.Image) float64 {
    // 获取图片的边界
    bounds := img1.Bounds()
    // 获取图片的宽和高
    w, h := bounds.Max.X, bounds.Max.Y
    // 初始化差异值
    var diff float64
    // 遍历每个像素点
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            // 获取第一个图片的像素点的RGBA值
            r1, g1, b1, _ := img1.At(x, y).RGBA()
            // 获取第二个图片的像素点的RGBA值
            r2, g2, b2, _ := img2.At(x, y).RGBA()
            // 计算每个像素点的差异值
            diff += math.Abs(float64(r1)-float64(r2)) / 0xffff
            diff += math.Abs(float64(g1)-float64(g2)) / 0xffff
            diff += math.Abs(float64(b1)-float64(b2)) / 0xffff
        }
    }
    // 计算图片的像素点总数
    nPixels := w * h
    // 计算图片的相似度得分,3是RPG颜色通道
    score := diff / (3 * float64(nPixels))
    return 1 - score
}

示例

完整代码github image.png image.png