如何使用Python计算两个图像之间的结构相似指数(SSIM)

本文概述

  • 要求
  • 1.安装Python依赖项
  • 2.编写脚本
结构相似性指数(SSIM)是一种感知指标, 可量化由诸如数据压缩之类的处理或数据传输中的损失所引起的图像质量下降。此度量标准基本上是完全参考, 需要来自同一镜头的2张图像, 这意味着2张图形上人眼相同的图像。第二个图像通常被压缩或具有不同的质量, 这是该索引的目标。 SSIM通常用于视频行业, 但在摄影领域也有很强的应用。 SIM实际上测量两个相似图像之间的感知差异。它无法判断两者中哪一个更好:必须从知道哪个是原始的, 哪些经历了压缩或过滤器等其他处理才能推断出。
在本文中, 我们将向你展示如何使用Python计算两个图像之间的索引。
要求 要遵循本教程, 你将需要:
  • Python 3
  • 画中画3
话虽如此, 让我们开始吧!
1.安装Python依赖项 在实施逻辑之前, 你将需要安装一些将由逻辑使用的基本工具。可以使用以下命令通过PIP安装此工具:
pip3 install scikit-image opencv-python imutils

这些工具是:
  • scikitimage:scikit-image是图像处理算法的集合。
  • opencv:OpenCV是高度优化的库, 专注于实时应用程序。
  • imutils:一系列便利功能, 使基本的图像处理功能(例如平移, 旋转, 调整大小, 构图, 显示Matplotlib图像, 分类轮廓, 检测边缘)以及使用OpenCV以及Python 2.7和Python 3更加容易。
本教程将在可使用Python的任何平台上运行(Ubuntu / Windows / Mac)。
2.编写脚本 比较图像的逻辑如下。使用Skimage度量模块的compare_ssim方法。该方法计算两个图像之间的平均结构相似性指数。它接收作为参数:
X, Y:ndarray 任何尺寸的图像。
win_size:整数或无 比较中使用的滑动窗口的边长。必须是一个奇数值。如果gaussian_weights为True, 则将其忽略, 并且窗口大小将取决于sigma。
梯度布尔型, 可选 如果为True, 则还返回相对于Y的渐变。
data_rangefloat, 可选 输入图像的数据范围(最小和最大可能值之间的距离)。默认情况下, 这是根据图像数据类型估算的。
多通道布尔, 可选 如果为True, 则将数组的最后一个维度视为通道。对每个通道独立进行相似度计算, 然后取平均值。
gaussian_weightsbool, 可选 如果为True, 则每个补丁的均值和方差在空间上均由宽度sigma = 1.5的归一化高斯核加权。
Fullbool, 可选 如果为True, 则还返回完整的结构相似性图像。
并返回:
mssimfloat 图像上的平均结构相似度。
梯度数组 X和Y之间结构相似性指数的梯度[2]。仅当渐变设置为True时才返回。
Sndarray 完整的SSIM映像。仅当full设置为True时才返回。
首先, 我们将从提供的参数中读取带有CV的图像, 并将应用黑白滤镜(灰度), 并将上述逻辑应用于这些图像。创建以下脚本, 即script.py, 并将以下逻辑粘贴到文件上:
# Usage:## python3 script.py --input original.png --output modified.png# Based on: https://github.com/mostafaGwely/Structural-Similarity-Index-SSIM-# 1. Import the necessary packagesfrom skimage.measure import compare_ssimimport argparseimport imutilsimport cv2# 2. Construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-f", "--first", required=True, help="Directory of the image that will be compared")ap.add_argument("-s", "--second", required=True, help="Directory of the image that will be used to compare")args = vars(ap.parse_args())# 3. Load the two input imagesimageA = cv2.imread(args["first"])imageB = cv2.imread(args["second"])# 4. Convert the images to grayscalegrayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)# 5. Compute the Structural Similarity Index (SSIM) between the two#images, ensuring that the difference image is returned(score, diff) = compare_ssim(grayA, grayB, full=True)diff = (diff * 255).astype("uint8")# 6. You can print only the score if you wantprint("SSIM: {}".format(score))

该脚本基于@mostafaGwely在Github上的此存储库中发布的代码。该代码完全遵循存储库中声明的逻辑, 但是它消除了打印图像阈值的错误。使用以下命令使用图像运行脚本的输出:
python3 script.py --first original_image.png --second compressed_image.png

将生成以下输出(图片中的命令使用简短的参数描述-f作为– first和-s作为– second):
如何使用Python计算两个图像之间的结构相似指数(SSIM)

文章图片
该算法将打印一个字符串, 即” SSIM:$ value” , 但是你可以根据需要进行更改。如果比较两个精确的图像, 则SSIM的值显然应该为1.0。
【如何使用Python计算两个图像之间的结构相似指数(SSIM)】编码愉快!

    推荐阅读