Depuis la réponse de ffriend est que partiellement vrai, je vais ajouter un peu plus à elle (en C++). L'auteur de cette question demande explicitement d'exporter vers PGM (format de fichier PXM qui stocke chaque pixel en 8 bits) et non pas PNG (comme décrit dans sa réponse). La question principale ici est que la official documentation for imwrite est omho pas clair à ce sujet du tout:
Pour PPM, PGM, ou PBM, il peut être un indicateur de format binaire (CV_IMWRITE_PXM_BINARY), 0 ou 1. Valeur par défaut est 1 .
Si nous lisons la phrase en anglais normal, nous avons une liste d'options: CV_IMWRITE_PXM_BINARY, 0 ou 1. Il n'y a aucune mention que ceux-ci peuvent et sont réellement supposés être combinés!Je devais expérimenter un peu (j'ai aussi besoin de stocker des images 8 bits pour mon projet) et a finalement obtenu à la solution souhaitée:
std::vector<int> compression_params; // Stores the compression parameters
compression_params.push_back(CV_IMWRITE_PXM_BINARY); // Set to PXM compression
compression_params.push_back(0); // Set type of PXM in our case PGM
const std::string imageFilename = "myPGM.pgm"; // Some file name - C++ requires an std::string
cv::imwrite(imageFilename, myImageMatrix, compression_params); // Write matrix to file
Mon enquête a également été alimentée par this question où l'auteur était (peut-être est toujours) aux prises avec le même problème et aussi par quelques informations de base sur le format PXM, que vous pouvez trouver here.
Le résultat (seulement une partie de l'image) est affiché ci-dessous:
P2
32 100
255
121 237 26 102 88 143 67 224 160 164 238 8 119 195 138 16 176 244 72 106 72 211 168 45 250 161 37 1 96 130 74 8
126 122 227 86 106 120 102 150 185 218 164 232 111 230 207 191 39 222 236 78 137 71 174 96 146 122 117 175 34 245 6 125
124 121 241 67 225 203 118 209 227 168 175 40 90 19 197 190 40 254 68 90 88 242 136 32 123 201 37 35 99 179 198 163
97 161 129 35 48 140 234 237 98 73 105 77 211 234 88 176 152 12 68 93 159 184 238 5 172 252 38 68 200 130 194 216
160 188 21 53 16 79 71 54 124 234 34 92 246 49 0 17 145 102 72 42 105 252 81 63 161 146 81 16 72 104 66 41
189 100 252 37 13 91 71 40 123 246 33 157 67 96 71 59 17 196 96 110 109 116 253 30 42 203 69 53 97 188 90 68
101 36 84 5 41 59 80 8 107 160 168 9 194 8 71 55 152 132 232 102 12 96 213 24 134 208 1 55 64 43 74 22
92 77 30 44 139 96 70 152 160 146 142 8 87 243 11 91 49 196 104 250 72 67 159 44 240 225 69 29 34 115 42 2
109 176 145 90 137 172 65 25 162 57 169 92 214 211 72 94 149 20 104 56 27 67 218 17 203 182 5 124 138 2 130 48
121 225 25 106 89 76 69 189 34 25 173 8 114 83 72 52 145 154 64 40 91 2 251 53 251 237 20 124 82 2 194 42 ...
Ce qui est exactement ce qui est nécessaire dans ce cas. Vous pouvez voir le marquage "P2" en haut et les valeurs sont clairement comprises entre 0 et 255, ce qui correspond exactement à 8 bits par pixel.
Comment est-ce que je pourrais modifier cela pour enregistrer en tant qu'images PPM? Je ne peux pas sembler trouver la documentation sur ce que le deuxième int a poussé à votre tableau représente –
Essayez une combinaison des paramètres mentionnés dans la documentation. En dehors de cela, la seule autre façon de trouver une solution avec OpenCV est de regarder directement le code source d'OpenCV mais j'espère vraiment que les choses n'iront pas aussi loin. Vous pouvez également écrire votre propre version de imwrite() et l'inclure dans votre code source. Comme vous pouvez le voir, PGM est assez simple et je ne pense pas qu'il soit si difficile d'écrire une fonctionnalité d'exportation PPM si nécessaire. Notez également que l'extension de fichier est importante dans OpenCV. – rbaleksandar