2009-06-22 10 views
10

He escrito un programa de procesamiento de imágenes en MATLAB que hace un uso intensivo de la Caja de Herramientas de Procesamiento de Imágenes de MATLAB, especialmente las operaciones morfológicas (abrir, imponer) así como también ajustar. Hacemos muchas operaciones de ajuste spline y medfilt2 y medfilt1 también mucho.¿Cómo convierto un programa de procesamiento de imágenes MATLAB a java?

Tenemos un cliente que quiere que convirtamos este programa a Java. Me gustaría escuchar una descripción detallada de una biblioteca de procesamiento de imágenes Java que puede duplicar la funcionalidad de MATLAB en el procesamiento de imágenes y splines, especialmente cómo la interfaz se compara con la de MATLAB.

He leído sobre la Biblioteca de procesamiento de imágenes avanzada de Java pero no he podido encontrar ninguna documentación detallada sobre ella en la web. Además, la poca documentación que he leído parece indicar que utiliza un modelo bastante complejo de imágenes, combinándolas en mosaicos y demás. Sería genial si hubiera una biblioteca Java que me permitiera continuar tratando las imágenes en escala de grises como arreglos en 2D o 3D.

Además, sería genial conocer cualquier problema general en la conversión entre MATLAB y Java.


Edición: nuestra aplicación actualmente segmenta las imágenes de un objeto relativamente simple. Se :

1. Starts with a 3D matrix of gray scale image slices representing a single area 
2. Does a medfilt1 to even out each slice. 
3. Does some imopen, imclose and imadjust operations on the image to remove some fuzziness, 
4. Does some simple thresholding in various areas to find boundary points 
5. Fits splines to the boundary points, 
6. Uses the 3rd dimension in various ways to further perfect the point matching, especially using medfilt2. 
7. Saves each slice with the boundary splines written in color on it. 

Debo señalar que estamos haciendo "spline apropiado" en lugar de coincidencia de spline - spline caber es un partido de mínimos cuadrados con un número fijo de nudos - juego spline coincide con los puntos exactamente con un arbitraria numero de nudos No me gustaría implementar la coincidencia de splines desde funciones spline más simplistas.

El creador de MATLAB JA es una opción, pero me gustaría saber también lo que está disponible en Java puro y saber qué tipo de sobrecarga implica el constructor JA.


Edición 2:

Tenga en cuenta que estamos haciendo columna vertebral ajuste - mediante ajuste de un punto dado de la spline como una manera de decidir si la elimina - ya que los datos es desordenado, tenemos un proceso de eliminación de puntos de varios pasos, por lo que las splines son una parte integral del algoritmo integral. Y así, ya que no puedo encontrar ninguna mención de splines en JAI en absoluto, así que si alguien sabe una biblioteca de Java que ofrece ajuste spline menos cuadrado, eso sería maravilloso.


Editar 2.5: Estamos utilizando una aproximación de mínimos cuadrados de un conjunto de puntos con estrías y con un número fijo de nudos (0-5 nudos). Si tenemos que volver a implementar eso, las cosas se pondrán difíciles, ya que en este momento estamos usando una biblioteca contribuida por MATLAB.

Y ciertamente no queremos volver a visitar el algoritmo. Ya fue bastante difícil obtener algo que funcionó ...

+0

Suena como búsqueda de bordes. ¿Necesita la salida de los puntos de spline o solo los límites de la imagen resaltados? – Clint

Respuesta

9

