En essayant d'extraire les valeurs de pixels d'une image PNG
Essayer de comprendre le format PNG.
Considérer cette Image PNG:
L'Image est prise à partir de ici
Dans l'Éditeur Hexadécimal , il ressemble à ceci:
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
Équivalent caractères:
‰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`‚
La même chose est illustré dans la Capture d'écran suivante de l'Éditeur HEXADÉCIMAL:
Je suis en train de désosser cette image pour en extraire la partie en-tête et les valeurs de pixels RVB. J'ai lu sur le PNG et aussi ici , et pour l'instant j'ai fait les observations suivantes à propos de cette Image:
La IHDR morceau doit apparaître en PREMIER. Il contient:
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
Ci-dessous, je commence la lecture de l'HEX de Données dans l'ordre:
1 - 8 Premiers octets: C'est l'Octet de 8 signature
89 50 4E 47 0D 0A 1A 0A
De manière équivalente, c'est : %PNG comme on peut le voir dans l'Éditeur HEXADÉCIMAL
Valide PNG image doit contenir un IHDR morceau, un ou plusieurs IDAT morceaux, et un IEND morceau.
2 - Bloc: Longueur
00 00 00 0D
3-Morceau: Morceau Type
49 48 44 52
Qui est IHDR.
http://www.w3.org/TR/PNG-Chunks.html
4 - Chunk: Largeur de l'Image (en Décimal 128)
00 00 00 80
5 - Bloc: Hauteur de l'image (en Décimal 68)
00 00 00 44
6 - Morceau: la PROFONDEUR de BITS (1 octet )
08
7 - Chunk: Type De Couleur
02
8 - méthode de Compression
00
9 - méthode du Filtre:
00
10 Entrelacé méthode:
00
11 - qu'est-Ce que les données suivantes?
C6 25 AA 3F 00 00 00 C2
12-- IDAT
49 44 41 54
13 - qu'est-Ce que ces données (après IDAT):
78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 JJ 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 EE D1 EC 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 Derniers octets
AE 42 60 82
Quelles sont-elles ?
Certains peuvent m'aider à comprendre, points 11, 13 et 15 ci-dessus? Et où sont les valeurs de Pixel? L'Image est d'avoir (128 x 68 pixels)
But de connaître ces détails:
Une fois que je sais que ces détails, je générer mon propre 16 bits d'image PNG. J'ai déjà les valeurs de pixel, donc, mon travail serait d'introduire en-têtes, etc.
Je ne sais pas si il existe un logiciel qui peut effectuer ce travail.
Mise à JOUR
Je comprends maintenant, à cause de la compression, je ne serais pas en mesure de localiser les valeurs des pixels.
J'ai eu l'idée que je puisse écrire un fichier dans OpenCV et l'enregistrer en png. Eh bien maintenant, ma question est: j'ai un binaire fichier en niveaux de gris 16 bits de valeurs de pixels. Puis-je écrire cela dans OpenCV 16 bits PNG ?
OriginalL'auteur gpuguy | 2012-06-19
Vous devez vous connecter pour publier un commentaire.
Bien qu'il pourrait être intéressant de savoir ce que les Images PNG ne le sont réellement, et comment l'image est en fait représenté dans le fichier, vous n'avez pas besoin de le savoir pour générer un fichier PNG.
Noter que le format PNG utilise une compression sans perte, ce qui signifie que vous n'obtiendrez pas de deux octets par pixel.
Vous pouvez générer votre image dans un programme et de sortie au format PNG à l'aide de la plupart des bibliothèques qui y sont là-bas.
Par exemple, vous pouvez faire de votre image dans OpenCV et ensuite un fichier de sortie avec
imWrite
. L'un des paramètres peut faire la sortie à un fichier PNG.Si vous avez l'échelle de gris 16 bits des valeurs de pixel, alors vous pouvez les mettre dans un
Mat
.Alors que convertir un IplImage: La conversion de cv::Mat pour IplImage*
Ensuite, vous pouvez la sortie vers un fichier.
Merci, votre réponse est très utile pour moi. Je vais le tester, puis d'afficher le résultat.
+1 Mais je ne suis pas entièrement d'accord avec "Tu viens de perdre ton temps". L'apprentissage sur le fonctionnement interne de PNG pourrait ne pas être nécessaire pour votre tâche en cours, mais c'est de l'apprentissage, tout de même.
Les gars aujourd'hui j'ai appris à la fois à l'intérieur et à l'extérieur du PNG! Merci pour votre aide les gars! Et oui l'apprentissage des détails de bas niveau sont importants b'coz il rend les choses pour le futur.
Okay, vous avez raison à ce sujet. Ma déclaration a été assez agressif.
OriginalL'auteur eboix
Juste pour être complet (eboix la réponse est à droite sur place)
Chaque morceau se termine par un CRC (4 octets), et commence avec 4 octets que dire de sa longueur.
Donc,
C6 25 AA 3E
est le CRC du bloc précédent (IHDR) et00 00 00 C2
(194) est la longueur de la suite (IDAT) chunk.De la même manière, les 4 derniers octets est le CRC de la IEND morceau.
OriginalL'auteur leonbloy
Je n'ai pas regarder de trop près, mais en regardant la structure...
Q11.
C6 25 AA 3E = CRC32
00 00 00 C2 = Taille de segment suivant
Q13.
vérifiez le format png spec vous, évoquée précédemment, qui ressemble à la IDAT morceau vous déjà connaître la compression appliqué à!
Q15.
AE 42 60 82 = CRC32
OriginalL'auteur Phill