python - 在 python 上使用 ms_ssim 比较两个图像
问题描述
我想比较两个图像,但 ms_ssim 想要 4D 张量
https://pypi.org/project/pytorch-msssim/
我试过了
from PIL import Image
from tqdm import tqdm
from pytorch_msssim import ssim, ms_ssim, SSIM, MS_SSIM
import torchvision
import numpy as np
topil=torchvision.transforms.ToPILImage()
totensor=torchvision.transforms.ToTensor()
def ssimcompare(path1:str,path2:str)->float:
image1 = Image.open(path1)
image2 = Image.open(path2)
#it1=np.expand_dims(totensor(topil(np.array(image1))), axis=0)
#it2=np.expand_dims(totensor(topil(np.array(image2))), axis=0)
#it1=totensor(np.expand_dims(np.array(image1), axis=0))
#it2=totensor(np.expand_dims(np.array(image2), axis=0))
it1=totensor(np.array(image1))
it2=totensor(np.array(image2))
valor=ms_ssim( it1 , it2, data_range=255, size_average=False )
return valor
但我得到不同的错误
ValueError: Input images must be 4-d tensors.
TypeError: pic should be Tensor or ndarray. Got <class 'PIL.JpegImagePlugin.JpegImageFile'>.
AttributeError: 'numpy.ndarray' object has no attribute 'type'
解决方案
问题是所有这些函数(和类)都需要批量图像作为输入。但是,由于图像是 3D,所以批次是 4D。
当您只有一个图像张量时,您可以将其“解压”成一个单项批次
it = it.unsqueeze(0)
但是,我不推荐这个pytorch_msssim
包。您应该考虑使用piqa
或piq
IQA 包,因为它们有据可查并且实现速度更快。
例如,
pip install piqa
然后,您的功能变为
from piqa import ssim
def msssim_compare(path1: str, path2: str) -> float:
image1 = Image.open(path1)
image2 = Image.open(path2)
it1 = totensor(image1).unsqueeze(0)
it2 = totensor(image2).unsqueeze(0)
return ssim.msssim(it1, it2).squeeze(0)
推荐阅读
- here-olp - 如何从 compileInFn 写入日志消息?
- selenium-webdriver - Selenium Click 无法在 Windows 7 中使用 IE11 处理弹出消息
- sql - 更新主键列中的所有值
- ios - 方向更改时的自定义 TableViewCell 自动布局问题
- android - 非游戏应用程序被三星游戏启动器视为游戏
- android - 如何在 BaseActivity 中使用 ProgressBar 而不是弃用的 ProgressDialog?
- php - 覆盖子主题中的模块
- python - 减去索引 - TypeError: cannot perform __sub__ with this index type:
- postgresql - 以特定格式将 LocalDate 字段写入数据库
- pytest - 如何使用 PEP 420 命名空间包对项目进行 Pytest?