Zadání:

Vytvořte program pro detekci hran objektů ve volumetrických datech. Hrany detekujte metodou sledování gradientu. Vstupem je CT nebo MR datový soubor, výstupem je soubor obsahující bitové mapy s obrysy. Vstupním souborem je Syn_64.vol, řezná rovina XZ.

Uživatelská dokumentace:

Po spuštění programu, lze vybrat vstupní soubor, který chceme zpracovávat. Otevřít soubor lze dvěma způsoby, buď klávesou F2, nebo v menu Soubor výběrem položky Otevři vstup. Poté lze z dialogového okna, vybrat vstupní datový soubor, defaultní přípona je *.vol, v dialogovém okně je nadefinovaný filtr i pro všechny soubory. Vstupní soubor je zkontrolován jestli je správný a to tak, že je z hlavičky, porovnán první byte. Po otevření vstupního souboru jsou data načtena a zobrazena v hlavním okně, mezi jednotlivými vrstvami lze plynule přecházet pomocí scrollbaru v pravé části.

obr. 1

V menu soubor jsou ještě položky Otevři výstup a Ulož výstup. Tyto položky pracují s již zpracovanými soubory, pro tyto soubory je defaultní přípona *.ogf. Další položkou menu je Generuj, pokud uživatel klikne na tuto položku, najdou se hrany v jednotlivých snímcích. Tyto snímky se pak zobrazí viz obr. 2

 

 

obr. 2

Pro nalezení hran, jsou použity hodnoty filtru min a max. Tento filtr se dá nastavit po kliknutí na menu Filtr. Hodnoty lze vybrat v intervalu od 1 do 255. Horní mez nelze nastavit pod dolní mez a taktéž dolní mez nelze nastavit nad horní mez (viz obr. 3).

obr. 3

Další položkou je Log, po kliknutí na tuto položku se zobrazí okno s logem, se vším co se provádí a není to zřejmé na první pohled. Pokud uživatel klikne pravým tlačítkem na seznamu výpisů, je zobrazeno malé menu s dvěmi položkami a to Smazat Log a Uložit Log do souboru. Jejich funkce je zřejmá, a tedy zde jí nebudu blíže popisovat.

obr. 4

Do programu jsem ještě přidal část pro dávkové zpracování (viz obr. 5). Zde je možné načíst již hotovou dávku z textového souboru, nebo vytvořit novou dávku, pro dávku potřebujeme znát některé položky, mezi něž patří: Vstupní soubor, Výstupní adresář (viz obr.6), a pak jednotlivé filtry (viz obr.7).

 

obr.5 obr.6

Filtrů se může zadat libovolné množství (teda až do velikosti dostupných systémových prostředků systému). Prvně vybereme dolní a horní mez filtrování (horní mez nelze vybrat nižší než dolní a naopak), pokud je filtr už správně navolen, klikneme na tlačítko přidat. Pakliže je filtr přidán špatně lze jej smazat po označení v seznamu a kliknutí na tlačítko Smazat.

obr. 7

Po nastavení všech parametrů, stačí v okně s dávkou (viz obr.5) kliknout na tlačítko Run a výsledné soubory se vygenerují do jednotlivých souborů. Jméno souborů je tvořeno hodnotami filtru s příponou ogf.

Program se ukončí pomocí Alt-X v hlavním okně (obr. 1) nebo stiskem Alt-F4.

IMHO: V programu jsou navíc zabudována některá vylepšení dostupná přes cheat, viz níže.

 

Programová dokumentace:

Po spuštění programu, se inicializují proměnné. Zjistí se adresář , ze kterého se program spustil a cesta se uloží do proměnné ActualPath. Pak se inicializuje grafická knihovna OpenGL. Jednotlivé akce se v programu ovládají pomocí menu. V menu Soubor jsou položky Otevři vstup, po kliknutí na toto menu se volá procedura, která otevře dialogové okno, ze kterého si může uživatel vybrat jméno souboru, které se vrací v proměnné FileName. Poté se soubor otevře a načte do pole rovin Roviny (tedy 64 rovin, které mají rozměr 64x64), řeznou rovinou má být podle zadání XZ, takže se pohybuji v Y-ové ose.

