Spojení obrázků do jednoho a odstranění čar

Z mj41.cz
Skupina několika vstupních obrázků tvoří jednu část výstupního obrázku.
Existují situace kdy nemáme možnost pořídit si obrázek v jednom celku, ale pouze po částech. Příklad: místo původního obrázku o rozměrech 10.000 x 10.000 bodů, tak máme 400 obrázků (výřezů) o rozměrech 500 x 500 bodů. U každého výřezu máme informace o jeho pozici v obrázku původním. V tomto případě je rekonstrukce původního obrázku jednoduchá a jde jen o ukládání jednotlivých výřezů vedle sebe, resp. pod sebe.

Dále existují situace kdy jsou do výřezu přidávány data (např. nápisy, čáry, …), jenž tam nechceme. V případě, že jsou tyto znehodnocující data do obrázku umístěna vždy na stejném místě a s původním výřezem je možné hýbat, tj. je možné vybrat si polohu výřez v původním obrázku, pak je také možné z velké části výřezu odfiltrovat tyto nežádané data (nápisy, čáry).

Situace je však komplikovanější, když se jednotlivé výřezy z původního obrázku překrývají a neznáme-li velikost tohoto překrytí.

Úkolem projektu je tedy rekonstrukce původního obrázku z mnoha částečně se překrývajících výřezů a odfiltrování nežádaných dat (černé rovnoběžky).

Zadání je snad snadnější pochopit z uvedeného obrázku: Čtyři z celkem 36 testovacích výřezů projdou filtrací a vytvoří první část z celkem devíti částí výsledného obrázku. Černý okraj u výřezů udává jak se obrázky překrývají. Napravo dole je pak vidět původní obrázek. Cílem projektu je tedy nalezení a ověření vhodných algoritmů, jejichž aplikací dostaneme obrázek jenž je stejný (nebo alespoň podobný) jako obrázek původní.

Obsah

Popis návrhu a realizace

V první části bude nejprve popsáno řešení obecně. V druhé části bude vysvětleno k čemu slouží jednotlivé soubory zdrojového kódu a bude vysvětleno jak fungují.

REALIZOVANÉ ŘEŠENÍ Z POHLEDU UŽIVATELE

Úvod

Program se spouští pomocí dávkového souboru _run.bat (spouští příkaz ‘perl.exe spoj.pl spoj_conf.yaml‘). Veškeré nastavení parametrů, jenž je vzhledem k oblasti použití poměrně hodně je tedy nutné provést v souboru textovém souboru spoj_conf.yaml. Struktura YAML konfiguračního souboru je patrná při otevření souboru (YAML specifikace). Jednotlivé parametry nastavení budou dále popsány v následujících kapitolách.

Konfigurace pro standardní použití

Výstupní obrázek si můžeme představit jako šachovnici, tzn. že je složen z několika výřezů uložených vedle sebe. Každý výřez je označen trojcí čísel. První číslo udává vertikální souřadnici Y (jedničce odpovídá první políčko nahoře). Druhé číslo je horizontální souřadnice X (jedničce odpovídá první políčko vlevo). Třetí číslice je číslo překrytí P (první obrázek má číslo nula, druhý obrázek má číslo jedna, má stejné souřadnice X a Y jako první obrázek a je oproti prvnímu obrázku mírně posunut doprava). Názvy vstupních souborů s výřezy (obrázky) musí obsahovat tři oddělená čísla Y-X-P (např. vyrez-2-3-0.jpg je druhý výřez shora, třetí zleva a jedná se o první překrytí). Dále již samotné parametry.

  • INPUT_FILTER* - Filtr pro nalezení obrázků se vstupními výřezy.
  • OUTPUT_IMAGE_PATH – Název a cesta k výstupnímu souboru.
  • OFFSETS - Udává posunutí X a Y jednotlivých překrytí výřezů (v pixelech), jenž „ukládáme na sebe“. Způsob zápisu je patrný ze souboru. První číslo je vždy 0. Druhé číslo je posunutí v pixelech mezi prvním překrytím P=0 a překrytím P=1, druhé číslo je posunutí mezi P=0 a P=2, atd. Čtyři překrytí na obrázku uvedeném v zadání by byly měly toto nastavení
