golang图像感知哈希计算插件库goimagehash的使用

golang图像感知哈希计算插件库goimagehash的使用

goimagehash是一个用Go语言编写的图像哈希计算库,支持多种哈希算法:

  • 平均哈希(Average hashing)
  • 差异哈希(Difference hashing)
  • 感知哈希(Perception hashing)
  • 小波哈希(Wavelet hashing) [TODO]

安装

go get github.com/corona10/goimagehash

使用示例

下面是一个完整的使用示例,展示了如何使用goimagehash计算图像哈希并比较图像相似度:

package main

import (
	"bufio"
	"bytes"
	"fmt"
	"image/jpeg"
	"os"

	"github.com/corona10/goimagehash"
)

func main() {
	// 打开两个图像文件
	file1, _ := os.Open("sample1.jpg")
	file2, _ := os.Open("sample2.jpg")
	defer file1.Close()
	defer file2.Close()

	// 解码JPEG图像
	img1, _ := jpeg.Decode(file1)
	img2, _ := jpeg.Decode(file2)

	// 计算平均哈希并比较
	hash1, _ := goimagehash.AverageHash(img1)
	hash2, _ := goimagehash.AverageHash(img2)
	distance, _ := hash1.Distance(hash2)
	fmt.Printf("AverageHash - 图像距离: %v\n", distance)

	// 计算差异哈希并比较
	hash1, _ = goimagehash.DifferenceHash(img1)
	hash2, _ = goimagehash.DifferenceHash(img2)
	distance, _ = hash1.Distance(hash2)
	fmt.Printf("DifferenceHash - 图像距离: %v\n", distance)

	// 计算扩展平均哈希(可自定义宽度和高度)
	width, height := 8, 8
	hash3, _ := goimagehash.ExtAverageHash(img1, width, height)
	hash4, _ := goimagehash.ExtAverageHash(img2, width, height)
	distance, _ = hash3.Distance(hash4)
	fmt.Printf("ExtAverageHash - 图像距离: %v\n", distance)
	fmt.Printf("hash3 位大小: %v\n", hash3.Bits())
	fmt.Printf("hash4 位大小: %v\n", hash4.Bits())

	// 哈希序列化和反序列化示例
	var b bytes.Buffer
	foo := bufio.NewWriter(&b)
	_ = hash4.Dump(foo) // 序列化哈希
	foo.Flush()
	bar := bufio.NewReader(&b)
	hash5, _ := goimagehash.LoadExtImageHash(bar) // 反序列化哈希
	fmt.Printf("反序列化后的哈希: %v\n", hash5)
}

主要功能说明

  1. 哈希计算:

    • AverageHash(): 计算平均哈希
    • DifferenceHash(): 计算差异哈希
    • ExtAverageHash(): 计算可自定义尺寸的扩展平均哈希
  2. 哈希比较:

    • Distance(): 计算两个哈希之间的汉明距离,值越小表示图像越相似
  3. 序列化/反序列化:

    • Dump(): 将哈希序列化到writer
    • LoadExtImageHash(): 从reader加载哈希
  4. 实用方法:

    • Bits(): 获取哈希的位大小

版本更新说明

v1.1.0

  • 提升了感知哈希的性能

v1.0.3

  • 添加了GithubAction工作流
  • 修复了LoadImageHash的GoDoc拼写错误

v1.0.2

  • 使用go.mod进行安装

v1.0.1

  • 减少了感知/扩展感知哈希的创建时间

v1.0.0

  • 提供了更灵活的扩展哈希API
  • 添加了新的序列化API
  • 弃用了ExtImageHashFromString和ImageHashFromString
  • 添加了Bits API来测量哈希的实际位大小

这个库非常适合用于图像相似度比较、重复图像检测等场景。通过计算图像哈希并比较哈希距离,可以快速判断图像的相似程度。


更多关于golang图像感知哈希计算插件库goimagehash的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang图像感知哈希计算插件库goimagehash的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoImageHash - Golang图像感知哈希计算库

