Domanda

Mi piacerebbe fare un po 'di lavoro con i noccioloni dell'imaging del computer. Sto cercando un modo per leggere singoli pixel di dati, analizzarli in modo programmatico e modificarli. Qual è il miglior linguaggio da usare per questo (Python, c ++, Java ...)? Qual è il miglior formato di file?

Non voglio software / API super fantasiosi ... Sto cercando le nozioni di base.

È stato utile?

Soluzione

Se hai bisogno di velocità (probabilmente avrai sempre bisogno di velocità con l'elaborazione delle immagini) devi sicuramente lavorare con dati pixel grezzi. Java presenta alcuni svantaggi reali in quanto non è possibile accedere direttamente alla memoria, il che rende l'accesso ai pixel piuttosto lento rispetto all'accesso diretto alla memoria. C ++ è sicuramente il linguaggio di scelta per l'elaborazione delle immagini nell'uso della produzione. Ma puoi, ad esempio, usare anche C # in quanto consente il codice non sicuro in aree specifiche. (Dai un'occhiata alla proprietà pointer0 scan0 della classe bitmapdata.) Ho usato C # con successo per le applicazioni di elaborazione delle immagini e sono sicuramente molto più veloci delle loro controparti Java. Non userei alcun linguaggio di scripting o Java per tale scopo.

Altri suggerimenti

È molto a est manipolare le grandi matrici multidimensionali o complesse di informazioni sui pixel che sono immagini che usano linguaggi di alto livello come Python . C'è una libreria chiamata PIL (la libreria di imaging Python ) che è abbastanza utile e ti permetterà esegue filtri e trasformazioni generali (modifica la luminosità, attenua, desatura, ritaglia, ecc.) oltre a manipolare i dati pixel non elaborati.

È la la più semplice e semplice libreria di immagini che ho usato fino ad oggi e può essere esteso per fare ciò che ti interessa ( rilevamento dei bordi in pochissimo codice, ad esempio).

Non solo C / C ++ sarà più veloce, ma la maggior parte del codice di esempio di elaborazione delle immagini che scopri ci sarà anche in C, quindi sarà più facile incorporare le cose che trovi.

se stai cercando un lavoro numerico sulle tue immagini (pensa a matrice) e tu in Python dai un'occhiata a http: / /www.scipy.org/PyLab - questa è fondamentalmente la capacità di fare matlab in pitone, amico mio, giura su di esso.

(Questo potrebbe non valere per l'OP che voleva solo le nozioni di base, ma ora che è stato sollevato il problema della velocità, devo scriverlo, solo per la cronaca.)

Se veramente hai bisogno di velocità, è meglio dimenticare di lavorare a livello di pixel per pixel e piuttosto vedere se le operazioni che devi eseguire potrebbero essere vettorializzato . Ad esempio, per il tuo codice C / C ++ potresti usare l'eccellente Libreria Intel IPP (no, non lavoro per Intel).

Dipende un po 'da cosa stai cercando di fare.

Se la velocità di runtime è il tuo problema, c ++ è il modo migliore di procedere.

Se la velocità di sviluppo è un problema, suggerirei di guardare Java. Hai detto che volevi manipolazione a basso livello dei pixel, che java farà per te. Ma l'altra cosa che potrebbe rappresentare un problema è la gestione dei vari formati di file. Java ha alcune API molto belle per gestire la lettura e la scrittura di vari formati di immagini su file (in particolare la libreria java2d. Scegli di ignorare i livelli più alti dell'API)

Se scegli l'opzione c ++ (o python ci viene in mente) ti suggerirei di nuovo l'uso di una libreria per farti superare i problemi di avvio della lettura e della scrittura dei file. In precedenza ho avuto successo con libgd

Quale lingua conosci meglio? Per me, questa è la vera domanda. Se hai intenzione di passare mesi e mesi ad imparare una lingua particolare, allora non c'è alcun vantaggio nell'usare Python o Java solo per la loro (per essere provata) velocità di sviluppo. Sono particolarmente abile in C ++ e penso che per questo compito specifico posso essere veloce come un programmatore Java, per esempio. Con l'aiuto di una buona libreria (mi viene in mente OpenCV) puoi davvero creare tutto ciò di cui hai bisogno in un paio di righe di codice C ++, in realtà.

Risposta breve: C ++ e OpenCV

Ho studiato Intelligenza Artificiale e Computer Vision, quindi conosco abbastanza bene il tipo di strumenti che vengono utilizzati in questo campo.

Fondamentalmente: puoi usare quello che vuoi fintanto che sai come funziona dietro la scena.

Ora, a seconda di ciò che vuoi ottenere, puoi usare:

  • linguaggio C, ma perderai molto tempo nel controllo dei bug e nella gestione della memoria durante l'implementazione dei tuoi algoritmi. Quindi teoricamente, questo è il linguaggio più veloce per fare quel tipo di lavoro, ma se i tuoi algoritmi non sono efficienti dal punto di vista computazionale (in termini di complessità) o se perdi troppo tempo nel controllo dei bug, questo chiaramente non ne vale la pena. Quindi consiglierei di implementare prima la tua applicazione in un'altra lingua, e poi in seguito puoi sempre ottimizzare piccole parti del tuo codice con i collegamenti C.
  • Octave / MatLab: linguaggio molto efficiente, quasi quanto C, e puoi creare algoritmi molto eleganti e succinti. Se ti piacciono le operazioni di vettorializzazione, matrice e lineari, dovresti andare con quello. Tuttavia, non sarai in grado di sviluppare un'intera applicazione con questo linguaggio, è più focalizzata sugli algoritmi, ma puoi sempre sviluppare un'interfaccia usando un altro linguaggio in seguito.
  • Python: linguaggio all-in-one elegante e accessibile, utilizzato in applicazioni gigantesche su larga scala come Google e Facebook. Puoi fare praticamente tutto ciò che vuoi con Python, qualsiasi tipo di applicazione. Sarà perfettamente adattato se si desidera creare un'applicazione completa (con interazione con il client e tutti, non solo algoritmi) o se si desidera redigere rapidamente un prototipo utilizzando le librerie esistenti poiché Python ha un set molto ampio di librerie di alta qualità, come OpenCV . Tuttavia, se vuoi solo creare algoritmi, dovresti usare meglio Octave / MatLab.

La risposta che è stata selezionata come soluzione è molto distorta e dovresti stare attento a questo tipo di commento arcaico.

Al giorno d'oggi, l'hardware è più economico di wetware (umani), e quindi, dovresti usare linguaggi in cui sarai in grado di produrre risultati più velocemente, anche se è a costo di alcuni cicli della CPU o spazio di memoria.

Inoltre, molte persone tendono a pensare che fintanto che implementate il vostro software in C / C ++, state facendo il Saint Graal della velocità: questo non è vero. Innanzitutto, perché la complessità degli algoritmi è molto più importante della lingua che stai utilizzando (un algoritmo errato non batterà mai un algoritmo migliore, anche se implementato nella lingua più lenta nell'universo), e in secondo luogo perché al giorno d'oggi le lingue di alto livello stanno facendo molto di cache e ottimizzazione della velocità per te, e questo può rendere il tuo programma ancora più veloce che in C / C ++.

Ovviamente, puoi sempre fare tutto quanto sopra in C / C ++, ma quanto tempo sei disposto a perdere per reinventare la ruota?

Risposta breve? Direi C ++, hai molta più flessibilità nella manipolazione di blocchi di memoria grezzi rispetto a Python o Java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top