在Python中,判断两张以numpy的ndarray格式存储的图片的相似度,通常可以通过多种方法来实现,包括但不限于直方图比较、像素差比较、结构相似性指数(SSIM)、特征匹配等。以下是一些常见方法的简要介绍和示例代码。
1. 像素差比较最直接的方法是计算两张图片对应像素之间的差异。然而,这种方法对图片的旋转、缩放等变换非常敏感。 - 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. 直方图比较通过比较两张图片的直方图来判断它们的相似度。这种方法对颜色分布敏感,但对空间信息不敏感。 - 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是一种衡量两幅图片视觉相似度的指标,它考虑了亮度、对比度和结构信息。 - 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}")
复制代码
|