试图在python中加载bmp图像时,数组列的顺序未对齐



我正在尝试在python中加载并显示bmp图像
我现在已经尝试了几个模块(PIL、skimage.io、matplotlib(,但每次都会错误地显示图像
这是原始图片,这是在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文件的方式似乎有问题。当我打印加载的图像的第一列并打印(图像[:,0](时,得到的(494,(阵列已经包含了255值的白色像素,这些像素应该只出现在图像的中间图像[:300]周围的某个地方。到目前为止,我找不到任何有助于解决这个问题的io.imread((选项。

我做错了什么?如何以正确的列顺序加载bmp图像?

当我在默认的windows照片应用程序或绘画中打开原始bmp图像时,它会正确显示
我使用的是python 3.8.5和scikit镜像0.17.2。

我通过编写自己的read bmp脚本来解决我的问题,该脚本特别注意bmp标头的结束位置。

以下是如何在python中读取bmp文件头的建议解决方案?我实现了标题读取,并收到了以下信息:

  • 类型:BM
  • 尺寸:325142
  • 保留1:0
  • 保留2:0
  • 偏移:54
  • DIB标题大小:40
  • 宽度:656
  • 高度:494
  • 彩色平面:1
  • 每像素位数:8
  • 压缩方法:0
  • 原始图像大小:324064
  • 水平分辨率:0
  • 垂直分辨率:0
  • 颜色数量:0
  • 重要颜色:0

从维基百科我了解到BMP文件头应该是54字节大;偏移:54〃;参数。我的灰度图像中的每个像素都由一个单字节描述
然而;尺寸:325142〃;以及";原始图像大小: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库时一样
根据维基百科,bmp标题后面跟着一个长度为2^n*4=1024的颜色表(n=8:每个像素值的位数(。此颜色表不会添加到每像素(RGB(有16个或更多位的bmp文件中。由于1024+54=1078准确地解释了标头长度和文件长度之间的差异,我认为python模块在读取灰度bmp文件时没有正确考虑标头大小
或者我在python实现中缺少了一些可以解决我的问题的选项?

最新更新