一、前言
公司需要获取两张图片的相似度
二、过程
我查了资料发现,几乎都是基于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
}