Image.open()是否会扭曲灰度PNG图像?

2024-05-14 21:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

最近,我一直在尝试使用Pillow的Image.open()将一些灰度图像加载到Python程序中。然而,我发现图像被扭曲了,所有的值都被极化了

这是Mac预览生成的图像:

enter image description here

这是由Image.open()函数生成的图像:

enter image description here

我的代码如下:

from PIL import Image, ImageOps
from pathlib import Path
import matplotlib.pyplot as plt

mod_path2 = Path("/Volumes/Sans/ROI/Images/sub-S03046_ses-E06791_run-1_bp-chest_vp-pa_dx.png")
b = Image.open(str(mod_path2))
plt.imshow(b)
plt.show()

并且,通过预览的图像的特征是:

enter image description here

我相信这可能与图像的颜色空间或缺少alpha通道有关,因为两个通道都已正确加载


Tags: path函数from图像imageimport程序mod
1条回答
网友
1楼 · 发布于 2024-05-14 21:07:08

没有float值,但您的CT扫描是16位无符号整数灰度图像。当使用Image.open打开此图像时,对应的modeI给出,这在这里是错误的,因为I是“32位有符号整数像素”,而我们更希望使用模式I;16,它是“16位无符号整数像素”

b = Image.open('images/sub-S03046_ses-E06791_run-1_bp-chest_vp-pa_dx.png')
print('Pillow mode: {}'.format(b.mode))

min_val, max_val = b.getextrema()
print('Minimum value: {}, maximum value: {}'.format(min_val, max_val))

输出:

Pillow mode: I
Minimum value: 0, maximum value: 59551

现在,一般来说,^{}能够显示Image对象,但在显示I模式Image对象时似乎存在一个问题:似乎(请参见下图,请参见绘图窗口的右下角),假定的32位被解释为RGBA值。因此,即使在{}中设置{}和{}在这里也不起作用

奇怪的是,当转换到模式I;16时,整个图像(仍然)被剪辑在32767处,这我不理解也无法解释。因此,相应的绘图仍然存在错误(参见下图)

plt.imshow获得正确输出的唯一方法似乎是将图像转换为某个NumPy数组,显式地将dtype设置为np.uint16,然后使用模式I;16将其转换回枕状Image对象:

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

b = Image.open('images/sub-S03046_ses-E06791_run-1_bp-chest_vp-pa_dx.png')
print('Pillow mode: {}'.format(b.mode))

min_val, max_val = b.getextrema()
print('Minimum value: {}, maximum value: {}'.format(min_val, max_val))

plt.figure(0, figsize=(18, 5))
plt.subplot(1, 3, 1), plt.imshow(b, vmin=min_val, vmax=max_val, cmap='gray')
plt.title('Pillow image, original mode I'), plt.colorbar()

plt.subplot(1, 3, 2), plt.imshow(b.convert('I;16'), vmin=min_val, vmax=max_val, cmap='gray')
plt.title('Pillow image, converted to mode I;16'), plt.colorbar()

b = Image.fromarray(np.asarray(b).astype(np.uint16), 'I;16')
plt.subplot(1, 3, 3), plt.imshow(b, vmin=min_val, vmax=max_val, cmap='gray')
plt.title('Pillow image after NumPy array conversion'), plt.colorbar()

plt.tight_layout(), plt.show()

输出:

Output

                    
System information
                    
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
Matplotlib:    3.3.4
NumPy:         1.20.1
Pillow:        8.1.0
                    

相关问题 更多 >

    热门问题