Question

J'aimerais travailler sur les bases de l'imagerie informatique. Je cherche un moyen de lire des pixels individuels de données, de les analyser par programme et de les modifier. Quel est le meilleur langage à utiliser pour cela (Python, c ++, Java ...)? Quel est le meilleur format de fichier?

Je ne veux pas de logiciels / API super sophistiqués ... Je cherche les bases.

Était-ce utile?

La solution

Si vous avez besoin de vitesse (vous aurez probablement toujours besoin de vitesse avec le traitement d'image), vous devez absolument travailler avec des données de pixels brutes. Java présente de réels inconvénients, car vous ne pouvez pas accéder directement à la mémoire, ce qui ralentit considérablement l’accès aux pixels par rapport à un accès direct à la mémoire. C ++ est définitivement le langage de choix pour le traitement d’image par la production. Mais vous pouvez, par exemple, également utiliser C #, car cela permet de créer un code non sécurisé dans des zones spécifiques. (Examinez la propriété du pointeur scan0 de la classe bitmapdata.) J'ai utilisé C # avec succès pour les applications de traitement d'images et elles sont nettement plus rapides que leurs homologues java. Je n’utiliserais aucun langage de script ou java à cette fin.

Autres conseils

Il est très judicieux de manipuler les vastes tableaux multidimensionnels ou complexes d'informations sur les pixels, qui sont des images utilisant des langages de haut niveau tels que Python . Il existe une bibliothèque appelée PIL (la bibliothèque d'imagerie Python ) qui vous permettra faire des filtres généraux et des transformations (changer la luminosité, adoucir, désaturer, rogner, etc.) ainsi que manipuler les données de pixels brutes.

Il s'agit de la bibliothèque d'images la plus simple et la plus simple que j'ai utilisé à ce jour et peut être étendu pour faire tout ce qui vous intéresse ( détection des contours dans très peu de code, par exemple).

Non seulement C / C ++ sera plus rapide, mais la plupart des exemples de code de traitement d'image que vous découvrirez seront également en C, il sera donc plus facile d'incorporer les éléments que vous trouverez.

si vous souhaitez effectuer un travail numérique sur vos images (think matrix) et accéder à Python, consultez http: / /www.scipy.org/PyLab - c’est fondamentalement la capacité de faire du matlab en python, mon pote ne jure que par lui.

(Cela pourrait ne pas s'appliquer au PO qui souhaitait uniquement les bases élémentaires - mais maintenant que la question de la vitesse a été abordée, j'ai besoin de l'écrire, juste pour l'enregistrement.)

Si vous voulez vraiment, avoir besoin de vitesse, il est préférable d'oublier de travailler au niveau pixel par pixel et de voir si les opérations que vous devez effectuer peuvent être vectorisé . Par exemple, pour votre code C / C ++, vous pouvez utiliser l'excellent Bibliothèque IPP Intel (non, je ne travaille pas pour Intel).

Cela dépend un peu de ce que vous essayez de faire.

Si votre vitesse d'exécution est votre problème, c ++ est la meilleure solution.

Si la vitesse de développement est un problème, cependant, je suggérerais de regarder java. Vous avez dit que vous souhaitiez une manipulation de pixels de bas niveau, ce que java fera pour vous. Mais l’autre problème qui pourrait poser problème est le traitement des différents formats de fichiers. Java dispose de très bonnes API pour la lecture et l’écriture de divers formats d’image (en particulier de la bibliothèque java2d. Vous choisissez d’ignorer les niveaux supérieurs de l’API)

.

Si vous optez pour l'option c ++ (ou si python y réfléchit), je suggérerais à nouveau d'utiliser une bibliothèque pour vous aider à résoudre les problèmes de démarrage liés à la lecture et à l'écriture de fichiers. J'ai déjà eu du succès avec libgd

Quelle langue connaissez-vous le mieux? Pour moi, c'est la vraie question. Si vous passez des mois et des mois à apprendre une langue en particulier, il n’ya aucun avantage réel à utiliser Python ou Java uniquement pour leur vitesse de développement (à prouver). Je suis particulièrement compétent en C ++ et je pense que pour cette tâche particulière, je peux être aussi rapide qu'un programmeur Java, par exemple. À l’aide d’une bonne bibliothèque (on pense à OpenCV), vous pouvez créer tout ce dont vous avez besoin en quelques lignes de code C ++, en réalité.

Réponse courte: C ++ et OpenCV

J’ai étudié l’intelligence artificielle et la vision par ordinateur, je connais donc assez bien le type d’outils utilisés dans ce domaine.

En gros: vous pouvez utiliser ce que vous voulez tant que vous savez comment ça marche en arrière-plan.

Maintenant, en fonction de vos objectifs, vous pouvez utiliser:

  • C, mais vous perdrez beaucoup de temps dans la vérification des bogues et la gestion de la mémoire lors de l’implémentation de vos algorithmes. Donc, théoriquement, c’est le langage le plus rapide pour faire ce genre de travail, mais si vos algorithmes ne sont pas efficaces sur le plan des calculs (en termes de complexité) ou si vous perdez trop de temps à vérifier les bogues, cela ne vaut clairement pas la peine. Je vous conseillerais donc de commencer par implémenter votre application dans une autre langue, puis vous pourrez toujours optimiser de petites parties de votre code avec des liaisons C.
  • Octave / MatLab: un langage très efficace, presque autant que le C, et vous pouvez créer des algorithmes très élégants et succincts. Si vous êtes dans la vectorisation, les opérations matricielles et linéaires, vous devriez y aller. Cependant, vous ne pourrez pas développer une application complète avec ce langage, il est davantage axé sur les algorithmes, mais vous pourrez ensuite développer une interface en utilisant un autre langage ultérieurement.
  • Python: langage tout-en-un, élégant et accessible, utilisé dans des applications gigantesques telles que Google et Facebook. Vous pouvez faire à peu près tout ce que vous voulez avec Python, tout type d’application. Il sera parfaitement adapté si vous souhaitez créer une application complète (avec interaction client et tout, et pas seulement des algorithmes), ou si vous souhaitez créer rapidement un prototype à l'aide de bibliothèques existantes, car Python dispose d'un très grand nombre de bibliothèques de haute qualité, telles que OpenCV . Cependant, si vous voulez seulement faire des algorithmes, vous devriez mieux utiliser Octave / MatLab.

La réponse retenue en tant que solution est très biaisée et vous devez faire attention à ce type de commentaire archaïque.

De nos jours, le matériel est moins cher que le wetware (humain) et vous devez donc utiliser des langages dans lesquels vous serez en mesure de produire des résultats plus rapidement, même au prix de quelques cycles de processeur ou de l'espace mémoire.

De plus, beaucoup de gens ont tendance à penser que tant que vous implémentez votre logiciel en C / C ++, vous créez le Saint Graal de la rapidité: ce n'est tout simplement pas vrai. Premièrement, parce que la complexité des algorithmes compte beaucoup plus que le langage que vous utilisez (un mauvais algorithme ne battra jamais un meilleur algorithme, même s'il est implémenté dans le langage le plus lent de l'univers), et deuxièmement, parce que les langages de haut niveau font beaucoup aujourd'hui de la mise en cache et de l'optimisation de la vitesse pour vous, ce qui peut rendre votre programme exécuté encore plus rapidement qu'en C / C ++.

Bien sûr, vous pouvez toujours tout faire en C / C ++, mais combien de temps êtes-vous prêt à perdre pour réinventer la roue?

Réponse courte? Je dirais que C ++, vous avez beaucoup plus de flexibilité pour manipuler des morceaux de mémoire bruts que Python ou Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top