PIL打开tif图像只有一个通道
PIL open tif image only one channel
我用PIL打开tif图片有两种情况。第一个是正常的,可以将图像打开为 RGB 并通过 plt 显示。然而,第二个如下面的代码所示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('test1.tif')
a = np.array(img)
a.shape
# output: (2040,2040)
只能以(2040,2040)的形状打开,上一个以(2040,2040,3)的形状打开。当我使用 img = img.convert('RGB')
将 (2040,2040) 转换为 RGB 模式并通过 plt 显示时只看到一个空白方块。
拜托,有人告诉我出了什么问题吗?
提前致谢!
原图:
和 numpy 数组:
array([[7256, 6926, 7270, ..., 7368, 7457, 7555],
[7174, 6945, 6878, ..., 7401, 7353, 7895],
[7288, 7099, 7140, ..., 7359, 7524, 7587],
...,
[6769, 6695, 6698, ..., 6599, 6788, 6898],
[6780, 6683, 6857, ..., 6723, 6761, 6861],
[6788, 6626, 6761, ..., 6738, 6751, 7054]], dtype=uint16)
转换为RGB模式后:
numpy 数组:
array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]], dtype=uint8)
您遇到的问题是因为图像是 PIL 图像库不支持的 16 位图像 (uint16)。正如您所建议的,您可以简单地将其转换为不同的图像类型。但是,您也可以只使用 imageio
以下代码应该有效:
import imageio
import matplotlib.pyplot as plt
%matplotlib inline
img = imageio.imread('test1.tif')
plt.imshow(img)
有关相关主题的讨论,请参见此处:https://github.com/imageio/imageio/issues/204
顺便说一句,这是 PIL 图像格式的列表以及它们有多少个频道(改编自 https://helpful.knobs-dials.com/index.php/Python_usage_notes_-_PIL):
PIL pixel formats:
RGB 24bits per pixel, 8-bit-per-channel RGB), 3 channels
RGBA (8-bit-per-channel RGBA), 4 channels
RGBa (8-bit-per-channel RGBA, remultiplied alpha), 4 channels
1 - 1bpp, often for masks, 1 channel
L - 8bpp, grayscale, 1 channel
P - 8bpp, paletted, 1 channel
I - 32-bit integers, grayscale, 1 channel
F - 32-bit floats, grayscale, 1 channel
CMYK - 8 bits per channel, 4 channels
YCbCr - 8 bits per channel, 3 channels
我用PIL打开tif图片有两种情况。第一个是正常的,可以将图像打开为 RGB 并通过 plt 显示。然而,第二个如下面的代码所示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('test1.tif')
a = np.array(img)
a.shape
# output: (2040,2040)
只能以(2040,2040)的形状打开,上一个以(2040,2040,3)的形状打开。当我使用 img = img.convert('RGB')
将 (2040,2040) 转换为 RGB 模式并通过 plt 显示时只看到一个空白方块。
拜托,有人告诉我出了什么问题吗? 提前致谢!
原图:
和 numpy 数组:
array([[7256, 6926, 7270, ..., 7368, 7457, 7555],
[7174, 6945, 6878, ..., 7401, 7353, 7895],
[7288, 7099, 7140, ..., 7359, 7524, 7587],
...,
[6769, 6695, 6698, ..., 6599, 6788, 6898],
[6780, 6683, 6857, ..., 6723, 6761, 6861],
[6788, 6626, 6761, ..., 6738, 6751, 7054]], dtype=uint16)
转换为RGB模式后:
array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]], dtype=uint8)
您遇到的问题是因为图像是 PIL 图像库不支持的 16 位图像 (uint16)。正如您所建议的,您可以简单地将其转换为不同的图像类型。但是,您也可以只使用 imageio
以下代码应该有效:
import imageio
import matplotlib.pyplot as plt
%matplotlib inline
img = imageio.imread('test1.tif')
plt.imshow(img)
有关相关主题的讨论,请参见此处:https://github.com/imageio/imageio/issues/204
顺便说一句,这是 PIL 图像格式的列表以及它们有多少个频道(改编自 https://helpful.knobs-dials.com/index.php/Python_usage_notes_-_PIL):
PIL pixel formats:
RGB 24bits per pixel, 8-bit-per-channel RGB), 3 channels
RGBA (8-bit-per-channel RGBA), 4 channels
RGBa (8-bit-per-channel RGBA, remultiplied alpha), 4 channels
1 - 1bpp, often for masks, 1 channel
L - 8bpp, grayscale, 1 channel
P - 8bpp, paletted, 1 channel
I - 32-bit integers, grayscale, 1 channel
F - 32-bit floats, grayscale, 1 channel
CMYK - 8 bits per channel, 4 channels
YCbCr - 8 bits per channel, 3 channels