golang Image similarity comparison
目前网上找了很多的 图片相似 查找两张图片不同的部分,实现图像比较和标记以显示不同 ,很多都是python写的,没有找到go语言写的,所以想自己写一个
图片A 为参照物,去寻找图片B 的最佳重合位置,然后再查找图片的不同之处。这一步暂时未做,以后如果有时间或者相关需要 再写。 目前图片轮廓相同 未裁剪。 目前设想,可以截取图片A的部分 取匹配到图片B的位置上,然后再对比两个范围内的像素。
代码未优化 ,需改进。
AverageHash DifferenceHash PerceptionHash 三种常用算法,适合比对相似图片,我们是求差别。这三种算法,作为图片的相似性识别挺好。但是用来找差异,有些处理结果让人费解。
这是方式一 go/ImageDifferenceHash.go at main · shuidaan/go · GitHub
package main
import (
"errors"
"fmt"
"github.com/corona10/goimagehash"
"image"
"image/color"
"image/draw"
"image/jpeg"
"os"
"sort"
"strconv"
"time"
)
type outline struct {
x int
y int
}
type Outlinesort []outline
type Outlinesortx []outline
func (o Outlinesort) Len() int {
//返回传入数据的总数
return len(o)
}
func (o Outlinesort) Swap(i, j int) {
//两个对象满足Less()则位置对换
//表示执行交换数组中下标为i的数据和下标为j的数据
o[i], o[j] = o[j], o[i]
}
func (o Outlinesort) Less(i, j int) bool {
//按字段比较大小,此处是降序排序
//返回数组中下标为i的数据是否小于下标为j的数据
return o[i].y < o[j].y
}
func (o Outlinesortx) Len() int {
//返回传入数据的总数
return len(o)
}
func (o Outlinesortx) Swap(i, j int) {
//两个对象满足Less()则位置对换
//表示执行交换数组中下标为i的数据和下标为j的数据
o[i], o[j] = o[j], o[i]
}
func (o Outlinesortx) Less(i, j int) bool {
//按字段比较大小,此处是降序排序
//返回数组中下标为i的数据是否小于下标为j的数据
return o[i].x < o[j].x
}
func main() {
file1, _ := os.Open("E:\\wq\\img\\a0.jpg")
file2, _ := os.Open("E:\\wq\\img\\a8.jpg")
defer file1.Close()
defer file2.Close()
img1, _ := jpeg.Decode(file1)
img2, _ := jpeg.Decode(file2)
width, high := img1.Bounds().Dx(),img1.Bounds().Dy()
var status,same, gap, z,h,w int = 0,1,1,0,8,8 //status same划线状态,gap允许色差 z多少个差别 h单个色块高 w单个色块宽
var outlines []outline = make([]outline,0,(width+high)/64)
b := img1.Bounds()
//根据b画布的大小新建一个新图像
m := image.NewRGBA(b)
draw.Draw(m, b, img1, b.Min, draw.Over)
测试被裁剪的小图是否全部加入对比
//sb1 := img1.Bounds()
根据b画布的大小新建一个新图像
//sm1 := image.NewRGBA(sb1)
//
//sb2 := img1.Bounds()
根据b画布的大小新建一个新图像
//sm2 := image.NewRGBA(sb2)
for i:= 0;i < width ; i+=w {
for j:=0 ; j < high ; j+=h {
subimg1,err := clip(img1,i,j,w,h)
if err != nil {
fmt.