【问题标题】:What is the file format of the 16bit bitmap hex file?16bit位图hex文件的文件格式是什么?
【发布时间】:2016-02-12 07:01:32
【问题描述】:

我是这个领域的新手;如果我没有很好地描述这个问题,请原谅。

我有一个十六进制文件,它应该包含三个图像(宽度:640,高度:333)。十六进制文件为 1.2 MB。所以如果我们稍微计算一下,我们会得到每个像素应该有 16 位的数据。

文件的部分十六进制代码如下:

90 eb 6f 14 02 02 fd fd 4e 01 80 02 00 00 00 00
90 eb 6f 14 82 82 7d 7d 4e 01 80 02 03 00 00 00
90 eb 6f 14 c2 c2 3d 3d 4e 01 80 02 00 00 8e 08
a7 33 0f d4 00 01 00 01 00 01 43 01 f8 03 0e 17
00 01 00 00 00 00 02 00 00 00 00 00 00 00 01 00
00 04 00 00 01 01 00 00 00 00 00 00 00 00 00 00
00 00 01 01 00 00 00 00 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01 00 00 00 00 00 00 01 01
00 00 00 00 01 00 00 00 00 00 00 00 00 00 01 01
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 01 00 00 08 01 00 00 00 00 00 00 00 00 00 00
00 01 00 00 00 00 00 01 00 00 00 00 00 0a 01 00
00 00 01 00 01 00 00 00 01 00 00 00 00 00 00 00
02 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01

如您所见,有一个包含 4 行内容的标题,其中 3 行内容相似。位图数据开始。重复行在文件中再重复两次。因此,我假设重复结构位于 3 个图像中的每个图像的开头。但是这些标头之间的数据是 210 KB,这意味着每像素 8 位。因此,我将每 8 位读取为一个微小的整数,并将其设置为图像相应像素的 rgb。所以我得到了3张灰度图像。文件中还有 630 KB 的数据未读。

这里是magnified version of the original image as gray(原图是彩色的)和obtained image。如您所见,有些像素(每隔一个像素)与原始像素相比完全不同,但整个图像几乎是正确的。

所以,我的问题如下: hex文件的真实结构是什么?我应该如何阅读十六进制文件? 如何获得原始彩色文件? 什么是额外的 630 KB 数据!?什么是错误的像素?!

这里还有原始图像(i.stack.imgur.com/NdBOa.png),原始图像为灰色(i.stack.imgur.com/wDUPB.png)和获得的图像(i.stack.imgur.com /lY3ib.png)。

【问题讨论】:

  • 您的原始文件是 636x330 而不是您所说的 640x333 - 为什么?图像发生了什么使它像现在这样 - 这是什么程序/工具?该工具的作者没有说明文件是如何工作的吗?整个文件在哪里?
  • 原始文件来自一个没有源代码的软件。我也认为它被裁剪为 636x330;但在二进制文件中它有 640x333 字节的数据。该软件没有可用的文档,我需要在 c++ 代码中做同样的事情。如果您需要,我可以附上整个文件。
  • 这里是整个文件:filebin.ca/2MAr1UtKowIR
  • 如果你附上整个文件,我会用它play - 错误,我的意思是“做一些非常专业的取证分析”。
  • 我已将其上传至 filebin.ca/2MAr1UtKowIR。感谢你的付出。这个帖子的答案就像我所做的一样stackoverflow.com/questions/11239203/…

标签: image image-processing bitmap file-format


【解决方案1】:

没有结论,但这是我发现的......

如果你用十六进制转储文件并查看开头,你会找到90eb,如果你在整个文件中查找它,你会得到:

xxd a.raw | egrep "90eb"

0000000: 90eb 6f14 0202 fdfd 4e01 8002 0000 0000  ..o.....N.......
0000010: 90eb 6f14 8282 7d7d 4e01 8002 0300 0000  ..o...}}N.......
0000020: 90eb 6f14 c2c2 3d3d 4e01 8002 0000 8e08  ..o...==N.......
0034340: e773 2bf4 90eb 6f14 c2c2 3d3d 4e01 8002  .s+...o...==N...
0068660: 0301 0100 ca03 0104 90eb 6f14 c2c2 3d3d  ..........o...==

数据看起来在每个90eb 之后的 32 个字节处开始。如果图像为 640x333,则每张图像将有 213,120 字节。所以我们可以像这样使用 ImageMagick 提取图像的基本平面/通道:

dd if=a.raw bs=1 skip=64 count=213120 | convert -depth 8 -size 640x333 gray:- a.png

dd if=a.raw bs=1 skip=213860 count=213120 | convert -depth 8 -size 640x333 gray:- b.png

dd if=a.raw bs=1 skip=427656 count=213120 | convert -depth 8 -size 640x333 gray:- c.png

现在我们遇到了一个问题 - 各个图像在所有三个图像中的位置不同 - 你可以看到,如果我像这样将 3 帧动画在一起:

convert -delay 80 a.png b.png c.png -normalize  anim.gif

所以现在我有点迷失了 - 因为视点似乎在移动,是否有多个摄像头?

我不知道 - 也许我的发现会启发其他人!让我们看看。

另一种方法可能是比较统计信息 - 如果您查看 “原始” 图像的统计信息,您会得到:

identify -verbose original.png | egrep "Red:|Green:|Blue:|mean:|deviation"
    Red:
      mean: 5.77718 (0.0226556)
      standard deviation: 17.0501 (0.066863)
    Green:
      mean: 13.7015 (0.0537312)
      standard deviation: 38.4053 (0.150609)
    Blue:
      mean: 10.2863 (0.0403386)
      standard deviation: 30.1792 (0.11835)

如果您现在查看上面提取的 a.pngb.pngc.png 的统计信息,您会得到:

identify -verbose a.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 2.48532 (0.00974635)
      standard deviation: 9.00678 (0.0353207)

identify -verbose b.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 10.1611 (0.0398473)
      standard deviation: 30.2288 (0.118544)


identify -verbose c.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 2.26135 (0.00886804)
      standard deviation: 7.43093 (0.0291409)

“原始”图像的统计数据与提取图像的假定“通道”之间似乎没有任何相关性......我认为这里发生的事情比我想象的要多。

【讨论】:

  • 谢谢你的努力,我用 C++ 代码做了和你一样的事情。有 3 张图像是由一台相机在 3 分钟内拍摄的。我通过 C++ 代码得到了这三个图像;但问题是您可以在其他每个像素中看到的噪点。所以我通过平均该像素邻居的值来消除噪声并将其设置为噪声像素。所以我的问题是那是什么噪音?或者每个像素都有 16 位数据,而其他每个像素都没有数据
  • 或者它可能是一个拜耳矩阵,实际上有 4 个通道 - RGBR 就像在数码相机上一样,这可能解释了额外的数据......
  • 也许是这样。原始彩色图像几乎是绿色和蓝色。那么如果是这种情况,我如何在 C++ 中读取它并将其分配给图片的像素?
  • 这个方法叫做“去马赛克”,但我的想法只是预感en.wikipedia.org/wiki/Bayer_filter
  • 非常感谢。有效。我用matlab测试过。这是 Matlab 的代码 > I = imread('mandi.tif'); J =去马赛克(我,'bggr');显示(一);图,imshow(J);
猜你喜欢
  • 2011-03-22
  • 2013-07-14
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多