Pregunta

Me gustaría trabajar un poco con los pequeños detalles de las imágenes de computadora. Estoy buscando una manera de leer píxeles de datos individuales, analizarlos programáticamente y cambiarlos. ¿Cuál es el mejor lenguaje para usar (Python, c ++, Java ...)? ¿Cuál es el mejor formato de archivo?

No quiero ningún software / API súper elegante ... Estoy buscando lo básico.

¿Fue útil?

Solución

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

Otros consejos

Es muy fácil manipular las grandes matrices multidimensionales o complejas de información de píxeles que son imágenes que utilizan lenguajes de alto nivel como Python . Hay una biblioteca llamada PIL (la Biblioteca de imágenes de Python ) que es bastante útil y te permitirá haga filtros y transformaciones generales (cambie el brillo, suavice, desaturar, recorte, etc.), así como manipule los datos de píxeles sin procesar.

Es la la biblioteca de imágenes más fácil y sencilla que he utilizado hasta la fecha y puede extenderse para hacer lo que sea que le interese ( detección de bordes en muy poco código, por ejemplo).

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 allí también estará en C, por lo que será más fácil incorporar las cosas que encuentre.

si está buscando trabajo numérico en sus imágenes (matriz de ideas) y en Python, consulte http: / /www.scipy.org/PyLab : esta es básicamente la capacidad de hacer matlab en python, un amigo mío confía en él.

(Esto podría no aplicar para el OP que solo quería lo básico, pero ahora que el problema de la velocidad se planteó, necesito escribir esto, solo para el registro).

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

Depende un poco de lo que estés tratando de 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, sin embargo, sugeriría mirar a Java. Dijiste que querías una 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 agradables para manejar la lectura y escritura de varios formatos de imagen en el archivo (en particular la biblioteca java2d. Usted elige ignorar los niveles más altos de la API)

Si optas por la opción c ++ (o Python lo piensa), te sugeriría nuevamente el uso de una biblioteca para ayudarte a superar los problemas de inicio de lectura y escritura de archivos. Anteriormente he tenido éxito con libgd

¿Qué idioma sabes mejor? Para mí, esta es la verdadera pregunta. Si va a pasar meses y meses aprendiendo un idioma en particular, entonces no hay una ventaja real en el uso de Python o Java solo por su (comprobada) velocidad de desarrollo. Soy particularmente competente 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 (OpenCV me viene a la mente), puedes crear cualquier cosa que necesites en cuestión de un par de líneas de código C ++, realmente.

Respuesta corta: C ++ y OpenCV

Estudié Inteligencia Artificial y Visión por Computadora, por lo que conozco bastante bien el tipo de herramientas que se utilizan en este campo.

Básicamente: puedes usar lo que quieras siempre que sepas cómo funciona detrás de escena.

Ahora, dependiendo de lo que quieras lograr, puedes usar:

  • lenguaje C, pero perderá mucho tiempo en la verificación de errores y en la administración de la memoria cuando implemente sus algoritmos. Entonces, 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 mucho tiempo en la verificación de errores, claramente no vale la pena. Por lo tanto, le aconsejo que primero implemente su aplicación en otro idioma, y ??luego, siempre puede optimizar pequeñas partes de su código con enlaces en C.
  • Octave / MatLab: lenguaje muy eficiente, casi tanto como C, y puedes hacer algoritmos muy elegantes y concisos. Si estás en vectorización, matriz y operaciones lineales, debes ir con eso. Sin embargo, no podrá desarrollar una aplicación completa con este lenguaje, se centrará más en los algoritmos, pero siempre podrá desarrollar una interfaz utilizando otro idioma más adelante.
  • Python: lenguaje todo en uno, elegante y accesible, utilizado en aplicaciones gigantescas a gran escala como Google y Facebook. Puedes hacer prácticamente todo lo que quieras con Python, cualquier tipo de aplicación. Estará perfectamente adaptado si desea crear una aplicación completa (con interacción del cliente y todos, no solo algoritmos), o si desea redactar rápidamente un prototipo utilizando bibliotecas existentes, ya que Python tiene un conjunto muy grande de bibliotecas de alta calidad, como OpenCV . Sin embargo, si solo desea crear algoritmos, debería utilizar mejor Octave / MatLab.

La respuesta que se seleccionó como solución está muy desarrollada, y debes tener cuidado con este tipo de comentario arcaico.

Hoy en día, el hardware es más barato que wetware (humanos) y, por lo tanto, debe usar idiomas en los que podrá producir resultados más rápido, incluso si cuesta unos pocos ciclos de CPU o espacio de memoria.

Además, muchas personas tienden a pensar que mientras implementes tu software en C / C ++, estás haciendo que el Santo Gral de la velocidad: esto simplemente no es cierto. Primero, porque la complejidad de los algoritmos importa mucho más que el lenguaje que está utilizando (un algoritmo malo nunca superará a un algoritmo mejor, incluso si se implementa en el lenguaje más lento del universo), y en segundo lugar, los lenguajes de alto nivel actualmente están haciendo mucho de caché y optimización de la velocidad para usted, y esto puede hacer que su programa se ejecute incluso más rápido que en C / C ++.

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

¿Respuesta corta? Yo diría que C ++, tiene mucha más flexibilidad para manipular trozos de memoria en bruto que Python o Java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top