7
votes

Comment manipuler une image au niveau pixel en C?

Comment puis-je lire une image en C afin que je puisse avoir un contrôle direct sur ses pixels (comme nous le faisons à Matlab)?

J'ai essayé l'ancienne façon: P>

FILE *fp;
fp = fopen("C:\\a.tif","r");


5 commentaires

C est un niveau inférieur à celui que vous semblez penser que c'est. Ce fopen vous donne un binaire cru et il vous appartient de comprendre comment interpréter ce binaire comme une image ou utiliser une bibliothèque comme suggérée ci-dessous.


@Breton, il a spécifiquement demandé comment décoder ces fichiers et non le contenu binaire. Je pense que c est une meilleure option lorsque vous voulez que votre programme soit rapide, sinon Python fournit à PIL qui est assez bon.


@Breton - que fopen () ne vous donne aucun binaire brut de ce type, il vous donne le mode texte, ce qui signifie qu'il est susceptible de lire des fichiers de manière incorrecte sur Windows.


Mais sur Linux et Unix c'est bon.


@Xolve Il n'a pas fait, il a demandé comment manipuler les pixels, comme il le fait à Matlab. Je n'ai jamais utilisé Matlab, mais je soupçonne qu'il est assez haut niveau pour ne pas forcer l'utilisateur à décoder des données binaires brutes dans une image. Je souligne simplement que c n'est pas ce niveau élevé, et il ne comprend pas les images sans bibliothèque ou sans écrire un programme pour décoder les informations compressées binaires dans des données de pixel. @Lutz, oh, je suppose qu'il a besoin d'un drapeau "B" ou de quelque chose? Je n'étais pas au courant que c a fait une distinction entre le texte et le binaire.


5 Réponses :


4
votes

regarder libtiff . Presque tous les formats d'image ont une sorte de données d'en-tête et de nombreuses personnes sont comprimées pour conserver des fichiers raisonnables. Vous pouvez bien sûr écrire C code pour lire les en-têtes et effectuer la décompression, mais il n'y a pas besoin car quelqu'un d'autre l'a déjà fait. Look ici pour certaines bibliothèques d'image C.

Une autre question est une autre question que vous souhaitez que les données dans la manipulation - un choix commun soient 24 bits RVB (I.e. R, G et B varient chacune de 0 à 255). Dans Matlab, vous voyez également R, G, B en tant que doubles variant de 0,0 à 1,0. Ou vous voudrez peut-être un espace de couleur différent (HSV, YUV, etc.).

N'oubliez pas que les opérations entière sont plus rapides, mais elles peuvent être plus gênantes.


1 commentaires

+1 pour répondre à la question de OP mais nous leur rappelant également de ne pas réinventer la roue



3
votes

manipuler jpeg fichiers utilisez libjpeg , TIFF Les fichiers utilisent libtiff , etc.

Une autre option facile est gd qui permet la manipulation de nombreux formats d'image (PNG, JPEG, GIF , ...).


0 commentaires

1
votes

Il existe des libs open-source pour charger des images de types différents et de libtiff pour charger des images TIFF. Si vous voulez juste jouer et que le format de fichier n'est pas très important, je jetterais un coup d'œil sur NetPBM format (Inparticulaire P5 et P6). Il est assez facile d'écrire un chargeur et un économiseur pour elle et bien sûr un bon exercice.


0 commentaires

1
votes

Magickwand de ImageMagick est une autre bonne option


0 commentaires

4
votes

OpenCV est une bibliothèque de vision informatique, mais peut également être utilisée pour des tâches "bas niveau". . Il soutient BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIFF.


0 commentaires