对比多张图片相似度(PYTHON)

可以使用图像处理软件或者编程语言进行相似度对比。常用的指标有:

    1. 均方误差(MSE):计算每个像素的差异,再求平均值。公式:MSE = 1/nΣ(i=1,n)(I1(i)-I2(i))^2,其中I1和I2是两张图片对应像素的灰度值,n是像素数量。MSE越小,表示图片越相似。

    2. 结构相似度指标(SSIM):考虑到人眼对于图像细节的敏感程度,比MSE更能反映图像的相似度。SSIM计算公式较为复杂,包含对于亮度、对比度、结构等因素的综合考虑。

    3. 归一化互相关(NCC):计算两张图片的互相关系数,越接近1则表示图片越相似。公式:NCC = Σ(i=1,n)(I1(i)-u1)*(I2(i)-u2) / sqrt(Σ(i=1,n)(I1(i)-u1)^2*Σ(i=1,n)(I2(i)-u2)^2),其中u1和u2是图片的均值。

    使用以上指标进行对比比较直观,但要注意的是,不同指标适用于不同类型的图片,具体选择应根据实际情况而定。

以下是代码实现(python):

# coding=utf-8

import cv2
from skimage.metrics import structural_similarity
import numpy as np
import matplotlib.pyplot as plt

"""
图片相似度
"""


# 方法一、均方误差(MSE)
def mse(imageA, imageB):
    """
    均方误差(MSE):计算每个像素的差异,再求平均值。
    公式:MSE = 1/nΣ(i=1,n)(I1(i)-I2(i))^2,
    其中I1和I2是两张图片对应像素的灰度值,n是像素数量。
    注意:两张图片必须有相同的维度,
    MSE越小,表示图片越相似
    @param imageA: 图片1
    @param imageB: 图片2
    @return: MSE越小,表示图片越相似
    """
    # print(imageA.astype("float"))
    # print(imageB.astype("float"))
    # 对应像素相减并将结果累加
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    # 进行误差归一化
    err /= float(imageA.shape[0] * imageA.shape[1])
    # 返回结果,值越小,表示图片越相似
    return err


# 方法二、结构相似度指标(SSIM)
def ssim(imageA, imageB):
    """
    考虑到人眼对于图像细节的敏感程度,
    比MSE更能反映图像的相似度。
    SSIM计算公式较为复杂,包含对于亮度、对比度、结构等因素的综合考虑。
    @param imageA: 图片1
    @param imageB: 图片2
    @return: SSIM计算公式较为复杂包含对于亮度、对比度、结构等因素的综合考虑。
    """
    # ssim_val = cv2.SSIM(imageA, imageB)
    # ssim_val = structural_similarity(imageA, imageB, data_range=255, multichannel=True)
    ssim_val = structural_similarity(imageA, imageB, data_range=255, channel_axis=1)
    return ssim_val


# 方法三、归一化互相关(NCC)
def ncc(imageA, imageB):
    """
    归一化互相关(NCC):计算两张图片的互相关系数,越接近1则表示图片越相似。
    公式:NCC = Σ(i=1,n)(I1(i)-u1)*(I2(i)-u2) / sqrt(Σ(i=1,n)(I1(i)-u1)^2*Σ(i=1,n)(I2(i)-u2)^2),
    其中u1和u2是图片的均值。
    @param imageA: 图片1
    @param imageB: 图片2
    @return: ncc_val 越接近1则表示图片越相似
    """
    meanA = np.mean(imageA)
    meanB = np.mean(imageB)
    ncc_val = np.sum((imageA - meanA) * (imageB - meanB)) / (
                np.sqrt(np.sum((imageA - meanA) ** 2)) * np.sqrt(np.sum((imageB - meanB) ** 2)))
    return ncc_val


def compare_images(imageA, imageB, title):
    # 分别计算输入图片的MSE和SSIM指标值的大小
    m = mse(imageA, imageB)
    s = ssim(imageA, imageB)
    # 创建figure
    fig = plt.figure(title)
    plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, s))
    # plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, 1))
    # 显示第一张图片
    ax = fig.add_subplot(1, 2, 1)
    plt.imshow(imageA, cmap=plt.cm.gray)
    plt.axis("off")
    # 显示第二张图片
    ax = fig.add_subplot(1, 2, 2)
    plt.imshow(imageB, cmap=plt.cm.gray)
    plt.axis("off")
    plt.tight_layout()
    plt.show()


