Question

Je suis à la recherche par le biais d'un ensemble de jeux de données d'images dans ImageJ (une pile de .tif images, environ 130 images), et j'ai un problème avec l'ensemble de données. Il est une série d'images de microscope, chaque trame étant un plan environ 3-4 micromètres au-dessus / au-dessous de la précédente. Comme j'aller plus loin dans l'ensemble de données, diffusion de la lumière fait un fond plus lumineux, de sorte que les principales caractéristiques de l'échantillon sont gradateur.

Cependant, la luminosité de ImageJ et la fonction contraste utilise un histogramme qui représente la ensemble pile d'images. Lorsque je clique sur « Auto » et « Reset » sur une image profonde de la pile, le contraste résultant est parfait: toutes les fonctionnalités éclairent vraiment bien. Cependant, puis, de retour au début de la pile, la plupart des fonctions sont devenues saturées.

J'ai essayé extraire manuellement quelques images de divers points dans la pile et l'exécution Auto-> Remise à zéro luminosité et du contraste sur chacun individuellement et les re-conversion à une pile après, et il semble vraiment solide. Comment puis-je faire cela par programme (par exemple avec un plug-in) pour l'ensemble de la pile? Quels sont les appels API pertinents?

Était-ce utile?

La solution

Une bonne façon de commencer à écrire un tel script est d'utiliser l'enregistreur de macros de ImageJ - vous pouvez commencer avec cette Plugins > Macros > Record .... Pour cet exemple, je suppose que vous avez changé la case d'option Record: à JavaScript, mais si vous êtes plus familier avec le langage de macros ImageJ ou plugins en langage Java l'un des autres peut-être un meilleur choix. Si vous ouvrez ensuite votre Image > Stacks > Set Slice ... d'image et de l'utilisation et sélectionnez (disons) tranche 20, vous devriez voir:

imp.setSlice(20);

... apparaissent dans l'enregistreur. Maintenant, si vous exécutez Image > Adjust > Brightness/Contrast... et sélectionnez Auto, vous devriez voir dans l'enregistreur que ce soit l'équivalent de courir la tenue de Enhance Contrast 0,35% de pixels saturés. Le problème avec cela, comme vous l'avez dit, est que ce paramètre ajuste les valeurs minimales et maximales pour l'ensemble de la pile plutôt que juste que cette tranche. Cependant, vous pouvez exécuter Enhance Contrast avec différentes options en exécutant Process > Enhance Contrast. La section sur cette option sur le ImageJ wiki de documentation explique que si vous voulez changer les valeurs de pixels plutôt que de fixer le minimum et le maximum de la pile, vous devez sélectionner l'option « Normaliser ». Si je choisis de le faire à la place, les enregistrements de l'enregistreur macro:

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

... et vous devriez voir cette tranche seulement 20 a été modifié. Vous pouvez ensuite conclure que dans une boucle qui fonctionne de la même amélioration sur chaque tranche avec:

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 vous utilisez Fidji, puis l'éditeur de script (par exemple via File > New > Script) est un moyen facile d'expérimenter avec ces scripts.)

Bien sûr, en utilisant l'option Normaliser ne se traduit dans les valeurs de pixels étant modifié, ce qui signifie dans ce cas que vous perdez des informations, donc je ne voudrais pas utiliser la pile résultante pour obtenir des résultats quantitatifs.

J'espère que ce d'une certaine utilité.

Autres conseils

Vous pourriez également envisager d'utiliser CellProfiler pour traiter les images. Même si le CP ne peut pas faire exactement ce que vous essayez de faire directement, vous pouvez réellement exécuter des commandes ImageJ, plugins et macros du CP.

Au plus simple, vous pouvez créer un pipeline de CP qui a juste loadImages et RunImageJ.

La réponse acceptée est le meilleur pour la question de l'OP, mais une petite variante est si vous voulez changer la luminosité / contraste en fonction des tranches de vos données spécifiques.

Dans mon cas, je voulais avoir un effet de seuil, mais la valeur de seuil changeait dans chaque tranche de la pile. Je suis allé à quelques différentes tranches et trouvé manuellement la valeur de seuil. Je trouve alors une fonction d'approximation de valeur de seuil (TV) en fonction de la tranche (s) comme suit:

Tv=4000/s-17

Par conséquent, alors mon script devient:

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");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top