pytorch 调整PIL图像的大小会产生全黑图像

wyyhbhjk  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(257)

我有一个灰度图像的数据集,如下所示:x1c 0d1x现在,我使用以下类打开我的数据集:

"""Tabular and Image dataset."""

    def __init__(self, excel_file, image_dir):
        self.image_dir = image_dir
        self.excel_file = excel_file
        self.tabular = pd.read_excel(excel_file)

    def __len__(self):
        return len(self.tabular)

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        tabular = self.tabular.iloc[idx, 0:]

        y = tabular["Prognosis"]

        image = PIL.Image.open(f"{self.image_dir}/{tabular['ImageFile']}")
        image = np.array(image)
        #image = image[..., :3]

        image = transforms.functional.to_tensor(image)

        return image, y

如果我检查图像的Tensor,那么我有:

tensor([[[160, 160, 192,  ...,  52,  40,  40],
         [176, 208, 320,  ...,  96,  80,  16],
         [176, 240, 368,  ..., 160, 160,  52],
         ...,
         [576, 608, 560,  ...,  16,  16,  16],
         [624, 592, 544,  ...,  16,  16,  16],
         [624, 624, 576,  ...,  16,  16,  16]]], dtype=torch.int32)

现在,它们应该在0和1之间,对吗?因为它是灰度的,或者RGB中的0-255,但是有一些大的值,我不知道它们是从哪里来的(实际上,imshow显示的图像具有奇怪的扭曲颜色,如黄色和蓝色,而不是灰度)。然而,这是图像torch.Size([1, 2350, 2866])的大小;我想把大小调整到(1,224,224)这是我的函数:

def resize_images(images: List[str]):
    for i in images:
        image = PIL.Image.open(f"{data_path}TrainSet/{i}")
        new_image = image.resize((224, 224))
        new_image.save(f"{data_path}TrainImgs/{i}")

resize_images(list(df["ImageFile"]))

然而,这段代码返回的所有图像都是224 x244,但它们都是黑色的。所有图像都是完全黑色的!

wtlkbnrh

wtlkbnrh1#

您可能共享了一个与您的代码打开的文件不同的文件,或者imgur更改了您的文件。无论如何,在Linux/Unix/macOS上检查您的文件内容的最方便的方法是使用file命令,而无需安装任何软件。因此,检查您的文件,我们可以看到它是一个带有alpha通道的8位PNG:

file pZS4l.png
pZS4l.png: PNG image data, 896 x 732, 8-bit/color RGBA, non-interlaced

这立刻告诉我这不是你在代码中打开的图像,因为在你的像素转储中有超过255的值,而这在8位文件中是不可能的。所以,检查图像内容的下一个最好的方法是使用exiftool,这对Windows用户也有效。看起来像这样:

exiftool pZS4l.png

ExifTool Version Number         : 12.30
File Name                       : pZS4l.png
Directory                       : .
File Size                       : 327 KiB
File Modification Date/Time     : 2022:11:05 17:15:22+00:00
File Access Date/Time           : 2022:11:05 17:15:23+00:00
File Inode Change Date/Time     : 2022:11:05 17:15:22+00:00
File Permissions                : -rw-r--r--
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 896
Image Height                    : 732
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Profile Name                    : ICC Profile
Profile CMM Type                : Apple Computer Inc.
Profile Version                 : 2.1.0
Profile Class                   : Display Device Profile
Color Space Data                : RGB
Profile Connection Space        : XYZ
Profile Date Time               : 2022:07:06 14:13:59
Profile File Signature          : acsp
Primary Platform                : Apple Computer Inc.
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             : Apple Computer Inc.
Device Model                    : 
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Perceptual
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : Apple Computer Inc.
Profile ID                      : 0
Profile Description             : Display
...
...

所以,现在我看到这是一个在Mac上做的屏幕抓取。屏幕抓取和你正在显示的图像是不一样的!如果你在8位显示器上显示16位图像,屏幕抓取将是8位的。你应该分享你的原始图像,而不是屏幕抓取。如果imgur正在改变你的图像,你应该分享他们与Dropbox或谷歌驱动器或类似。
好了,继续你的问题。假设你在代码中打开了一个PNG(因为它不完整,所以我们无法判断)数据应该是浮点数,因为PNG不能存储浮点数,它只能存储整数。PNG可以存储位深度为1、2、4、8或16位的整数样本。如果你读到24位PNG,也就是RGB 888。如果您读取的是32位PNG,则是RGBA 8888。如果您读取的是48位PNG,则是RGB,每采样16位。如果您读取的是64位PNG,则是RGBA,每采样16位。
所以,简短的答案是跑步:

file YOURACTUALIMAGE.PNG

和/或:

exiftool YOURACTUALIMAGE.PNG

所以,我怀疑你有一个16位灰度PNG,它完全能够存储范围为0..65535的样本。
注意:如果你真的想存储浮点数,你可能需要使用TIFF,或PFM(便携式浮点Map)或EXR格式。

相关问题