2008-09-27 26 views
5

Me gustaría hacer un poco de trabajo con los detalles de la imagen por computadora. Estoy buscando una manera de leer píxeles individuales de datos, analizarlos programáticamente y cambiarlos. ¿Cuál es el mejor lenguaje para usar para esto (Python, C++, Java ...)? ¿Cuál es el mejor formato de archivo?Reconocimiento de imágenes

No quiero ningún software/API super sofisticado ... Estoy buscando lo básico.

Respuesta

7

Si necesita velocidad (probablemente siempre querrá velocidad con el procesamiento de imágenes) definitivamente debe trabajar con datos de píxeles sin formato. Java tiene algunas desventajas reales ya que no se puede acceder directamente a la memoria, lo que hace que el acceso a píxeles sea bastante lento en comparación con el acceso directo a la memoria. C++ es definitivamente el lenguaje de elección para el procesamiento de imágenes de uso de producción. Pero también puede, por ejemplo, usar C# ya que permite códigos inseguros en áreas específicas. (Eche un vistazo a la propiedad del puntero scan0 de la clase bitmapdata). He utilizado C# con éxito para aplicaciones de procesamiento de imágenes y definitivamente son mucho más rápidas que sus contrapartes de Java. No utilizaría ningún lenguaje de scripts o Java para tal fin.

0

¿Tienes alguna pregunta? Diría que C++, tiene mucha más flexibilidad en la manipulación de trozos de memoria bruta que Python o Java.

2

No solo C/C++ será más rápido, sino que la mayor parte del código de muestra de procesamiento de imágenes que encuentre también estará en C, por lo que será más fácil incorporar lo que encuentre.

1

(Esto podría no aplicar para el PO que sólo quería los fundamentos pelados -. Pero ahora que el tema de la velocidad se crió, necesito escribir esto, sólo para el registro)

Si realmente necesita velocidad, es mejor olvidarse de trabajar en el nivel de píxel por píxel, y más bien ver si las operaciones que necesita realizar podrían ser vectorized. Por ejemplo, para su código C/C++ puede usar el excelente Intel IPP library (no, no trabajo para Intel).

1

si estás buscando trabajar numéricamente en tus imágenes (matriz de pensamiento) y en Python echa un vistazo a http://www.scipy.org/PyLab - esta es básicamente la capacidad de hacer matlab en python, amigo mío jura por ella.

4

Está muy al este para manipular las grandes matrices multidimensionales o complejas de información de píxeles que son imágenes usando lenguajes de alto nivel como Python. Hay una biblioteca llamada PIL (the Python Imaging Library) que es bastante útil y te permitirá hacer filtros generales y transformaciones (cambiar el brillo, suavizar, desaturar, recortar, etc.) así como manipular los datos de píxel sin procesar.

Es la biblioteca de imágenes easiest and simplest que he usado hasta la fecha y se puede ampliar para hacer lo que sea que le interese (edge detection en muy poco código, por ejemplo).

1

Depende un poco de lo que intenta hacer.

Si la velocidad del tiempo de ejecución es su problema, entonces C++ es la mejor manera de hacerlo.

Si la velocidad de desarrollo es un problema, sugeriría mirar a java. Dijiste que querías manipulación de píxeles de bajo nivel, lo que Java hará por ti. Pero la otra cosa que podría ser un problema es el manejo de los diversos formatos de archivo. Java tiene algunas API muy buenas para tratar con la lectura y escritura de varios formatos de imagen para archivar (en particular, la biblioteca java2d).Eliges ignorar los niveles superiores de la API)

Si optas por la opción C++ (o Python se te ocurre pensar en ello), volvería a sugerirte el uso de una biblioteca para solucionar los problemas de inicio de la lectura y escribiendo archivos. Anteriormente tuve éxito con libgd

1

¿Qué idioma conoce usted mejor? Para mí, esta es la verdadera pregunta. Si va a pasar meses y meses aprendiendo un idioma en particular, no hay una ventaja real al usar Python o Java solo para su (probada) velocidad de desarrollo. Soy particularmente hábil en C++ y creo que para esta tarea en particular puedo ser tan rápido como un programador de Java, por ejemplo. Con la ayuda de una buena biblioteca (se me ocurre OpenCV), puedes crear todo lo que necesites en cuestión de un par de líneas de código C++, realmente.

1

Respuesta corta: C++ y OpenCV

1

yo estudiamos Inteligencia Artificial y Visión por computador, por lo tanto me conozco bastante bien el tipo de herramientas que se utilizan en este campo.

Básicamente: puede usar lo que quiera siempre que sepa cómo funciona detrás de la escena.

Ahora, dependiendo de lo que quiere lograr, se puede utilizar:

  • lenguaje C, pero perderá una gran cantidad de tiempo en los errores de control y gestión de memoria en la aplicación de los algoritmos. Teóricamente, este es el lenguaje más rápido para hacer ese tipo de trabajo, pero si sus algoritmos no son computacionalmente eficientes (en términos de complejidad) o si pierde demasiado tiempo en la comprobación de errores, esto claramente no vale la pena. Así que le aconsejo que primero implemente su aplicación en otro idioma, y ​​luego siempre podrá optimizar partes pequeñas de su código con enlaces de C.
  • Octave/MatLab: lenguaje muy eficiente, casi tanto como C, y puede hacer algoritmos muy elegantes y concisos. Si te interesan las operaciones de vectorización, matriz y lineal, debes ir con eso. Sin embargo, no podrá desarrollar una aplicación completa con este lenguaje, estará más enfocado en algoritmos, pero luego siempre podrá desarrollar una interfaz usando otro idioma más adelante.
  • Python: lenguaje todo en uno, elegante y accesible, utilizado en aplicaciones de gran escala como Google y Facebook. Puedes hacer casi todo lo que quieras con Python, cualquier tipo de aplicación. Se adaptará perfectamente si desea realizar una aplicación completa (con interacción del cliente y todo, no solo algoritmos), o si desea redactar rápidamente un prototipo utilizando librerías existentes, ya que Python tiene un gran conjunto de bibliotecas de alta calidad, como OpenCV. Sin embargo, si solo quiere hacer algoritmos, mejor debería usar Octave/MatLab.

La respuesta que se seleccionó como una solución es muy biaizada, y debe tener cuidado con este tipo de comentarios arcaicos.

Hoy en día, el hardware es más económico que el wetware (humanos) y, por lo tanto, debe usar lenguajes donde pueda generar resultados más rápidamente, incluso si cuesta unos pocos ciclos de CPU o espacio de memoria.

Además, mucha gente tiende a pensar que mientras implementes tu software en C/C++, estarás haciendo el Saint Graal de velocidad: esto simplemente no es cierto.Primero, porque la complejidad de los algoritmos importa mucho más que el lenguaje que está usando (un mal algoritmo nunca superará un algoritmo mejor, incluso si se implementa en el lenguaje más lento del universo) y segundo porque los lenguajes de alto nivel están haciendo mucho hoy de caché y optimización de velocidad para usted, y esto puede hacer que su programa se ejecute incluso más rápido que en C/C++.

Por supuesto, siempre puede hacer todo lo anterior en C/C++, pero ¿cuánto de su tiempo está dispuesto a perder para reinventar la rueda?

Cuestiones relacionadas