OFFSETS:  
  X:
    - 0
    - 1
    - 4
    - 8
  Y:
    - 0
    - 0
    - 0
    - 0
  • MARGIN – Udává jak se jednotlivé výřezy jenž ukládáme vedle sebe překrývají (mají různé X a/nebo Y), tj. určuje části jenž budeme při skládáni ignorovat. Čtyři překrytí na obrázku uvedeném v zadání (černý okraj okolo obrázků) by byly měly toto nastavení
MARGIN:
  X1: 20
  Y1: 20
  X2: 10
  Y2: 10
  • MAX_OUT_PIXELS – Protože výsledný obrázek může být velmi velký není vhodné během celého výpočtu mít jej v operační paměti. Při překročení hodnoty tohoto parametru jsou mezivýsledky (v podobě obrázku) ukládány do adresáře TMP_DIR a výsledný obrázek je složen až po tom co proběhne veškerá filtrace. Parametr DEL_TMP_DIR udává, zda se má adresář TMP_DIR smazat na začátku práce. Pozor jde o rekurzivní mazání a při špatném nastavení TMP_DIR můžete přijít o data na disku. Doporučuje se nechat parametr DEL_TMP_DIR na hodnotě rovné 0.

Konfigurace pro ladění

  • DEBUG – Udává jak hodně má program mluvit. Standardní nastavení je 4, kdy program vypisuje čísla řádku Y během filtrace.
  • DEVEL_ONLY_FIRST_LINE – Při nenulové hodnotě se během filtrace pracuje jen z prvním řádkem pixelů.
  • DEBUG_MAX_SIZE – Načtou se všechny vstupní obrázky, ale pracuje se jen s obrázky jenž mají souřadnice X a Y menší než jsou hodnoty tohoto parametru.
  • DEBUG_INPUT_ONLY – Načtou se všechny vstupní obrázky, ale pracuje se jen s obrázky jenž mají souřadnice X a Y shodné s hodnotami tohoto parametru. Má menší nastavení než DEBUG_MAX_SIZE.

POPIS REALIZOVANÉHO ŘEŠENÍ

Úvod

Během realizace bylo nutné řešit několik zásadních problémů.

První problém je, že vstupní data mohou být velmi různá. Tj. výřezy mohou být pořízeny velmi chaoticky a náhodně. Tato situace však nenastává často a vytvořené algoritmy s ní nepočítají. Podmínkou správné funkce je tedy určitá uspořádanost vstupních výřezů (stejné hodnoty posunutí a překrytí, resp. okrajů u všech vstupních obrázků).

Druhý problém spočívá v tom, že jeden výřez může navazovat na výřezy umístěné vedle něj a mající stejné číslo překrytí P přímo, tj. nelze počítat s tím, že se tyto výřezy vedle sebe překrývají (situace na obrázku v zadání). Jinak řečeno, každý bod na vstupním obrázku může být nutné použít při filtraci. Jelikož jsou však obrázky na stejné pozici (ve výsledném obrázku, stejné X a Y, různé P) posunuty, není možné provádět filtraci s jedním celým výřezem, ale je nutné filtrovat po částech.

Třetí problém je nastíněn v předchozí kapitole u vysvětlení parametru MAX_OUT_PIXELS. Výsledný obrázek může být velmi velký a není vhodné během celého výpočtu mít jej v operační paměti.

Zvolený programovací jazyk

Vzhledem ke zkušenostem autora byl pro vypracování vybrán programovací jazyk Perl. Mezi jeho přednosti patří dynamická práce s poli, hash tabulky, garbage collector a spousta volně dostupných modulů atd. Klady a zápory zvoleného způsobu řešení, na něž jsme narazili během realizace, budou zmíněny v závěru. Perl pro operační systémy firmy Microsoft, jenž firma Microsoft nadále podporuje a na němž byl projekt odladěn a testován je zdarma dostupný na www stránkách firmy ActiveState .

That's the best anwesr of all time! JMHO

Závěr

Splnil jsme vytyčené zadání. Program, resp. algoritmy jsou napsány v programovacím jazyce Perl a jejich funkčnost byla ověřena na testovacích i reálných datech. Programovací jazyk Perl není optimalizován pro rychlé matematické operace s daty. Filtraci by tedy bylo vhodné přepsat do programovacího jazyka C. Během realizace byl kladen důraz na modularitu a přehlednost zdrojového kódu. Aplikace vyhovuje zadání a je snadné ji upravit pro jiné mírně odlišné požadavky.

Odkazy

  • Download - adresář se soubory projektu
spřízněné weby
Jazyk