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

这篇具有很好参考价值的文章主要介绍了对比多张图片相似度(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):文章来源地址https://www.toymoban.com/news/detail-661385.html

# 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()

到了这里,关于对比多张图片相似度(PYTHON)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版

    首先,我要向大家道个歉。原本我计划今天向大家展示如何将图片和视频等形式转换为向量并存储在向量数据库中,但是当我查看文档时才发现,腾讯的向量数据库尚未完全开发完成。因此,今天我将用文本形式来演示相似图片搜索。如果您对腾讯的产品动态不太了解,可以

    2024年02月05日
    浏览(86)
  • 🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版

    首先,我要向大家道个歉。原本我计划今天向大家展示如何将图片和视频等形式转换为向量并存储在向量数据库中,但是当我查看文档时才发现,腾讯的向量数据库尚未完全开发完成。因此,今天我将用文本形式来演示相似图片搜索。如果您对腾讯的产品动态不太了解,可以

    2024年02月05日
    浏览(81)
  • 基于Python实现人脸识别相似度对比

    人脸识别技术是一种通过计算机对人脸图像进行分析和处理࿰

    2024年01月24日
    浏览(39)
  • 【Python】Matplotlib-多张图像的显示

    大家在写论文或者实验报告的时候,经常会放多张图片或数据图像在一起形成对比。比如,我现在有一张经过椒盐噪声处理的图像,现在进行三种滤波,分别是均值,高斯,中值滤波,共计四张图像,怎么才能将他们利用matplotlib库放置到一起呢?跟着我一起来写代码吧! 用

    2024年02月04日
    浏览(37)
  • python使用ffmpeg合并多张图片成视频

    注意: 需要在本地有ffmpeg,并且配置环境变量 下载链接如下:https://download.csdn.net/download/qq_30273575/87898080 # FFmpeg 将多张图片合成视频 # 可以使用 FFmpeg 库来将多张图片合成视频,下面是一个简单的示例: # 在代码中,需要提供存储图片的文件夹路径 images_path 和最终生成的视频

    2024年02月11日
    浏览(50)
  • [python]将多张图片合并为单个pdf文件

    最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。( 比如看漫画 ) 主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果

    2024年03月09日
    浏览(100)
  • python脚本——批量将word文件转换成多张图片

    前提:有时候需要快速查看word文档的内容是否自己需要的,或者就是单纯需要将word文档转换成一张张图片。 思路:word文档直接生成图片比较蛮烦,可能会引起格式变化,就先将word文档转换成PDF,然后将PDF文档转换成图片。 语言:python 3 用法:点击运行后,弹出窗口选择文件

    2024年02月11日
    浏览(49)
  • 深入解析,python合并多张图片成视频,可用于批量制作短视频

    随着短视频的兴起,越来越多的人开始用各种形式进行视频制作,本篇博客从程序员的角度为大家解析一下如何通过 Python 合并多个图片为一个视频 除了使用 OpenCV 合并多张图片成视频外,还可以使用其他工具和库,例如: moviepy : 这是一个基于 Python 的视频编辑库,可以帮助

    2024年01月20日
    浏览(65)
  • python将多张图片拼成一张矩阵图,合成一张大图

    引言 环境准备 代码实现 效果演示 总结 在图像处理和图像展示的应用中,将多张图片排列成一个图像矩阵图是一个常见的需求。本博客介绍如何使用Python实现将12张图片排列成n*m的图像矩阵图。 为了实现这个目标,我们需要安装Pillow库。Pillow是Python中一个强大的图像处理库

    2024年02月14日
    浏览(40)
  • python学习之合并多张图片转成mp4视频代码实现

    随着现代科技飞速发展和人们提升视觉上体验,利用图片生成视频的方法,确实为工作或者提升生活体验感做了很多成功案例: 1、简单的幻灯片演示,如展示旅游照片、产品展示等; 2、改编图片动画,如口红试色、时尚大片中的效果; 3、制作日记式的视频内容,将一段长

    2023年04月21日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包