判断两张图片是否相似
要判断两张图片是否相似,你可以使用多种方法,其中包括结构相似性指数(SSIM)和 perception hash 等。以下是使用 SSIM 和 perception hash 进行判断的示例代码。
安装必要的包
确保你已经安装了 scikit-image 和 imagehash 库。如果没有,可以使用 pip 安装:
pip install scikit-image imagehash
使用 SSIM 判断相似性
SSIM 是一种结构相似性度量标准,用于判断两张图片在视觉上有多相似。
from skimage.metrics import structural_similarity as ssim
import cv2
# 加载两张图片
image1 = cv2.imread('path_to_your_image1.jpg')
image2 = cv2.imread('path_to_your_image2.jpg')
# 将图片转换为灰度
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# 计算 SSIM 值
ssim_value = ssim(image1_gray, image2_gray)
print(f"SSIM: {ssim_value}")
# 如果 SSIM 值大于某个阈值,可以认为图片相似
threshold = 0.8
if ssim_value > threshold:
print("The images are similar.")
else:
print("The images are not similar.")
(1) ~~~~~~~ (2) ~~~~~~~ (3)
(1)-(2)
SSIM: 0.9497727050390831
The images are similar.
(1)-(3)
SSIM: 0.939559352304872
The images are similar.
怎么说呢,1和3明显不同啊,为什么说相似???
使用 perception hash 判断相似性
perception hash 是一种感知哈希算法,可以生成图片的哈希值,然后通过比较哈希值来判断图片是否相似。
from imagehash import phash
import cv2
from PIL import Image
# 加载两张图片
image1 = cv2.imread('path_to_your_image1.jpg')
image2 = cv2.imread('path_to_your_image2.jpg')
# 将图片转换为灰度
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# 计算 perception hash
hash1 = phash(Image.fromarray(image1_gray))
hash2 = phash(Image.fromarray(image2_gray))
# 计算哈希值的汉明距离
hamming_distance = hash1 - hash2
print(f"Hamming distance: {hamming_distance}")
# 如果汉明距离小于某个阈值,可以认为图片相似
threshold = 5
if hamming_distance < threshold:
print("The images are similar.")
else:
print("The images are not similar.")
(1)-(2)
Hamming distance: 6
The images are not similar.
(1)-(3)
Hamming distance: 32
The images are not similar.
这才对吗,虽然都不相似,1-2些许不同,但很接近相似,1-3明显不相似,这跟阈值有点关系。阈值越小,相似性要求越严格。
注意:这两种方法都有各自的适用场景和优缺点。SSIM 方法更注重图片的结构和亮度变化,而 perception hash 方法则更注重图片的整体外观。选择哪种方法取决于你的具体需求和图片的特性。