【问题标题】:Comparing two images with ms_ssim on python在 python 上使用 ms_ssim 比较两个图像
【发布时间】:2020-01-19 11:56:45
【问题描述】:

我想比较两个图像,但 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'

【问题讨论】:

    标签: python compare pytorch tensor ssim


    【解决方案1】:

    问题在于所有这些函数(和类)都需要批次图像作为输入。但是,由于图像是 3D,所以一批是 4D。

    当您只有一个图像张量时,您可以将其“解压”成一个单项批次

    it = it.unsqueeze(0)
    

    但是,我不推荐 pytorch_msssim 包。您应该考虑使用 piqapiq 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)
    

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多