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

发布于:2024-06-26 ⋅ 阅读:(59) ⋅ 点赞:(0)
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

网站公告

今日签到

点亮在社区的每一天
去签到