Hay varias trampas generales acerca de la conversión de código de Matlab para código Java. He convertido Matlab en código C++, por lo que mi consejo proviene de esas experiencias.

  1. Si está utilizando bucles en Matlab, en general, lo está haciendo mal. Adición de matrices (imágenes, etc.) es bastante simple:

    a = b + c;

    sin importar el tamaño de la imagen. El filtrado es también una llamada bastante sencillo:

    a = IMFilter ('mediana', b); o algo así, no estoy frente a mi máquina matlab en este momento. Existen

    llamadas a funciones similares en el JAI (Java Advanced Imaging), por lo que ver si usted puede encontrarlos. No conozco los detalles de los requisitos de filtrado mediano (supongo que medfilt1 debe ser un kernel de filtrado mediano local de 3x3, en lugar de un kernel de filtrado 1D ejecutado en los datos, porque eso significaría que está filtrando solo en uno dirección), así que mira lo que hay en the documentation. Pero, si escribes el tuyo, la adición anterior puede ser tan simple como un bucle forzado doblemente anidado, o una clase complicada que implementa algo como

    MyMatrix a = MyMatrix.Add (b, c);

    Mi punto es, la simplicidad de Matlab puede ocultar todas las decisiones de diseño que necesita para tomar con el fin de hacer de este un programa Java eficiente.

  2. Recuerde, cuando lo haga para los bucles, matlab y java tienen un orden inverso de fila/columna. Matlab es column-major y java es row-major. Tendrá que volver a escribir sus bucles para tener en cuenta ese cambio, de lo contrario, su código será más lento de lo que debería ser.

  3. Personalmente, tendería a evitar el JAI a excepción de operaciones específicas que necesito haber realizado. Por ejemplo, solo úselo para las operaciones de filtrado mediano y demás. Considero que usarlo es una optimización, pero eso es solo porque soy Old School y tiendo a escribir primero mis propias operaciones de procesamiento de imágenes. Si toma ese enfoque, puede escribir su código para que sea exactamente lo que quiere, y luego puede agregar las llamadas JAI y asegurarse de que el resultado coincida con lo que su código ya hace. El problema con el uso de bibliotecas avanzadas como JAI o Intel IPP en C++ es que hay muchos errores específicos de la biblioteca (como el mosaico, o si cada fila se asigna como un mapa de bits con algunos píxeles adicionales al final, u otros detalles similares), y no desea tratar con esos problemas mientras que al mismo tiempo mueve su código. JAI es rápido, pero no es una bala mágica; si no sabes cómo usarlo, es mejor asegurarte de que tienes algo antes de que tengas algo rápido.

  4. Si puedo leer entre líneas un poco, parece que está haciendo algún tipo de segmentación en los datos de imágenes médicas. No sé qué son las bibliotecas de Java para leer en las imágenes de DICOM, pero gdcm funciona bien para C++ y C#, y también tiene envoltorios de Java. Matlab oscurece la facilidad de manejo de la imagen, especialmente el manejo de imágenes DICOM, por lo que puede tener que aprender alguna biblioteca DICOM para manejar las manipulaciones del archivo de imagen. Aprendí una pequeña fracción del estándar DICOM a lo largo de los años; el specification es extremadamente completo, tal vez demasiado, pero puede averiguar cómo hacer lo que debe hacer con un detalle insoportable. Si está intentando hacer segmentaciones de datos médicos, guardar la spline en los datos no es lo correcto para que sus imágenes funcionen con otros lectores DICOM. Eche un vistazo a la forma en que se especifican los contornos.

Editar en respuesta a más información:

Spline montaje es probablemente el mejor hecho a partir de un enfoque numérico en lugar de un enfoque de biblioteca. Puede haber una manera de hacer esto en JAI, pero no estoy lo suficientemente familiarizado con el idioma.

En su lugar, echaría un vistazo a las recetas numéricas, específicamente Chapter 3, para el código de ajuste de spline. El código se basa en uno, no en cero, por lo que requiere alguna traducción, pero es completamente factible.

Si está tratando de eliminar los puntos de ruido de un límite, también puede intentar borrar los bordes de los que origina originalmente sus puntos. Sin conocer el ajuste de spline que está tratando de hacer (hay muchas variaciones), sería difícil recomendar un equivalente exacto en otro idioma.

Editar 2.5: Si por ajuste spline de una biblioteca contribuida, ¿te refieres a algo como this code? Si lo peor llega a ser peor, al menos tendrías el código fuente. Si terminas teniendo que hacer algo como esto, otro consejo muy útil es que Matlab es todo doble, nada más a menos que lo fuerces (y aun así, muchas operaciones no funcionan en las que no son dobles). Por lo tanto, también necesitará hacer su código en dobles, para mantener un acuerdo razonable. También haría varias pruebas. Si terminas reescribiendo ese código (o algo así), tener un grupo de entradas conocidas y salidas esperadas (dentro de un margen razonable de error, donde tienes que definir qué significa "razonable") será crítico para asegurarte de que la rueda que está copiando (no reinventando realmente) tiene las mismas rotaciones por distancia que el original. Probablemente haya demasiadas expresiones paratéticas en esa última oración.