def test1():
    # # 读取图片
    original1 = cv2.imread("1.png")
    contrast1 = cv2.imread("2.png")
    shopped1 = cv2.imread("4.png")

    h1, w1 = cv2.imread("1.png", cv2.IMREAD_GRAYSCALE).shape

    original1 = cv2.resize(original1, (h1, w1))
    contrast1 = cv2.resize(contrast1, (h1, w1))
    shopped1 = cv2.resize(shopped1, (h1, w1))

    # 将彩色图转换为灰度图
    original = cv2.cvtColor(original1, cv2.COLOR_BGR2GRAY)
    contrast = cv2.cvtColor(contrast1, cv2.COLOR_BGR2GRAY)
    shopped = cv2.cvtColor(shopped1, cv2.COLOR_BGR2GRAY)

    # # 初始化figure对象
    # fig = plt.figure("Images")
    # images = ("Original", original), ("Enhance", contrast), ("Others", shopped)
    # # 遍历每张图片
    # for (i, (name, image)) in enumerate(images):
    #     # 显示图片
    #     ax = fig.add_subplot(1, 3, i + 1)
    #     ax.set_title(name)
    #     plt.imshow(image, cmap=plt.cm.gray)
    #     plt.axis("off")
    # plt.tight_layout()
    # plt.show()

    # 比较图片
    compare_images(original, original, "Original vs Original")
    compare_images(original, contrast, "Original vs Enhance")
    compare_images(original, shopped, "Original vs Others")


def test2():
    img1 = cv2.imread("2.png", cv2.IMREAD_GRAYSCALE)
    img2 = cv2.imread("4.png", cv2.IMREAD_GRAYSCALE)
    h1, w1 = img1.shape
    img1 = cv2.resize(img1, (h1, w1))
    img2 = cv2.resize(img2, (h1, w1))
    print('mse : ', mse(img1, img2))
    print('ssim : ', ssim(img1, img2))
    print('ncc : ', ncc(img1, img2))


if __name__ == '__main__':
    # test2()
    test1()

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用卷积神经网络(Convolutional Neural Network,CNN)来对比两张图片相似度,可以获得更为准确的结果。CNN是一种基于深度学习的图像识别技术,可以学习图片的特征,进而进行分类、检测、识别等任务。 具体而言,使用CNN来对比两张图片相似度,可以按照以下步骤进行: 1. 准备训练数据和测试数据。训练数据包括一组图片和对应的标签,标签用于指示图片的类别。测试数据包括待对比的两张图片。 2. 定义CNN模型。CNN模型由多个卷积层、池化层和全连接层组成,可以使用Keras或TensorFlow等框架来实现。 3. 使用训练数据来训练CNN模型。在训练过程中,CNN模型会学习图片的特征,以便进行分类和识别。 4. 使用测试数据来对比两张图片相似度。将待对比的两张图片输入CNN模型,得到它们在特征空间中的向量表示,并计算它们之间的距离或相似度得分。 下面是一个简单的Python代码示例,用于使用CNN来对比两张图片相似度: ```python import keras from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 定义CNN模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 加载训练数据和测试数据 (train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data() # 将数据转换为CNN模型所需的格式 train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 # 将标签转换为独热编码 train_labels = keras.utils.to_categorical(train_labels) test_labels = keras.utils.to_categorical(test_labels) # 训练模型 model.fit(train_images, train_labels, epochs=5, batch_size=64) # 使用测试数据来对比两张图片相似度 img1 = test_images[0] img2 = test_images[1] # 将图片转换为CNN模型所需的格式 img1 = img1.reshape((1, 28, 28, 1)) img2 = img2.reshape((1, 28, 28, 1)) # 得到两张图片在特征空间中的向量表示 vec1 = model.predict(img1) vec2 = model.predict(img2) # 计算两张图片相似度得分 score = 1 - keras.losses.cosine_similarity(vec1, vec2) print('相似度得分:', score) ``` 需要注意的是,使用CNN进行图片相似度对比需要大量的训练数据和计算资源,而且模型的训练和调参也需要一定的经验和技巧。因此,如果不具备相关背景知识和技能,可以考虑使用已有的深度学习模型或者API来实现图片相似度对比。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值