ImageJ¶
ImageJ je multiplatformní prohlížeč obrázku. Je napsaný v Javě. Umožňuje snadnou rozšiřitelnost pomocí pluginů.
Používání knihoven ImageJ bez prohlížeče¶
Knihovny ImageJ lze používat samostatně bez spouštění prohlížeče.
import ij.*; import ij.process.*; class QueetechImageJ { public static void main(String args[]){ // načítání obrázku // ImagePlus slouží k reprezentaci obrázku v paměti ImagePlus imp1 = IJ.openImage("http://rsb.info.nih.gov/ij/images/boats.gif"); // vykreslení imp1.show(); // ImageProcessor umožňuje provádět nad obrázkem reprezentovaným ImagePlus // řadu operací - načítání pixelů, kopírování částí obrázku, atd. ImageProcessor ip = imp1.getProcessor(); // ukázka zjištění maximálního jasu v obrázku double maximum =ip.getMax(); System.out.println("Maximální jas v obrázku je " + maximum); // zjištění hodnoty pixelu na souřadnicích (10,50) double pixel = ip.getPixel(20,50); System.out.println("Hodnota pixelu 20,50) je " + pixel); // nastavení pixelu na hodnotu 77) ip.putPixel(20,50,77); // ukázka prahování ip.autoThreshold(); // po operaci v ImageProcessoru je nutný update ImagePlus imp1.updateAndDraw(); } }
Překlad se provádí pomocí javac
. Je důležité správně nastavit všechny cesty. Java rozeznává tři druhy cest. Jedna je ke spustitelným souborům, druhá k třídám javy (.class, .jar) a třetí je ke knihovnám (.dll, .lib, .a ,...). V operačním systému Windows tyto cesty splývají, v Linuxu nikoliv. Tam například java nenalezne ani .class soubory, které jsou ve adresáři z něhož je program spouštěn.
Pro překlad našeho programu je podstatné nastavení cest k .class a .jar souborům. To upravuje parametr -cp
překladače. Cest může být více, jsou odděleny znakem ':'
.
javac -cp /usr/share/java/ij.jar QueetechImageJ.java
Spuštění je pomocí příkazu java
. Je opět nutno zadat cesty k třídám. Tentokráte se používají i námi vytvořené .class soubory. Je tedy potřeba zadat do aktuálního adresáře - to jest znak tečky '.'
.
java -cp /usr/share/java/ij.jar:. QueetechImageJ
Dokumentace všech tříd ImageJ naleznete na následující adrese
http://rsbweb.nih.gov/ij/developer/api/index.html
Tvorba Pluginu¶
V ImageJ lze vytvářet pluginy a makra. Makra jsou tvořena posloupností existujících již funkcí. Pluginy mohou přidávat novou funkcionalitu. Existují tři druhy pluginu. * Plugin * Plugin Filter * Plugin Frame
Plugin lze použít pro rozšíření GUI, Plugin Filter navíc dostává data obrázku. Plugin Frame slouží pro plugin se samostatným oknem.
Název třídy pluginu musí končit řetězcem _Plugin
, jinak jej ImageJ nenalezne.
Pluginy lze vytvářet přímo v prostředí ImageJ, ale v Ubuntu mi z nějakého duvodu nefunguje návaznost na Javu. Lze je tedy vytvářet v jakémkoliv textovém editoru a pak ručně přeložit. Soubory se zdrojovým kódem pluginu jsou v adresáři ~/.imagej/plugins/
, kde jsou i přeložené class soubory. Při překladu je nutno zadat cestu třídám ImageJ. Ty jsou v /usr/share/java/ij.jar
. Překlad lze tedy realizovat například následujícím zpusobem.
javac -cp /usr/share/java/ij.jar ./Filter_Plugin.java
// Filter_Plugin.java import ij.*; import ij.process.*; import ij.gui.*; import java.awt.*; import ij.plugin.filter.*; public class Filter_Plugin implements PlugInFilter { // název třídy musí končit "_Plugin" ImagePlus imp; public int setup(String arg, ImagePlus imp) { this.imp = imp; return DOES_ALL; } public void run(ImageProcessor ip) { ip.invert(); imp.updateAndDraw(); IJ.wait(500); ip.invert(); imp.updateAndDraw(); } }
Návod na psaní pluginu
http://www.imagingbook.com/fileadmin/goodies/ijtutorial/tutorial171.pdf
Existují i plugny pro zpracování 3D obrazu z CT (Moments 3D). Zatím jsem je neprozkoumal.
Plugin s voláním funkcí C¶
Je nutné pro každou funkci v C implementovat v wrapper, jehož většina je v C a část v Javě.
Volání funkcí C z Javy¶
Používá se JNI
Spouštění pluginu s knihovnami v C volanými pomocí JNI¶
Je potřeba zajistit správné nastavení proměnné java.library.path
. Normálně lze nastavit
systémovou proměnnou LD_LIBRARY_PATH
, která se při spuštění převede na java.library.path
.
V Ubuntu je bohužel ve spouštěči chyba. Pro nápravu je nutno editovat řádek (cca 411) v souboru /usr/bin/imagej
.
jni=-Djava.library.path=$(cat /usr/share/imagej/jni/* | tr '\n' ':')
nahradit následujícím kódem
jni=-Djava.library.path=/usr/share/imagej/jni:~/.imagej/jni:user.home/.imagej/jni