IMAGEJ KÉPFELDOLGOZÁS JAVA-BAN Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem
ImageJ • Főbb jellemzők • Nyílt forráskódú, multiplatform, ingyenes 1997 óta • Java nyelven • Számos képformátum ismerete olvasásra és írásra • Fotók: JPEG, PNG, GIF (animált is) • Orvosi: DICOM
• 2D és 3D képek • Utóbbi esetében képszeletek sorozataként („stack”)
• Számos képfeldolgozó művelet • Szkript és beépülő modul • Számos további művelet letölthető
ImageJ • Elérhetőség • http://imagej.nih.gov/ij/ • http://imagej.net/Welcome • Dokumentáció (angolul) • http://imagej.nih.gov/ij/docs/index.html • Felhasználói útmutató (angolul) • http://rsbweb.nih.gov/ij/docs/guide/146.html
ImageJ verziók • ImageJ1 • Eredeti verzió, jelenleg is aktív fejlesztés alatt • ImageJ2 • Újratervezett, hatékonyabb szoftver csomagok + kompatibilitási réteg + Image J1 • Fiji • Fiji Is Just ImageJ • ImageJ2 platformra épül
• Külső féltől származó beépülő modulok
szisztematikus elérhetőségével és csoportosításával • Elsősorban élettudományokhoz (mikroszkópia, …)
Felhasználói felület
Felhasználói felület • Kis méretű főablak • Menü + ikon eszköztár + üzenetsor • További ablakok • Önálló ablakként jelennek meg • Sok kép esetén nehézkessé válhat a használata • Mindig van egy aktuális kép ablak • Amit legutoljára aktiváltunk
• Ezen hajtódnak végre a szűrők (egy képes műveletek)
Fájl menü • New (Új) • Kép, képsorozat, szöveges ablak, vágólap tartalma • Open, Open next, Open Samples, Open Recent • Képek megnyitása fájlból, URI alapján • Import • Adatok beolvasása fájlból: strukturált, nyers bináris adatok, animált GIF-ek, …
• Close, Close All • Ablakok bezárása • Save, Save As • Kép mentése • Revert • Fájl eredeti tartalmának visszaállítása
Kijelölések (szelekciók, ROI-k) • Képek részeinek kijelölése • Pont koordináták • Síkidomok, spline görbék által határolt területek • Vonal, téglalap, kör, ellipszis, sokszög, szabadkézi, bináris körvonal…
• ROI = Region of Interest (érdekes terület a művelet szempontjából)
• Használat • Funkció kijelölése az eszközsoron • Koordináták kattintása a kép ablakban • Egyszerre 1 kijelölés lehet csak érvényes!
• Illesztések kijelölésekre • Kör, ellipszis, spline • Geometria • Konvex burok • Inverzió • Skálázás, forgatás, nagyítás • Kiegyenesítés • Szelekció (ROI) menedzser • Kiválasztások listája • Névvel ellátott, újra előhívható • Elmenthető
ROI + ROI menedzser
Beállítások • Edit / Options
Rajzolószínek • Edit / Options / Colors… • Előtér színe (Foreground) • Rajzolás
• Háttér színe (Background) • Törlés
• Kiválasztás színe (Selection) • Kiválasztott részek körvonala hogyan jelenjen meg
• Csak 9 féle szín közül választhatunk!
Edit menü • Undo • Csak az utolsó művelet eredményét tudja visszavonni! • Összetett műveletek esetén azt sem… • Cut, Copy, Paste, … • Vágólap műveletek kijelölt részeken • Clear, Clear Outside • Kijelölt terület vagy annak komplementerének törlése = Háttérszínnel kitöltés
• Fill, Draw, Invert • Kijelölés területének kitöltése rajzolószínnel • Kijelölés határának megrajzolása rajzolószínnel és vonalstílussal • Kép invertálása kijelölésen belül
Image menü • Type (Típus) • Képpontok típusa • 8 bites egész, 16 bites egész, 32 bites lebegőpontos (float) • 8 bites színes (indexelt), RGB színek
• Show Info, Properties • Információk a képről • Crop • Új kép létrehozása a kiválasztás alapján • Duplicate • Másolat a képről új ablakban
• Rename • Ablak átnevezése (eredetileg a képfájl neve) • Fontos, hogy egyedi legyen!
Image menü • Scale, Transform • Méretváltás, tükrözés, forgatás, eltolás • Zoom • Nagyítás szintje az ablakban • Overlay (rávetítés) • Képen elhelyezett objektumok • Kiválasztások, képek, …
• Ki-be kapcsolhatók • Több is hozzáadható egy képhez • Törölhetők, listázhatók • Beírhatók a képmátrixba („Flatten”)
• Lookup Tables • Skalár intenzitásértékek leképzése színekre
Overlay példa
Image / Adjust menü • Fényerő és kontraszt • Elsősorban fotókhoz • Ablak és szint • Szürke képek esetén
intenzitástartomány kiválasztása (orvosi képeknél fontos) • Színegyensúly • Fotókhoz
• Küszöbölés • Szürke és színes • Lokális küszöbölés • Plugin telepítés után
Image / Color menü • Színcsatornák
szétválasztása • Külön R, G, B szürke képekre
• Színcsatornák
összeolvasztása • Csatornánként külön képekből
új RGB kép
• LUT = Lookup Table • Színtábla műveletek
Csatornák összevonása
Csatornák összevonása
Színcsatorna „stack”
Image / Type / RGB Color után
Process menü • Képfeldolgozó alapműveletek • Simítás, élesítés, élkeresés, maximum keresés • Kontrasztjavítás • Zajgenerálás • Árnyékhatások • Műveletek bináris képeken • Aritmetikai műveletek képeken • Fourier transzformáció • Szűrők • Konvolúció, átlagszűrő, mediánszűrő
• Képek közötti aritmetika • Háttérlevonás
• A műveletek a kijelölésen belül hajtódnak végre!
Analyze menü • Képelemzés • Analyze Particles • Küszöbölt képen komponens detekció • Méret alapján leválogatás
• Körvonalkép készítés
• Histogram • Kép hisztogramja
• Plot Profile • Kiválasztási vonal mentén rajzol intenzitásprofilt
Képmanipulációk • Lehetőségek • Nagyítás, mozgatás • Pipetta • Szöveg • Ceruza, ecset, festékes vödör, festékszóró • Radír • Nyíl • Montázs
További opciók!
Példa műveletsor • Betöltés • Astra016.JPG • Szürke konverzió • Image / Type / 8-bit • Küszöbölés • Image / Adjust / Threshold • 0-32 közötti szürke értékek • Dilatáció • Process / Binary / Dilate • Komponens analízis • Analyze / Analyze Particles
Példa műveletsor
Példa műveletsor eredménye
Macro Recorder • Lépéssorozat „felvétele” • Plugins / Macros / Record… • Menthető önálló néven • .ijm kiterjesztés javasolt • Szerkesztőablakban megnyitható • CTRL + R: futtatás
Feladatok • Javítsuk a rendszámtábla betűinek szegmentálását! • Globális küszöbölés helyett használjunk adaptívat! • Próbáljuk ki a műveletet más képekre is! • Mindig jó a globális küszöbtartomány? • Állítsunk az „Analyze Particles” paraméterein! • Mekkora méretű foltokat/objektumokat fogadjon el?
Feladatok • Komponens körvonal vörös színnel az eredeti színes,
illetve a szürkeárnyalatos képre • Ötlet: Ahol a szegmentált képen objektumpont van, ott a kimeneti
kép képpontjai legyenek (255,0,0) RGB értékűek. Mindenhol máshol maradjon az eredeti. • Bontsuk a színes képet R, G és B csatornákra, és alakítsuk át szürkeárnyalatos képpé is. • Használjunk Min és Max képek közötti matematikai függvényeket, vagy logikaiakat. • A csatornánként előállított eredményképet fűzzük össze egy RGB képpé.
Körvonal színes képre
Körvonal szürke képre
Feladatok • Szegmentáljuk a csillagokat az üstökösről készült
felvételen! • Kiindulás: HaleBopp.png • Ötlet: a csillagok a környezetüknél fényesebb foltok a képen • Vörös színnel vetítsük az eredeti képre a szegmentált részeket!
Stack műveletek • Egyforma típusú és méretű képek sorozata • Akár 5-dimenziós is lehet (WxHxCxZxT) • Egy ablakban jelennek meg • Az ablak alsó részén csúszkával léphetünk
Stack műveletek • Új létrehozása • File / New / Hyperstack • Akár 5 dimenziós is lehet • Képhez új képkocka hozzáadása • Image / Stacks / Add Slice • Képkocka törlése • Image / Stack / Delete Slice
• Vágólap műveletekkel • Másolandó képre váltás • CTRL + A • CTRL + C • Beillesztendő helyre váltás • CTRL + V
Stack műveletek • További stack műveletek • Képekből stack és vissza • Z-projekció • Animáció beállításai • Image / Stacks / Tools / Animation Options • Sebesség, kezdő és záró képkocka, ismétlődés
Animált GIF • Létrehozása • Stack képkockákból • Lépések • Stack létrehozása • Animáció paramétereinek beállítása • Mentés Animált GIF formátumban (Save As / Animated GIF) • GIF jellemzők • 256 különböző szín használható csak az összes képkockát figyelembe véve! • Mentés után ellenőrizzük az eredményt, mert a stack még teljes színskálán mutatja a képeket! • A színek számának csökkentése a mentés során hajtódik végre
Feladat • Készítsünk animációt, amely egy szürkeárnyalatos
kép egyre növekvő értékkel történő globális küszöbölését mutatja be! • Készítsünk új stack-et • Egyenként állítsuk elő a küszöbölt képeket • Másoljuk a stack-be új képkockaként • Próbáljuk makróval megvalósítani!
• Más képfeldolgozó művelettel is csináljuk meg!
Plugins menü • Makrók és beépülő modulok kezelése • Makró telepítés • Bemásolás ImageJ/macros könyvtárba • Készíthető saját pl. a Makró felvevővel • Plugins / Macros / Record…
• Makró futtatása • Plugins / Macros / Edit… és ezen belül Debug / Run (Control + R)
• Plugin telepítés • JAR vagy Class fájl letöltése internetről • Bemásolás ImageJ/plugins könyvtárba • ImageJ újraindítása • Elvárás • A plugin fájlnevének tartalmazni kell az aláhúzás karaktert!
Saját műveletek megvalósítása • Makró nyelv • Interpretált • Kész eljárások meghívására megfelelő • Képpontok közvetlen elérésére nem igazán optimális • Plugin programozás • Java programozási nyelven • Hatékony
• Fő lépések • Új kép létrehozása • Képpontok elérése
• Plugin paraméterek átadása
Makró nyelv • Angol nyelvű leírás • http://rsb.info.nih.gov/ij/developer/macro/macros.html • ImageJ parancsok végrehajtása • run parancs • Változók használhatók • Típus nélküliek, nem kell előzetes deklaráció, átdefiniálható v = 1.23; print(v); v = "a string"; print(v); v = newArray(10, 20, 50); for (i=0; i
• Aktuális kép nevének lekérése és név alapú aktiválás • imageTitle = getTitle(); • selectWindow(string); // string = kép neve (ablak fejlécében)
Makró nyelv • Operátorok • A legtöbb Java nyelvbeli elérhető, de kevesebb precendenciaszinten • Feltételes utasítás if (condition) { statement(s) } else { statement(s) }
• Ciklusszervezés • for • while • do…while
Makró nyelv • Saját eljárások készítése function myFunction(arg1, arg2, arg3) { statement(s) } • Érték adható vissza a return utasítással
• Sztringkezelés • indexOf() • startsWith() • endWith() • substring() • lengthOf()
• Példák • Plugins / Examples
Beépülő modulok • Java programozási nyelven • PluginFilter interfész • Kép(ek)ből kép(ek) készülnek • Helyben vagy új képbe • Nincs saját felhasználói felület • Indításkor egy beállítás panel megjeleníthető
• Plugin interfész • Saját felület készíthető Java nyelvi eszközökkel • Összetettebb programozás, de többféle lehetőség • Információ • tutorial171.pdf • BurgerBurgeEn20071104_IJreference_Letter.pdf
Fontos osztályok • IJ • ImageJ műveletek hívási lehetősége • Üzenetek felhasználónak • …
• ImageProcessor • Kép reprezentáció + műveletek • ImagePlus • Objektum kép (ImageProcessor) megjelenítésére ablakban
Képpontok elérése • get/set függvényekkel • ImageProcessor.get(x,y); • ImageProcessor().set(x,y,value); • Nagyon lassú! • Példa: Plugins / Examples / Image_Inverter.java • Képpontok lekérése tömbbe • Lásd Draw_Grid.java példánál • Byte típus esetén vigyázni kell! • Java byte típus előjeles, a képpontok értelmezése viszont előjel nélküli! • Egész érték esetén & 0xff kell!
Modulok fordítása • Beépített szerkesztővel • Plugins / Macros / Edit • Fájl kiválasztása • File / Compile and Run • Magyar billentyűzet esetén több esetben összezavarodik • Pl. Nyitó kapcsos zárójelnél…
PluginFilter interfész import import import import import
ij.*; ij.process.*; ij.gui.*; java.awt.*; ij.plugin.filter.*;
public class Draw_Grid implements PlugInFilter { ImagePlus imp; public int setup(String arg, ImagePlus imp) { this.imp = imp; return DOES_8G+NO_CHANGES; }
public void run(ImageProcessor ip) { // ... } }
public void run(ImageProcessor ip) { int x, y; // get width, height and the region of interest int w = ip.getWidth(); int h = ip.getHeight(); // create a new image with the same size and copy the pixels of the original ImagePlus framed = NewImage.createByteImage ("GridResult", w, h, 1, NewImage.FILL_BLACK); ImageProcessor framed_ip = framed.getProcessor(); framed_ip.copyBits(ip,0,0,Blitter.COPY); byte[] out_pixels = (byte[]) framed_ip.getPixels(); for( y = 0; y < h; y for( x = 0; x < out_pixels[ } for( x = 0; x < w; x out_pixels[ ( h } for( x = 0; x < w; x for( y = 0; y < out_pixels[ out_pixels[ } for( y = 0; y < h; y out_pixels[ y * }
+= 16 ) w; x ++ ) { ( y ) * w + x ] = (byte)(255 & 0xff); ++ ) { - 1 ) * w + x ] = (byte)(255 & 0xff); += 16 ) h; y ++ ) { y * w + x ] = (byte)(255 & 0xff); y * w + w - 1 ] = (byte)(255 & 0xff); ++ ) { w + w - 1 ] = (byte)(255 & 0xff);
framed.show(); framed.updateAndDraw(); }
PluginFilter kezdeti paraméterek • GenericDialog objektum • addChoice() • addMessage() • addNumericField() • addCheckBox() • showDialog() • Értékek lekérése • wasCancelled() • getNextChoiceIndex() • getNextNumber() • getNextBoolean()
Feladat • Egészítsük ki a Draw_Grid.java kódot dialógus
ablakkal, ahol a rácsozat méretét adhatjuk meg! • A 16-os konstans érték helyett ezt használjuk a kódban • Akár X- és Y-irányban különböző léptékkel is dolgozhatunk.
Példák • Saját példák • Draw_Grid.java • Egyszerű példa
• Image_Transfor_Stub.java • Kezdeti paraméterek
• Plugins / Examples • Image_Inverter.java • Kiválasztott régió elérése
• Red_And_Blue.java • Színes képek RGB adatainak elérése
• IP_Demo.java • Saját GUI