Java 如何对比两张图片的相似度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 如何对比两张图片的相似度相关的知识,希望对你有一定的参考价值。

这是java的弱项,属于纯算法范畴,应该没有什么办法。
希望回答能给你带来帮助~
如果满意,请采纳,如还有疑问,可继续追问!
您也可以向我们团队发出请求,会有更专业的人来为您解答!
参考技术A 用opencv,专门是处理图片的
再看看别人怎么说的。

图片哈希概论及python中如何实现对比两张相似的图片

Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash。

每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片。

以图搜图的原理就是获取你上传的图片的指纹,和图库的图片指纹对比,查找出最相似的若干张图片展示。

除了以图搜图,图片哈希还可以做什么呢?例如图片检索,重复图片剔除,图片相似度比较等等。

这种哈希算法大概有 4 种:

1,差值哈希:DHash(Difference Hash)
2,均值哈希:AHash(Average Hash)
3,感知哈希:PHash(Perceptual Hash)
4,小波哈希:WHash(Wavelet Hash)

注:常用的是前面三种,DHash、AHash、PHash。其中 PHash 是增强版的 AHash。

 

图片基本概念

图片是由像素点矩阵组成的,信息可保存在数组中,如下图 4*4 的图片,可保存在二维数组中:

左上角为起始点

row 表示行,对应图片的高 height,y 方向

col 表示列,对应图片的宽 width,x 方向

 

 

下面我只讲下感知哈希算法的实现:

感知哈希(核心就是:离散余弦变换(DCT))

1,缩小尺寸,建议 32*32
2,灰度化
3,进行离散余弦变换(DCT)
4,取左上角的 8*8 的大小
5,计算平均值
6,比较像素的灰度
7,计算哈希值

 

PhotoHash 它是python中一个感知哈希算法,用来发现两个图像是否相似。

1,安装包

pip install PhotoHash

2, average_hash

使用平均哈希算法返回图像的哈希值。该算法将图像中的每个像素与所有像素的平均值进行比较:

import photohash
hash_one = photohash.average_hash(\'123/dy.jpg\')
print(hash_one)

hash_two = photohash.average_hash(\'123/6000.jpg\')
print(hash_two)

结果:

1fffffd48000f0e1
0effff1b10001f02

3,distance

返回给定图像的average_hash之间的汉明距离

import photohash
distance = photohash.distance(\'123/dy.jpg\', \'123/6000.jpg\')
print(distance)

结果:
9

4,is_look_alike

返回一个布尔值,判断照片是否相似

import photohash
similar = photohash.is_look_alike(\'123/dy.jpg\', \'123/6000.jpg\')
print(similar)

结果:
True

import photohash
similar = photohash.is_look_alike(\'123/dy.jpg\', \'123/6000.jpg\', tolerance=3)//is_look_alike还接受一个可选的宽容参数,该参数定义了比较的严格程度。
print(similar)

5,hash_distance

返回相同长度的两个哈希之间的汉明距离

import photohash
hash_one = photohash.average_hash(\'123/dy.jpg\')
hash_two = photohash.average_hash(\'123/6000.jpg\')
distance = photohash.hash_distance(hash_one, hash_two)
print(distance)

结果:
5

6,hashes_are_similar

返回一个布尔值,表示两个哈希值是否在给定的公差范围内。与is_look_alike相同,但使用散列而不是图像路径

import photohash
hash_one = photohash.average_hash(\'123/dy.jpg\')
hash_two = photohash.average_hash(\'123/6000.jpg\')
similar = photohash.hashes_are_similar(hash_one, hash_two)
print(similar)

注:通常汉明距离 小于等于5时我们认为这两张图非常相似,大于10 则认为这两张图完全不一样

以上是关于Java 如何对比两张图片的相似度的主要内容,如果未能解决你的问题,请参考以下文章

有啥可以对比两张图片得出相似度的软件。

图片相似度判断

C#怎么来判断2张图片相似度

JAVA 比较两张图片的相似度

图像视频相似度算法

JAVA 比较两张图片的相似度的代码