Project management of NTIS P1 Cybernetic Systems and Department of Cybernetics | WiKKY

Project

General

Profile

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.

http://doube.org/plugins.html

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

CFromJava

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