Pregunta

Estoy mirando a través de un conjunto de datos de imágenes en ImageJ (una pila de imágenes tif, cerca de 130 cuadros), y tengo un problema con el conjunto de datos. Es una serie de imágenes de microscopio, con cada trama de ser un plano alrededor de 3-4 micrómetros por encima / debajo de la anterior. A medida que vaya más profundamente en el conjunto de datos, dispersión de la luz hace que para un fondo brillante, por lo que las principales características de la muestra son más débiles.

Sin embargo, la característica de brillo y contraste de ImageJ utiliza un histograma que representa el toda pila de imágenes. Cuando hago clic en "Auto" y "RESET" en una imagen profunda de la pila, el contraste resultante es perfecta: todas las características iluminan muy bien. Sin embargo, a continuación, volver al principio de la pila, la mayoría de las funciones se han saturado.

He intentado extraer manualmente un par de imágenes de varios puntos de la pila y la realización de Auto> Restablecer en brillo y contraste en cada uno de ellos individualmente y volver a convertir a una pila después, y se ve muy sólido. ¿Cómo puedo hacer esto mediante programación (por ejemplo, con un plug-in) para toda la pila? ¿Cuáles son las llamadas a la API pertinentes?

¿Fue útil?

Solución

Una buena manera de empezar a escribir una secuencia de comandos es utilizar la grabadora de macros de ImageJ - puede empezar esto con Plugins > Macros > Record .... Para este ejemplo, estoy suponiendo que haya cambiado la caja de la opción Record: a JavaScript, pero si usted está más familiarizado con el lenguaje de macros ImageJ o escribir plugins en uno de Java de los demás podría ser una mejor opción. Si abre su imagen y el uso Image > Stacks > Set Slice ... y seleccionar (por ejemplo) rebanada 20, debería ver:

imp.setSlice(20);

... aparece en la grabadora. Ahora bien, si se ejecuta Image > Adjust > Brightness/Contrast... y seleccione Auto, debería ver en la grabadora que ese es el equivalente a correr mantenimiento Enhance Contrast 0,35% de píxeles saturados. El problema con esto, como usted ha señalado, es que esta se ajustan los valores mínimos y máximos para toda la pila en lugar de que esa rebanada. Sin embargo, puede ejecutar Enhance Contrast con diferentes opciones mediante la ejecución de Process > Enhance Contrast. La sección sobre esa opción en la href="http://imagejdocu.tudor.lu/doku.php?id=gui%3aprocess%3aenhance_contrast" rel="nofollow"> ImageJ documentación wiki explica que si desea cambiar los valores de los píxeles en lugar de establecer el mínimo y máximo de la pila, es necesario seleccionar la opción "Normalizar". Si decido hacerlo en su lugar, las grabaciones de los registradores de macro:

imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");

... y usted debería ver que sólo 20 rebanada ha sido alterado. A continuación, puede envolver que en un bucle que se ejecuta la misma mejora en cada rebanada con:

var imp = IJ.getImage();
var n = imp.getStackSize();

for( var i = 0; i < n; ++i) {
    imp.setSlice(i+1);
    IJ.run(imp, "Enhance Contrast", "saturated=4 normalize");
}

(Si está utilizando Fiji, a continuación, el Editor de secuencias de comandos (por ejemplo a través de File > New > Script) es una manera fácil de experimentar con este tipo de scripts.)

Por supuesto, el uso de la opción de normalizar da lugar a los valores de los píxeles de ser alterada, lo que significa en este caso que está perdiendo información, por lo que no usaría la pila resultante para obtener resultados cuantitativos.

Espero que sea de alguna utilidad.

Otros consejos

También podría considerar el uso de CellProfiler para procesar las imágenes. Incluso si CP no puede hacer exactamente lo que estamos tratando de hacer directamente, en realidad se puede ejecutar comandos ImageJ, plugins y macros de CP.

En el más simple, se podría crear una tubería CP que sólo tiene LoadImages y RunImageJ.

La respuesta aceptada es la mejor para la pregunta del PO, pero una pequeña variante es que si quieres cambiar el brillo / contraste en función de las rebanadas de sus datos específicos.

En mi caso yo quería tener un efecto umbral, pero el valor umbral estaba cambiando en cada rebanada de la pila. Fui a unas rodajas diferentes y encontré manualmente el valor de umbral. entonces encontré una función aproximada para el valor de umbral (Tv) como una función de la rebanada (s) como sigue:

Tv=4000/s-17

Por lo tanto, a continuación, se convierte en mi script:

importClass(Packages.ij.IJ);

var imp = IJ.getImage();
var n = imp.getStackSize();
var miny,maxy;

for( var i = 1; i < n+1; ++i) {
    imp.setSlice(i);
    miny=parseInt(4000/i-17);
    maxy=miny+5;
    IJ.setMinAndMax(imp, miny, maxy);
    IJ.run(imp, "Apply LUT", "slice");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top