Sin embargo, otra edición: Si todo lo anterior es demasiado dolor de cabeza, entonces considere el constructor de JA ya señalado. De lo contrario, el enfoque que he delineado, o algo similar, será probablemente el lugar donde termines.

+0

Gracias, vea mis comentarios arriba ... –

0

Creo que Raster.getPixels y WritableRaster.setPixels permiten el tipo de modificación de datos de píxeles de la que está hablando.

No voy a pretender que este puerto será simple, sin embargo.

+0

¿Pero qué no sería simple al respecto? –

+0

Alguien debe haber votado esta respuesta. Por qué, es completamente útil –

2

Sin abordar explícitamente la pregunta de Matlab debe mirar ImageJ.Esta es una aplicación Java de código abierto con muchos complementos aportados para el análisis y la manipulación de imágenes. La mediana del filtrado está integrada.

El mayor problema que he tenido al convertir Matlab a Java es que escribirás muchos bucles para manejar funciones que son una línea en Matlab.

Si usted puede describir sus operaciones spline en más detalle lo más probable es que se puede obtener información sobre las operaciones que ImageJ que necesita.

Ejemplo de montaje en java spline: http://www.mste.uiuc.edu/exner/java.f/leastsquares/

+0

Quizás un enlace al lugar donde está la operación mophological en esta biblioteca. Desde el enlace de entrada, no puedo decir si es una biblioteca o una aplicación –

+0

Es una aplicación. No es una mala idea escribir el núcleo de tu aplicación como un complemento para ImageJ, y luego escribir todas las porciones de manejo de imágenes de tu código después de que hayas hecho funcionar el núcleo como debería. – mmr

0

En general, las operaciones de procesamiento de imágenes son mucho tiempo, lo que a menudo se implementan en C o C++ en aras de la velocidad, por lo que no es sorprendente que usted está teniendo problemas para encontrar el código Java para lo que necesita. Puede terminar teniendo que tirar el suyo por al menos algunos de ellos. Las operaciones que ha mencionado, como la morfología o los filtros de la mediana, están bien documentados y son bastante simples de implementar, especialmente cuando tiene las funciones de matlab para observar y contra las que evaluar.

+0

En realidad pixastic es una java JavaScript no una biblioteca – jitter

+0

Oops ... Dije que era una _quick_ búsqueda de google. – Dima

4

Cómo sobre el uso del MATLAB Builder JA proporcionada por el propio MathWorks, que es el creador de sí mismo MATLAB.?

+0

La única desventaja de esto es que requiere el tiempo de ejecución de Matlab, que es libremente distribuible pero bastante grande (130 mb) –

+0

@jitter, ¿cuánto cuesta el JA de MATLAB Builder? ¿Conoces otras envolturas de Matlab a Java que son gratuitas? ¡Gracias! – Gevorg

1

Simplemente no lo hagas this way. Iba a recomendar que descubrieras qué Weka usa para implementar operaciones de matriz (nunca lo he usado), pero supongo que podría no usar otra biblioteca para esto. Incluso si lo hizo, puede no ser similar a matlab, ni imágenes de apoyo.

1

Puede compilar una secuencia de comandos MATLAB para que se ejecute de forma independiente. Esto no funciona en todos los casos, pero si lo hace, puede dejar su rápido código MATLAB solo e intentar llamar al procesador de imagen desde Java.

http://www.mathworks.com/products/compiler/

3

Cuando convertí el código de MATLAB al código de Java, en el pasado encontré las bibliotecas CERN COLT muy útiles. No harán el procesamiento de tu imagen, pero me han ahorrado mucho tiempo al convertir el código matemático de matriz de conversión muy rápido.

Cuestiones relacionadas