三个方法计算两张图片的相似度

import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim
import os

def is_similar(image1, image2, threshold=0.95):
    '''
    对图像的颜色信息敏感,能快速计算。
    对图像的旋转、缩放等几何变换不敏感。
    缺点:
    对图像的结构、纹理等信息不敏感。
    不能很好地处理图像的局部变化或噪声。
    
    '''
    # 将图像转换为灰度图像
    image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

    # 计算直方图
    hist1 = cv2.calcHist([image1_gray], [0], None, [256], [0, 256])
    hist2 = cv2.calcHist([image2_gray], [0], None, [256], [0, 256])

    # 归一化直方图
    cv2.normalize(hist1, hist1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
    cv2.normalize(hist2, hist2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

    # 计算相似度
    similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
    print("similarity",similarity)
    # return similarity > threshold
def calculate_ssim(image1, image2):
    '''
    结构相似性指数(Structural Similarity Index, SSIM):
    
    优点:
    综合考虑了亮度、对比度和结构信息,能够更好地反映人类视觉感知。
    对局部变化和噪声有较好的鲁棒性。
    缺点:
    计算复杂度较高,速度较慢。
    对大范围的几何变换不敏感。
    适用场景:
    适用于需要精确比较图像结构信息的场景,如图像压缩质量评估、图像增强效果评估等医学图像分析。
    '''
    # Convert images to grayscale
    gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
    # Calculate SSIM
    ssim_score, _ = ssim(gray1, gray2, full=True)

    # print("calculate_ssim",ssim_score)
    return ssim_score
def calculate_mae(image1, image2):
    '''
    
    均值绝对误差(Mean Absolute Error, MAE):
    
    优点:
    简单直接,计算像素值的绝对差异。
    对图像的整体亮度变化敏感。
    缺点:
    对图像的几何变换(如平移、旋转、缩放)敏感。
    不能很好地处理局部变化和噪声。
    适用场景:
    适用于对整体亮度或颜色变化敏感的场景,如医学图像分析、监控图像等。
    '''
    # Convert images to grayscale
    gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
    # Calculate Mean Absolute Error (MAE)
    mae = np.mean(np.abs(gray1 - gray2))
    # print("mae",mae)  #0255 越小越来约相似
    return mae
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算两张图像的相似度是图像处理和计算机视觉领域的重要任务。以下是几种常见的方法: 1. 均方误差(Mean Squared Error, MSE):该方法通过计算两张图像对应像素值的差值的平方和的均值来衡量相似度。具体步骤如下: - 将两张图像转换为灰度图像(如果不是灰度图像)。 - 遍历两张图像对应位置的像素值,计算差值:diff = pixel1 - pixel2。 - 将差值的平方累加:sum_diff += diff * diff。 - 最后,取差值平方和的均值作为相似度度量:similarity = sum_diff / (image_width * image_height)。 2. 结构相似性指数(Structural Similarity Index, SSIM):该方法通过比较图像的亮度、对比度和结构信息来衡量相似度。SSIM算法考虑了人眼对图像的感知特性。具体步骤如下: - 将两张图像转换为灰度图像(如果不是灰度图像)。 - 计算亮度、对比度和结构信息的相似度分数。 - 最后,将三个相似度分数加权平均得到最终的相似度。 3. 感知哈希算法(Perceptual Hashing):该方法通过将图像转换为一个固定长度的哈希值,然后比较两个哈希值的差异来衡量相似度。常用的感知哈希算法有均值哈希(Average Hash)和差异哈希(Difference Hash)。 这些方法只是相似度计算的一部分,还有其他更复杂的方法和算法可用于计算图像相似度,具体选择方法应根据具体需求和场景来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值