L'écriture de 16 bits non compressé l'image à l'aide d'OpenCV
Comment puis-je enregistrer un 16 bits de l'image (PNG ou TIFF) sans aucune compression? Quelle est la syntaxe?
Pourquoi les gens sont downvoting cette question?
Je n'ai pas, mais je ne peux que supposer que, parce que l'OP semble poser une question de base sans faire ses devoirs. Comme par le "Comment Demander" l'entrée de la FAQ, les utilisateurs sont tenus à une recherche approfondie sur une question avant de la poser ici et de partager leurs résultats dans la question. Ne pas le faire pourrait inviter les downvotes et fermer les votes cette question a reçu. Je ne peux pas dire que je suis entièrement en désaccord avec eux.
Vous devriez vérifier OpenCV sources. De nombreuses fonctions avancées sont disponibles, mais ne sont pas documentées. Peut-être que certains d'appoint params pour imwrite vous y arriverez
peut-être que l'OP n'a pas de recherche, mais c'est pas une question triviale.
Je n'ai pas, mais je ne peux que supposer que, parce que l'OP semble poser une question de base sans faire ses devoirs. Comme par le "Comment Demander" l'entrée de la FAQ, les utilisateurs sont tenus à une recherche approfondie sur une question avant de la poser ici et de partager leurs résultats dans la question. Ne pas le faire pourrait inviter les downvotes et fermer les votes cette question a reçu. Je ne peux pas dire que je suis entièrement en désaccord avec eux.
Vous devriez vérifier OpenCV sources. De nombreuses fonctions avancées sont disponibles, mais ne sont pas documentées. Peut-être que certains d'appoint params pour imwrite vous y arriverez
peut-être que l'OP n'a pas de recherche, mais c'est pas une question triviale.
OriginalL'auteur EyalG | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Après 2 ans d'OpenCV pouvez enregistrer 16 bits Tiff (2.4.versions x) avec compression (LZW). Mais il prend également en charge des sans-papiers paramètre TIFFTAG_COMPRESSION en fonction
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )
Il peut être réglé à COMPRESSION_LZMA, par exemple (et qu'il fonctionne correctement).
Vous pouvez utiliser COMPRESSION_NONE comme une valeur pour ce paramètre (d'ailleurs vous avez à mettre en TIFFTAG_ROWSPERSTRIP paramètre à la hauteur de l'image).
Mais OpenCV génère encore incorrecte TIFF dans ce cas (en essayant de mettre en TIFFTAG_COMPRESSION à COMPRESSION_NONE), même dans la version 2.4.9.
Après avoir regardé OpenCV sources que j'ai trouvé 2 façons de surmonter cette restriction:
Recompiler OpenCV avec les changements dans l' "opencv/modules/imgcodecs/src/grfmt_tiff.cpp" - les gars de OpenCV paramètre ajouté pour la compression, mais il a oublié sur le fait que libtiff ne pouvez pas définir prédicteur dans TIFF poignée si nous ne voulons pas de compression. Vous devriez trouver ce code
if ( !TIFFSetField(pTiffHandle, TIFFTAG_IMAGEWIDTH, width)
|| !TIFFSetField(pTiffHandle, TIFFTAG_IMAGELENGTH, height)
|| !TIFFSetField(pTiffHandle, TIFFTAG_BITSPERSAMPLE, bitsPerChannel)
|| !TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, compression)
|| !TIFFSetField(pTiffHandle, TIFFTAG_PHOTOMETRIC, colorspace)
|| !TIFFSetField(pTiffHandle, TIFFTAG_SAMPLESPERPIXEL, channels)
|| !TIFFSetField(pTiffHandle, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)
|| !TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, rowsPerStrip)
|| !TIFFSetField(pTiffHandle, TIFFTAG_PREDICTOR, predictor)
)
{
TIFFClose(pTiffHandle);
return false;
}
et de le modifier pour
if ( !TIFFSetField(pTiffHandle, TIFFTAG_IMAGEWIDTH, width)
|| !TIFFSetField(pTiffHandle, TIFFTAG_IMAGELENGTH, height)
|| !TIFFSetField(pTiffHandle, TIFFTAG_BITSPERSAMPLE, bitsPerChannel)
|| !TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, compression)
|| !TIFFSetField(pTiffHandle, TIFFTAG_PHOTOMETRIC, colorspace)
|| !TIFFSetField(pTiffHandle, TIFFTAG_SAMPLESPERPIXEL, channels)
|| !TIFFSetField(pTiffHandle, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)
|| !TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, rowsPerStrip)
)
{
TIFFClose(pTiffHandle);
return false;
}
if (compression != COMPRESSION_NONE
&& !TIFFSetField(pTiffHandle, TIFFTAG_PREDICTOR, predictor)
)
{
TIFFClose(pTiffHandle);
return false;
}
après cette OpenCV pouvez enregistrer compressé et non compressé Tiff (dépend de paramètres à
imwrite
).L'autre façon est de les diriger à l'aide de libtiff dans votre application pour l'enregistrement des fichiers Tiff. Bien sûr, vous devez implémenter la fonction d'écriture dans un tel cas. Pour windows, vous devez compiler libtiff, mais il est assez simple tâche (libtiff contient les fichiers makefile pour de nombreux compilateurs et parfaitement compile dans MinGW et MSVC, 32 et 64 bits).
OriginalL'auteur avtomaton
À moins de 2.1 (n'ont pas utilisé les anciennes versions) cvSaveImage enregistre un seul canal 16b de la profondeur de l'image sans problèmes. J'utilise généralement .le format png pour cela.
Ce serait que vous obtenez un 16b de l'image avec "somedata":
OriginalL'auteur p.streef
Selon la OpenCV documentation, cvSaveImage ne supporte 8 bits de canal unique ou BGR images. Voir la section 2.0 docs.
Vous devez utiliser libpng, libMagick++ ou une autre bibliothèque pour enregistrer dans d'autres profondeurs de bits et de formats.
La libpng documentation contient un tutoriel sur la comment écrire des images PNG. Pour spécifier la norme RGB avec 16 bits par canal de données, l'utilisation bit_depth = 16 et color_type = PNG_COLOR_TYPE_RGB.
Pour faire de votre vie (sans doute) un peu plus facile, il y a aussi png++.
Edit: OpenCV semble le support de l'écriture 16bpc images dans des versions plus récentes. Voir la réponse de p.streef. Voici le lien vers la documentation pertinente à nouveau.
OriginalL'auteur onitake
Au cas où quelqu'un d'autre s'étend à travers cette avtomaton la solution semble avoir été ajouté via pull request https://github.com/opencv/opencv/pull/3744,
vous permettant de faire quelque chose comme (fonctionne avec l'3.2):
OriginalL'auteur Adam Fowles
Mon expérience est que OpenCV enregistre les images en 16 bits (n'essayez pas avec 3 canaux).
Le pgm format fonctionne bien et c'est un vrai format raw (pas de longueur de course de compression).
OriginalL'auteur jamk