Python判断两张图片的相似度

在Python中,判断两张以numpy的ndarray格式存储的图片的相似度,通常可以通过多种方法来实现,包括但不限于直方图比较、像素差比较、结构相似性指数(SSIM)、特征匹配等。以下是一些常见方法的简要介绍和示例代码。

1. 像素差比较

最直接的方法是计算两张图片对应像素之间的差异。然而,这种方法对图片的旋转、缩放等变换非常敏感。

python 复制代码
import numpy as np

def pixel_difference(img1, img2):
    if img1.shape != img2.shape:
        raise ValueError("Images must have the same shape")
    diff = np.sum(np.abs(img1.astype(np.float32) - img2.astype(np.float32)))
    return diff

# 假设 img1 和 img2 是两个相同尺寸的 ndarray 图片
# result = pixel_difference(img1, img2)
# print(f"Pixel Difference: {result}")

2. 直方图比较

通过比较两张图片的直方图来判断它们的相似度。这种方法对颜色分布敏感,但对空间信息不敏感。

python 复制代码
from skimage.exposure import histogram

def histogram_comparison(img1, img2):
    hist1, bin_idx1 = histogram(img1)
    hist2, bin_idx2 = histogram(img2)
    # 这里可以使用多种方法来比较直方图,如计算欧氏距离、巴氏距离等
    diff = np.linalg.norm(hist1 - hist2)
    return diff

# 假设 img1 和 img2 是两个 ndarray 图片
# result = histogram_comparison(img1, img2)
# print(f"Histogram Difference: {result}")

3. 结构相似性指数(SSIM)

SSIM是一种衡量两幅图片视觉相似度的指标,它考虑了亮度、对比度和结构信息。

python 复制代码
from skimage.metrics import structural_similarity as ssim

def compare_ssim(img1, img2):
    # 确保img1和img2是灰度图,如果不是,需要先转换
    if img1.ndim == 3:
        img1 = img1.mean(axis=2)
    if img2.ndim == 3:
        img2 = img2.mean(axis=2)
    (score, diff) = ssim(img1, img2, full=True)
    return score, diff

# 假设 img1 和 img2 是两个 ndarray 图片
# score, diff = compare_ssim(img1, img2)
# print(f"SSIM: {score}, Diff: {diff}")

注意

  • 上述代码中的img1和img2应该是相同尺寸和类型的numpy.ndarray。
  • 对于颜色图片,一些方法(如SSIM)可能需要先将图片转换为灰度图或使用其他方式处理颜色通道。
  • 在实际应用中,可能需要根据图片的具体情况和需求选择合适的方法。
相关推荐
小oo呆1 小时前
【学习心得】Python多线程
python
星夜离尘564 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
happylifetree4 小时前
Python70:核心语法-函数进阶-案例2
python
Ai-_Man5 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd5 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go5 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳5 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
学逆向的5 小时前
C 枚举变量
c语言·开发语言·网络安全
宝绿特塑业再生科技5 小时前
改性HDPE再生颗粒在户外家具挤出发泡板材中的色差控制与高品质价值重构
经验分享·科技·学习·生活·1024程序员节·户外家具
Sakura_j_h_6 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务