尝试在 python 中加载 bmp 图像时,数组列的顺序未对齐
Posted
技术标签:
【中文标题】尝试在 python 中加载 bmp 图像时,数组列的顺序未对齐【英文标题】:Order of array columns is misaligned when trying to load a bmp image in python 【发布时间】:2020-12-14 19:42:32 【问题描述】:我正在尝试在 python 中加载和显示 bmp 图像。 我现在尝试了几个模块(PIL、skimage.io、matplotlib),但图像每次都显示错误。This is the original picture 这是loading and displaying it in python 之后的样子。 (在此处上传时,原始图像会转换为 png)。 这是我正在使用的最新代码:
from skimage import io
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
image = io.imread('107.bmp')
io.imshow(image)
plt.show()
我导入 bmp 文件的方式似乎有问题。当我使用 print(image[:,0]) 打印加载图像的第一列时,生成的 (494,) 数组已经包含白色 255 值像素,这些像素应该只出现在图像中间某个地方 image[:, 300 ]。 到目前为止,我找不到任何有助于解决此问题的 io.imread() 选项。
我做错了什么?如何以正确的列顺序加载 bmp 图像?
当我在默认的 Windows 照片应用程序或绘图中打开原始 bmp 图像时,它会正确显示。 我正在使用 python 3.8.5 和 scikit-image 0.17.2。
【问题讨论】:
【参考方案1】:我通过编写自己的读取 bmp 脚本来解决我的问题,该脚本特别注意 bmp 标头的结束位置。
按照How to read bmp file header in python?的建议解决方案,我实现了标题读取并收到以下信息:
类型:BM 尺寸:325142 保留 1:0 保留 2:0 偏移量:54 DIB 标头大小:40 宽度:656 身高:494 彩色平面:1 每像素位数:8 压缩方式:0 原始图像大小:324064 水平分辨率:0 垂直分辨率:0 颜色数:0 重要颜色:0从Wikipedia 我了解到 BMP 文件头应该是 54 字节大,由头中的“偏移量:54”参数给出。我的灰度图像中的每个像素都由 1 个单字节描述。 但是header信息中的“Size: 325142”和“Raw Image Size: 324064”相差1078字节。
我尝试了一个简单的“读取 bmp”脚本:
import numpy as np
from PIL import Image
bmp = open(filename, 'rb')
bmp.seek(1078)
row = []
rows = []
for j in range(0, 494):
for I in range(0, 656):
row.append(int.from_bytes(bmp.read(1), 'little'))
rows.append(row)
row = []
data = np.array(rows, dtype = np.uint8)
data = np.flip(data, 0)
img = Image.fromarray(data, 'L')
img.show()
bmp.close()
当我使用 bmp.seek(1078) 时,bmp 图像会像在 Windows 照片中一样被正确读取和显示。当我使用 bmp.seek(54) 时,bmp 图像显示错误,就像我使用 img = Image.open(filename) 或其他 python 库时一样。 根据 Wikipedia,bmp 标头后跟一个长度为 2^n*4=1024 的颜色表(n = 8:每像素值的位数)。此颜色表不会添加到每像素 16 位或更多位 (RGB) 的 bmp 文件中。由于 1024 + 54 = 1078 准确解释了标题长度和文件长度之间的差异,我假设 Python 模块在读取灰度 bmp 文件时没有正确考虑标题大小。 还是我在 python 实现中遗漏了一些可以解决我的问题的选项?
【讨论】:
以上是关于尝试在 python 中加载 bmp 图像时,数组列的顺序未对齐的主要内容,如果未能解决你的问题,请参考以下文章