Po načtení dat ze souboru do pole rovin se volá procedura CreateDisplayListIn, která převede data z pole do listů, které se dají načíst v OpenGL. Každá rovina je uložena do jiného listu, v listu 1 je první rovina, atd. V proměnné src je hodnota 0, což znamená, že se nyní mají zobrazovat vstupní data, pokud je v proměnné src 1,budou se zobrazovat výstupní data, které jsou načtena z roviny RovinyOut pomocí procedury CreateDisplayListOut do jednotlivých listů. Nejdůležitější částí programu je funkce která se volá po kliknutí na generuj, je to vlastní algoritmus výpočtu, a tedy v této práci klíčový.

Po zavolání této procedury se zavolá funkce ApplyFiler, která ze vstupního pole odfiltruje nepotřebná data a do výsledné bitové mapy se nastaví 0, pokud jsou data v intervalu filtru je jim nastavena 1. Nyní už bude probíhat vlastní hledání hran. Pro každý bod v bitové mapě získané funkcí ApplyFilter, zjistím počet různých bodů v okolí, pokud je počet odlišných bodů větší než 1 (tedy 2 – 8), je pak do výsledného pole rovin uložena 1, pokud tomu tak není je uložena 0. Kolik je různých bodů v okolí prohledávaného zjišťuje funkce ZjistiRozdil, která vrací buď 1 nebo 0. Jako parametr jsou ji zadány dolní a horní meze v ose x a z. Např. pro levý horní roh je funkce volána s parametry dolní mez X = 0,

horní mez X = 1, dolní mez Y = 0, horní mez Y = 1. Funkce ZjistiRozdil jsou volány pro tři různé případy: bod leží v rohu, bod leží na hraně roviny, bod leží uvnitř roviny.

Nyní jen letmo rozeberu dávkové zpracování. Dávkové zpracování má více částí, většina funkcí je v unite3.

Výběr výstupního adresáře:

K vybrání výstupního adresáře jsou už v Delphi dlouho funkce, ale nebyly tam žádné k vybrání adresáře např. z Okolních počítačů, nebo z Plochy, v Delphi 4, je už tento problém vyřešen, pomocí funkce SelectDirectory s patřičnými parametry, jelikož bude program testován v prostředí Delphi 3, udělal jsem vlastní funkci, která zobrazí dialogové okno, s okolními počítači. K tomuto využívám unitu ShlObj a ActiveX, které volají API systému.

Okno s dialogem pro výběr adresáře je zobrazeno po zavolání funkce ShBrowseForFolder,

a funkce SHGetPathFromIDList

Výběr filtrů:

K vybrání filtrů se zobrazí další okénko se seznamem filtrů, tento seznam je seřazený podle abecedy, po kliknutí na tlačítko Přidat program zkontroluje, jestli se už filtr v seznamu nenachází, pokud ne, je přidán, podobně je obsloužena funkce pro odebírání filtru ze seznamu.

Načtení / uložení dávky:

Uložení dávky je jednoduché, zde rozeberu pouze načítání, u kterého se musí testovat plno věcí na chyby. K práci se souborem je využívána jednotka IniFiles. S touto jednotkou lze pohodně pracovat se soubory, kde se definuje sekce a v každé sekci může být libovolný počet řetězců(identifikátorů) a je jim přiřazena hodnota. Defaultní přípona pro dávkové soubory je *.bgf. Dávkový soubor musí mít sekci main, ve které musí být následující položky:

[Main]

InputFile=C:\Zpg3\Syn_64.vol

OutputDir=C:\Temp\Zpg

Filters=1

[Filter1]

Min=001

Max=255

Položka filters udává kolik filtrů je v dávkovém souboru. Pomocí funkce SectionExists se testuje jestli položka existuje, např. pokud položka filters je nastavena na hodnotu 3, testuje se jestli existuje sekce Filter1, Filter2 a Filter3.

Top secret (cheat):

K programu je přiděláno několik vylepšení, která jsou dostupná po zadání cheatu, jsou to např. změna barev vstupního obrázku, změna barev výstupního obrázku a animace. Postup k aktivaci cheatu: otevřete okno s logem, klikněte na seznam a napište na klávesnici následující sekvenci: BOSNA, potom se zobrazí nové položky v menu v hlavním okně, a to Animace a Barvy (viz obr. 8).

obr. 8

Závěr:

Program jsem napsal v Delphi4, pro vyzkoušení jsem musel některé funkce opravit tak, aby byl funkční i v Delphi3. Program by měl bezvadně fungovat, snažil jsem se ošetřit co nejvíce možných chyb, jako např. nekompabilitu vstupního souboru, existence souborů, ap.

Doufám, že všechny body semestrální práce byly 100% splněny.