Go语言如何判断两张图片的相似度

2025-06-10 15:50

本文主要是介绍Go语言如何判断两张图片的相似度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:

  • 图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个社交媒体平台的运营,每天要处理数万张图片。重复图片不仅占用存储空间,还会影响用户体验。
  • 内容审核:一些平台需要筛选相似或重复的内容,防止版权侵犯和内容垃圾。
  • 版权维 权:检测图片有无被未经授权使用的情况,比如,摄影师和设计师需要知道自己的作品是否被未经授权使用。
  • 相似图片搜索:网盘、云存储服务需要帮助用户清理重复文件。

在这些场景中,图片对比技术可以帮我们自动化处理大量图片,提高工作效率。

但是,图片对比可不像字符那样可以直接使用等于号=直接对比,那么,我们有哪些对比方式呢?

方法一:MD5指纹对比 - 精确匹配

MD5 是一种信息摘要算法,可以将任意长度的数据映射为固定长度的字符串。对于图片文件,我们可以将其计算出一个独一无二的 MD5 值,就像一个数字指纹,可以用来精确比对两个文件(不仅仅是图片)是否完全相同。

下面是使用 Go 语言计算图片 MD5 值的示例代码:

package main

import (
    "crypto/md5"
    "fmt"
    "io"
    "os"
)

// calculateMD5 计算文件的MD5值
// 为图片颁发独一无二的“身份证”
func calculateMD5(filePath string) (string, error) {
    // 打开文件
    file, err := os.Open(filhttp://www.chinasem.cnePath)
    if err != nil {
        return "", fmt.Errorf("无法打开文件:%v", err)
    }
    defer file.Close()

    // 创建MD5哈希器
    hash := md5.New()

    // 将文件内容复制到哈希器中
    if _, err := io.Copy(hash, file); err != nil {
        return "", fmt.Errorf("计算MD5时出错:%v", err)
    }

    // 返回MD5字符串
    return fmt.Sprintf("%x", hash.Sum(nil)), nil
}

func main() {
    // 比较两张图片
    md51, err := calculateMD5(www.chinasem.cn"image1.jpg")
    if err != nil {
        fmt.Println("图片1处理失败:", err)
        return
    }

    md52, err := calculateMD5("image2.jpg")
    if err != nil {
        fmt.Println("图片2处理失败:", err)
        return
    }

    // 对比结果
    if md51 == md52 {
        fmt.Println("图片完全相同")
    } else {
        fmt.Println("图片不同")
    }
}

代码解读:

  • 我们定义了一个 calculateMD5 函数,传入文件路径,返回计算出的 MD5 字符串。
  • 函数中先打开文件,创建一个 MD5 哈希器 hash
  • 通过io.Copy将文件内容写入哈希器中,计算出 MD5 值。
  • 最后将 MD5 字节数组格式化为字符串返回。
  • main 函数中,我们计算两个图片文件的 MD5 值,比对它们是否相等,输出结果。

MD5 比对的特点:

  • 速度快、计算简单
  • 精确判断两个文件是否完全相同(只要是文件,都可以通过这种方式进行判断是否一样)
  • 无法检测内容相似但不完全相同的图片
  • 图片稍有改动(如添加水印)就会导致 MD5 值完全不同

所以 MD5 比对适合用于检测完全相同的图片,如文件去重等场景。如果两张图片只是稍作修改(如调整亮度、旋转等),MD5 就无能为力了。

方法二:图像哈希对比

图像哈希(Image Hashing)是一类可以比较图片相似程度的算法。其基本原理是:将图片缩小、简化为一个哈希值,然后比较不同图片哈希值的差异度,来判断它们的相似程度。

常见的图像哈希算法有:

  • 平均哈希(Average Hash)
  • 感知哈希(Perceptual Hash)
  • 差异哈希(Difference Hash)
  • 小波哈希(Wavelet Hash)

这里我们以第三方包为例:

首先先安装这个包

go get github.com/corona10/goimagehash

然后我们来尝试实现一个图片相似度比对:

package main

import (
	"fmt"
	"image/png"
	"os"

	"github.com/corona10/goimagehash"
)

// compareImageSimilarity 比较图片相似度
func compareImageSimilarity(image1Path, image2Path string) error {
	file1, err := os.Open(image1Path)
	if err != nil {
		return fmt.Errorf("打开图片1失败:%v", err)
	}
	defer file1.Close()javascript

	file2, err := os.Open(image2Path)
	if err != nil {
		return fmt.Errorf("打开图片2失败:%v", err)
	}
	defer file2.Close()

	// 加载图片
	img1, err := png.Decode(file1)
	if err != nil {
		return fmt.Errorf("加载图片1失败:%v", err)
	}

	img2, err := png.Decode(file2)
	if err != nil {
		return fmt.Errorf("加载图片2失败:%v", err)
	}

	// 生成平均哈希
	avgHash1, err := goimagehash.AverageHash(img1)
	if err != nil {
		return fmt.Errorf("生成图片1哈希失败:%v", err)
	}

	avgHash2, err := goimagehash.AverageHash(img2)
	if err != nil {
		return fmt.Errorf("生成图片2哈希失败:%v", err)
	}

	// 计算差异哈希
	diffHash1, err := goimagehash.DifferenceHash(img1)
	if err != nil {
		return fmt.Errorf("生成图片1差异哈希失败:%v", err)
	}

	diffHash2, err := goimagehphpash.DifferenceHash(img2)
	if err != nil {
		return fmt.Errorf("生成图片2差异哈希失败:%v", err)
	}

	// 计算汉明距离
	avgDistance, err := avgHash1.Distance(avgHash2)
	if err != nil {
		return fmt.Errorf("计算平均哈希距离失败:%v", err)
	}

	diffDistance, err := diffHash1.Distance(diffHash2)
	if err != nil {
		return fmt.Errorf("计算差异哈希距离失败:%v", err)
	}

	// 打印相似度
	fmt.Printf("平均哈希距离:%d\n", avgDistance)
	fmt.Printf("差异哈希距离:%d\n", diffDistance)

	// 判断相似程度
	if avgDistance == 0 && diffDistance == 0 {
		fmt.Println("两张图一样")
	} else if avgDistance <= 5 || diffDistance <= 5 {
		fmt.Println("图片高度相似")
	} else if avgDistance <= 10 || diffDistance <= 10 {
		fmt.Println("图片相似")
	} else {
		fmt.Println("图片差异较大")
	}

	return nil
}

func main() {
	err := compareImageSimilarity("img.png", "img_1.png")
	if err != nil {
		fmt.Println("图片对比出错:", err)
	}
}

图像哈希的特点:

  • 可以比较图片内容的相似程度
  • 对图片的缩放、旋转、亮度变化等稍微鲁棒
  • 计算难度适中,可应用于相似图片搜索等场景
  • 仍无法识别完全不同但语义相似的图片(比如同一物体不同角度的照片)

它们各有特点和适用场景:

MD5指纹:简单快速,适合精确匹配完全相同的图片。 图像哈希:可以比较图片的相似程度,在相似图片搜索等场景下很有用。

当然,这只是图像相似度算法的冰山一角。在实际应用中,我们还需要考虑性能、精度、复杂度等因素,选择最适合的方案。

图像识别领域在不断发展,一些前沿技术如机器学习、深度神经网络等,China编程为图片相似度判断带来了更多的可能性,值得我们去学习和探索。

到此这篇关于Go语言如何判断两张图片的相似度的文章就介绍到这了,更多相关Go判断图片相似度内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Go语言如何判断两张图片的相似度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154992

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo