image - funciona - img seo tags
Reconocimiento de imagen (10)
Me gustaría hacer algo de trabajo con los detalles de las imágenes 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?
No quiero ningún software / API super sofisticado ... Estoy buscando lo básico.
¿Qué idioma conoces mejor? Para mí, esta es la verdadera pregunta. Si vas a pasar meses y meses aprendiendo un idioma en particular, entonces no hay una ventaja real al usar Python o Java solo para su (probada) 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 (se me ocurre OpenCV), puedes crear todo lo que necesites en cuestión de un par de líneas de código C ++, realmente.
¿Respuesta corta? Diría que C ++, tiene mucha más flexibilidad en la manipulación de trozos de memoria bruta que Python o Java.
(Esto podría no aplicarse para el OP que solo quería lo básico, pero ahora que se planteó el problema de la velocidad, 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 más bien ver si las operaciones que necesita realizar podrían estar vectorizadas . Por ejemplo, para su código C / C ++ podría usar la excelente biblioteca Intel IPP (no, no trabajo para Intel).
C / C ++ no solo será más rápido, sino que la mayor parte del código de muestra de procesamiento de imágenes que encuentres también estará en C, por lo que será más fácil incorporar lo que encuentres.
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, 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 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 piensas), volvería a sugerirte el uso de una biblioteca para informarte sobre los problemas de inicio de lectura y escritura de archivos. Anteriormente tuve éxito con libgd
Es 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 (la biblioteca de imágenes de Python ) que es bastante útil y te permitirá hacer filtros generales y transformaciones (cambiar el brillo, suavizar, desaturar, recortar, etc.) así como manipular los datos en bruto de píxeles.
Es la biblioteca de imágenes más fácil y simple que he usado hasta la fecha y puede ampliarse para hacer lo que le interesa ( detección de bordes en muy poco código, por ejemplo).
Estudié Inteligencia Artificial y Visión por Computadora, así conozco bastante bien el tipo de herramientas que se usan en este campo.
Básicamente: puedes usar lo que quieras siempre que sepas cómo funciona detrás de la escena.
Ahora, dependiendo de lo que quiera lograr, puede usar:
- C, pero perderá mucho tiempo en la comprobación de errores y en la administración de la memoria al implementar sus 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 puedes 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 bibliotecas 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 solución es muy parcial, 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 en los que 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 puedes hacer todo lo anterior en C / C ++, pero ¿cuánto de tu tiempo estás dispuesto a perder para reinventar la rueda?
Respuesta corta: C ++ y OpenCV
Si necesita velocidad (probablemente siempre querrá velocidad con el procesamiento de imágenes), definitivamente debe trabajar con datos de píxeles en bruto. 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.
si estás buscando trabajo numérico 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, mi amigo jura por eso.