GoImageHash 是一个用于计算图像感知哈希(Perceptual Hash)的Golang库,它可以计算多种类型的图像哈希值,用于图像相似度比较、重复图片检测等场景。

主要特性

  • 支持多种哈希算法:Average Hash, Difference Hash, Perception Hash
  • 简单易用的API
  • 支持图像相似度比较
  • 纯Go实现,无外部依赖

安装

go get -u github.com/corona10/goimagehash

基本使用示例

1. 计算图像哈希

package main

import (
	"fmt"
	"image/jpeg"
	"os"

	"github.com/corona10/goimagehash"
)

func main() {
	file1, _ := os.Open("image1.jpg")
	defer file1.Close()
	
	img1, _ := jpeg.Decode(file1)
	
	// 计算Average Hash
	ahash, _ := goimagehash.AverageHash(img1)
	fmt.Printf("Average Hash: %x\n", ahash.GetHash())
	
	// 计算Difference Hash
	dhash, _ := goimagehash.DifferenceHash(img1)
	fmt.Printf("Difference Hash: %x\n", dhash.GetHash())
	
	// 计算Perception Hash
	phash, _ := goimagehash.PerceptionHash(img1)
	fmt.Printf("Perception Hash: %x\n", phash.GetHash())
}

2. 比较图像相似度

package main

import (
	"fmt"
	"image/jpeg"
	"os"

	"github.com/corona10/goimagehash"
)

func main() {
	// 打开并解码第一张图片
	file1, _ := os.Open("image1.jpg")
	defer file1.Close()
	img1, _ := jpeg.Decode(file1)
	
	// 打开并解码第二张图片
	file2, _ := os.Open("image2.jpg")
	defer file2.Close()
	img2, _ := jpeg.Decode(file2)
	
	// 计算哈希值
	hash1, _ := goimagehash.AverageHash(img1)
	hash2, _ := goimagehash.AverageHash(img2)
	
	// 计算汉明距离
	distance, _ := hash1.Distance(hash2)
	fmt.Printf("Hamming Distance: %d\n", distance)
	
	// 判断是否相似(阈值可根据需求调整)
	if distance < 5 {
		fmt.Println("Images are similar")
	} else {
		fmt.Println("Images are different")
	}
}

哈希算法说明

  1. Average Hash (aHash)

    • 将图像缩小到8x8尺寸
    • 转换为灰度图
    • 计算像素平均值
    • 生成哈希:大于平均值为1,否则为0
  2. Difference Hash (dHash)

    • 将图像缩小到9x8尺寸
    • 转换为灰度图
    • 计算每行相邻像素差值
    • 生成哈希:左边像素比右边亮为1,否则为0
  3. Perception Hash (pHash)

    • 将图像缩小到32x32尺寸
    • 转换为灰度图
    • 应用DCT变换
    • 取左上角8x8的DCT系数
    • 计算中值并生成哈希

高级用法

自定义哈希大小

// 创建16x16的Average Hash
hash, _ := goimagehash.ExtAverageHash(img1, 16, 16)

保存和加载哈希

// 将哈希转换为字符串保存
hashStr := hash.ToString()

// 从字符串加载哈希
loadedHash, _ := goimagehash.ImageHashFromString(hashStr)

性能建议

  1. 对于大量图片比较,建议预先计算并存储哈希值

  2. 不同哈希算法适用于不同场景:

    • aHash: 计算快,适合快速去重
    • dHash: 对图像变化更敏感
    • pHash: 更准确但计算量稍大
  3. 汉明距离阈值建议:

    • 0-5: 非常相似或相同图片
    • 5-10: 可能相似
    • 10: 不同图片

总结

GoImageHash 提供了简单而强大的图像感知哈希计算功能,适用于图像去重、相似图片搜索等场景。通过选择合适的哈希算法和阈值,可以平衡精度和性能需求。

在实际应用中,可以结合数据库存储哈希值,实现高效的图像检索系统。对于更复杂的图像识别需求,可能需要结合深度学习等其他技术。

回到顶部