go 图片相似 查找两张图片不同的部分 找出两幅图片中的不同处

本文介绍了使用Go语言进行图像相似性比较的方法,探讨了AverageHash、DifferenceHash和PerceptionHash三种算法在寻找图片差异上的局限性,并提供了两种实现方式的代码链接,包括直接逐个像素点对比和更复杂的方法,但指出代码有待优化和改进。
摘要由CSDN通过智能技术生成

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值