尝试从给定的PNG图像中提取像素值

gpu*_*guy 11 png opencv image image-processing imagecreatefrompng

试图了解PNG格式.

考虑这个PNG图像:

在此输入图像描述

图像取自这里

在十六进制编辑器中,它看起来像这样:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00 
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F 
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 
00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 
00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 
73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 
C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 
01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 
68 03 20 FB ED 96 65 00 00 00 00 49 45 4E 44 AE 42 60 82
Run Code Online (Sandbox Code Playgroud)

等效字符:

‰PNG........IHDR...€...D.....Æ%ª>...ÂIDATx^íÔ..Ã0.@Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰
»R.;‡þ..€.......@....... ....€.......@....... ...Ô^jdK”õ˜|Ñô’\\>Ïœ?sqX_¯
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3“{f7Ï«¿ùÉ/.€.......@....... ....€.......@....... ..Œ7Ûh. 
ûí–e....IEND®B`‚
Run Code Online (Sandbox Code Playgroud)

以下是HEX编辑器的屏幕截图中显示的内容:

在此输入图像描述

我正在尝试对此图像进行反向工程以提取标题部分和RGB像素值.我在这里读到了关于PNG的内容,到目前为止,我已经注意到以下关于此图像:

IHDR块必须首先出现.它包含:

Width:              4 bytes
Height:             4 bytes
Bit depth:          1 byte
Color type:         1 byte
Compression method: 1 byte
Filter method:      1 byte
Interlace method:   1 byte
Run Code Online (Sandbox Code Playgroud)

下面我开始按顺序阅读HEX数据:

1-前8字节:这是8字节签名

 89 50 4E 47 0D 0A 1A 0A
Run Code Online (Sandbox Code Playgroud)

同样地,这是:在HEX编辑器中可以看到%PNG

有效的PNG图像必须包含IHDR块,一个或多个IDAT块以及IEND块.

2-块:长度

 00 00 00 0D
Run Code Online (Sandbox Code Playgroud)

3块:块类型

 49 48 44 52
Run Code Online (Sandbox Code Playgroud)

哪个是IHDR.

http://www.w3.org/TR/PNG-Chunks.html

4-块:图像的宽度(以十进制128为单位)

00 00 00 80
Run Code Online (Sandbox Code Playgroud)

5-块:图像的高度(以小数68表示)

00 00 00 44
Run Code Online (Sandbox Code Playgroud)

6-块:BIT DEPTH(1字节)

08
Run Code Online (Sandbox Code Playgroud)

7-块:颜色类型

02
Run Code Online (Sandbox Code Playgroud)

8-压缩方法

00
Run Code Online (Sandbox Code Playgroud)

9-过滤方法:

00
Run Code Online (Sandbox Code Playgroud)

10-隔行扫描方法:

00
Run Code Online (Sandbox Code Playgroud)

11-以下数据是什么?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

49 44 41 54

13-这些数据是什么(在IDAT之后):

78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 68 03 20 FB ED 96 65 00 00 00 00

14- IEND:

49 45 4E 44

15-最后4个字节

 AE 42 60 82
Run Code Online (Sandbox Code Playgroud)

这些是什么 ?

有人可以帮助我理解,上面的第11,13和15点?Pixel值在哪里?图像有(128 x 68像素)

了解这些细节的目的:

一旦我知道这些细节,我将生成自己的16位PNG图像.我已经有了像素值,所以我的工作是引入标题等.
我不知道是否有可以执行此工作的软件.

UPDATE

我现在明白因为压缩,我无法找到像素值.

我知道我可以在OpenCV中编写一个文件并将其保存为png.那么现在我的直接问题是:我有一个二进制文件,具有灰度16位像素值.我可以在OpenCV中将其写为16位PNG吗?

ebo*_*oix 4

尽管了解 PNG 图像的实际含义以及图像在文件中的实际表示方式可能很有趣,但您不需要知道这些来生成 PNG 文件。

请注意,PNG 使用无损压缩,这意味着每个像素不会获得两个字节。

您可以在程序中生成图像,并使用许多现有的库以 PNG 格式输出。例如,您可以在 OpenCV 中制作图像,然后使用imWrite. 其中一个参数可以使其输出为 PNG。


如果您有灰度 16 位像素值,那么您可以将它们放入Mat.

然后将其转换为 IplImage:将 cv::Mat 转换为 IplImage*

然后你可以将其输出到文件中。

  • +1但我不完全同意“你只是浪费了时间”。对于您当前的任务来说,了解 PNG 的内部结构可能不是必需的,但它仍然是在学习。 (3认同)