Hlavní navigace

Skripty pro GIMP a použití hladin a filtrů

27. 5. 2010
Doba čtení: 17 minut

Sdílet

V dnešní části seriálu o programovacím jazyce Scheme si ukážeme další možnosti skriptování v rastrovém grafickém editoru GIMP. Popíšeme si práci s vrstvami a taktéž použití filtrů, které tento grafický editor svým uživatelům nabízí. S využitím této dvojice nástrojů lze tvořit skripty provádějící velmi komplikované operace.

Obsah

1. Vrstvy a filtry v grafickém editoru GIMP

2. Nízkoúrovňové a vysokoúrovňové kreslení do zvolených vrstev

3. Práce s filtry v GIMPu

4. Filtry určené k potlačení šumu či rozmazání obrazu

5. První demonstrační příklad – tvorba „vzorníku“ základních filtrů potlačujících šum

6. Detekce hran v obrázku a jeho zaostření

7. Druhý demonstrační příklad – tvorba „vzorníku“ filtrů pro detekci hran a zaostření obrázku

8. Třetí demonstrační příklad – interaktivní nastavení základních vlastností filtrů

9. Odkazy na Internetu

1. Vrstvy a filtry v grafickém editoru GIMP

V předchozí části seriálu o programovacím jazyce Scheme jsme se zabývali především popisem programového i interaktivního nastavení vlastností základních kreslicích nástrojů nabízených rastrovým grafickým editorem GIMP. Víme tedy, jakým způsobem je možné změnit tvar vykreslované stopy, barvu kreslení, přítlak, průhlednost i některé další vlastnosti všech tří základních kreslicích nástrojů, tj. tužky (pencil), štětce (brush) a rozprašovače (airbrush). Taktéž jsme si ukázali, jakým způsobem je možné vytvářet výběry (selections) s využitím množinových operací sjednocení, rozdílu i inverze (doplňku) a jak se výběry mohou použít při kreslení či vyplňování oblastí. Ovšem použití základních kreslicích nástrojů a práce s výběry zdaleka nepokrývá všechny možnosti, které grafický editor GIMP svým uživatelům i programátorům skriptů nabízí. Neméně důležitá je i možnost práce s filtry a vrstvami (hladinami). Současné použití filtrů i vrstev si ukážeme na několika demonstračních příkladech.

Obrázek 1: Vytvoření výběru ze dvou sjednocených kružnic, od nichž byla pomocí množinové operace odečtena plocha ve tvaru obdélníku. Tento výběr je možné vytvořit buď interaktivně pomocí nástrojů pro výběr elipsovité a obdélníkové oblasti, popř. lze stejnou operaci vyvolat neinteraktivně ze skriptu. Možností, jak vytvořit výběr, je však mnohem více, například lze použít nástroje typu laso atd.

Prakticky každý pokročilejší uživatel grafického editoru GIMP se již pravděpodobně setkal s použitím takzvaných vrstev či hladin (layers). Ve skutečnosti je v GIMPu každý obrázek tvořen množinou na sobě ležících vrstev, přičemž každou vrstvu je možné považovat za bitmapu, tj. pravidelnou matici pixelů. Pořadí, v jakém jsou vrstvy uspořádány, je velmi důležité, protože se pomocí něho určuje viditelnost určitých částí obrázku (neprůhledný pixel na viditelné vrstvě umístěné nejblíže k uživateli zakryje všechny pixely ležící pod ním atd.), popř. i některé další grafické efekty, protože pixely umístěné v sousedních vrstvách se mohou vzájemně ovlivňovat, například se může sčítat či naopak odečítat jejich barva, vrstvy či pouze některé pixely na vrstvách mohou být poloprůhledné atd. S vrstvami je možné provádět poměrně velké množství operací, především vytvoření nové vrstvy, smazání vrstvy, přesun vrstvy (změna pořadí vrstev), sloučení dvou vrstev (to se v některých případech provádí po dotazu automaticky při ukládání obrázků), zviditelnění nebo naopak skrytí vrstvy (ikona očička) atd.

Obrázek 2: Interaktivní nastavení vlastností kreslicího nástroje (zde se konkrétně jedná o nastavení tvaru jeho stopy) spuštěné z dialogu zobrazeného při spuštění demonstračního skriptu.

2. Nízkoúrovňové a vysokoúrovňové kreslení do zvolených vrstev

Z hlediska programátora píšícího skripty pro grafický editor GIMP je důležitý především fakt, že samotné vykreslování či aplikace mnoha dalších grafických operací se neprovádí nad celým obrázkem (ten je z tohoto pohledu skutečně pouze „kontejnerem“ pro vrstvy a některé další objekty) ale právě nad jednou aktivní vrstvou. Vrstvy jsou totiž, spolu s maskami a kanály, objekty nazývané souhrnně drawable („pokreslitelné“), což znamená, že je možné na jejich plochu kreslit, a to buď na nízké úrovni (přímou změnou barev jednotlivých pixelů), tak i na úrovni vyšší (použitím kreslicích nástrojů, filtrů či externích nástrojů). Už v předchozích dvou částech tohoto seriálu jsme si mohli všimnout, že všechny funkce provádějící kreslení skutečně vyžadují jako jeden ze svých parametrů celočíselný identifikátor vrstvy. Tuto skutečnost si ostatně můžeme připomenout na několika fragmentech kódu, které byly použity v předchozích částech tohoto seriálu v demonstračních příkladech.

Obrázek 3: Uživatelé grafického editoru GIMP mohou s vrstvami pracovat interaktivně přes toto nástrojové okno.

Nejprve si ukažme modifikaci barev jednotlivých pixelů ve vrstvě s využitím nízkoúrovňové funkce gimp-drawable-set-pixel:

; vnější smyčka procházející všemi řádky obrázku
(while (< y height)
    ; nastavit počitadlo vnitřní smyčky
    (set! x 0)
    ; vnitřní smyčka procházející všemi pixely na řádku
    (while (< x width)
        (aset pixel 0 (* 256 (/ x width)))
        (aset pixel 1 (* 256 (/ y height)))
        (aset pixel 2 (* 256 (+ (/ x width) (/ y height))))
        ; vykreslení pixelu - zde si povšimněte především použití
        ; parametru "selected-layer", který nese celočíselný
        ; identifikátor vrstvy
        (gimp-drawable-set-pixel selected-layer x y 3 pixel)
        ; zvýšení hodnoty počitadla vnitřní smyčky
        (set! x (+ x 1))
    )
    ; zvýšení hodnoty počitadle vnější smyčky
    (set! y (+ y 1))
) ; end of loop

Obrázek 4: Dvojice zanořených programových smyček vypsaná výše, posloužila k vykreslení tohoto jednoduchého obrázku obsahujícího část spektra barvového prostoru RGB.

Použití identifikátoru vrstvy při provádění vysokoúrovňové kreslicí operace:

; vykreslení úsečky vybraným kreslicím nástrojem
(define (draw-line tool selected-layer npoint segment)
    (if (= tool 0)
        ; kresba tužkou do vybrané vrstvy
        (gimp-pencil selected-layer npoint segment)
        (if (= tool 1)
            ; kresba štětcem do vybrané vrstvy
            (gimp-paintbrush-default selected-layer npoint segment)
            ; kresba rozprašovačem do vybrané vrstvy
            (gimp-airbrush-default selected-layer npoint segment)
)))

Obrázek 5: Spirály vykreslené mj. i s využitím výše vypsané pomocné funkce draw-line.

Na dalším fragmentu kódu je zajímavé především to, že se v něm současně používá jak identifikátor obrázku, tak i identifikátor vrstvy. Je tomu tak z toho důvodu, že výběr (selection) je přiřazen k celému obrázku, ale vlastní vyplnění výběru, tj. kreslicí operace, se již provádí do vybrané vrstvy:

; vytvoření výběru ve tvaru čtverce
(gimp-rect-select
    selected-image       ; obrázek v němž se výběr vytvoří
    150 150 100 100      ; rozměry výběru
    REPLACE              ; přepsání oblasti původního výběru
    use-feather feather-radius) ; rozmazání hranice výběru
; přidání dalšího výběru ve tvaru kružnice
(gimp-ellipse-select
    selected-image       ; obrázek v němž se výběr vytvoří
    80 80 100 100        ; rozměry výběru
    ADD FALSE            ; přidání oblasti ke stávajícímu výběru
    use-feather feather-radius) ; rozmazání hranice výběru
; přidání dalšího výběru ve tvaru kružnice
(gimp-ellipse-select
    selected-image       ; obrázek v němž se výběr vytvoří
    220 220 100 100      ; rozměry výběru
    ADD FALSE            ; přidání oblasti ke stávajícímu výběru
    use-feather feather-radius) ; rozmazání hranice výběru
; volba barvy v paletě
(gimp-palette-set-background selected-color)
; vykreslení obrazce - jeho výplň, opět provedené do vybrané vrstvy
(gimp-edit-fill selected-layer BG-IMAGE-FILL)
; zrušení výběru (lze vrátit pomocí CTRL+Z)
(gimp-selection-none selected-image)

Obrázek 6: Vyplnění oblasti specifikované pomocí výběru.

3. Práce s filtry v GIMPu

Grafický editor GIMP obsahuje poměrně velké množství filtrů, které je možné aplikovat na upravované obrázky. Konfigurační dialogy k jednotlivým filtrům se vyvolávají z menu Filters, ovšem ne všechny filtry lze použít na všechny typy obrázků – některé filtry je možné aplikovat pouze na obrázky plnobarevné (truecolor) či obrázky obsahující pouze různé úrovně šedé barvy (grayscale), výrazně menší množství filtrů je určeno pro práci s obrázky obsahujícími barvovou paletu. Všechny filtry je též možné vyvolat ze skriptů. V tomto případě se jedním celočíselným parametrem specifikuje, zda se má zobrazit dialog pro interaktivní zadání parametrů filtru či zda se parametry předají přímo ze skriptu bez toho, aby byl uživatel zdržován potvrzováním hodnot v dialogu. Vzhledem k tomu, že většina filtrů netvoří jádro grafického editoru GIMP, ale jedná se o zásuvné moduly, začínají názvy příslušných funkcí prefixem plug-in namísto gimp-.

Obrázek 7: Známá fotografie Leny, kterou budeme používat při zkoumání vlastností filtrů.

V následující tabulce jsou vypsány funkce vyvolávající některé základní filtry, které si podrobněji popíšeme v následujících kapitolách:

Název funkce Popis
plug-in-blur jednoduché průměrování přes devět sousedních pixelů
plug-in-mblur rozmazání obrazu pohybem
plug-in-gauss sada filtrů vhodná pro odstranění Gaussovského šumu
plug-in-pixelize nahrazení bloku pixelů konstantní barvou
plug-in-pixelize2 dtto ale s možností nastavení obdélníkového bloku
plug-in-sobel aplikace Sobelova operátoru na rastrový obrázek
plug-in-edge sada několika filtrů určených pro detekci hran v obrazu
plug-in-emboss tvorba vytlačeného vzoru (reliéfu)
plug-in-sharpen zaostření obrázku (a současně zvýraznění šumu)

Obrázek 8: Aplikace filtru typu Blur (rozmazání) na originální fotografii.

4. Filtry určené k potlačení šumu či rozmazání obrazu

Při úpravách fotografií nebo naskenovaných obrázků se poměrně často můžeme setkat s požadavkem na odstranění šumu z obrazu nebo z jeho vybrané části. Grafický editor GIMP obsahuje poměrně velké množství více či méně sofistikovaných filtrů, které lze pro odstranění šumu použít. Nejjednodušším a taktéž nejrychlejším filtrem, který dokáže odstranit vysoké frekvence v obrazu a tím i šum (bohužel spolu s ostrými hranami) je filtr nazvaný příznačně Blur. Tento filtr pracuje velmi jednoduše – spočítá průměrnou hodnotu devíti sousedních pixelů tvořících blok o velikosti 3×3 pixely a tuto hodnotu uloží do pixelu ležícího přesně uprostřed bloku (operace je samozřejmě provedena pro všechny pixely v obrazu). Výsledkem je sice obraz s odstraněným vysokofrekvenčním šumem, ale současně s potlačením šumu došlo k rozmazání všech jednopixelových hran na přechody široké minimálně tři pixely. Z implementačního hlediska se jedná o konvoluční filtr (viz též odkazy), jehož konvoluční jádro je velmi jednoduché:

1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9

Obrázek 9: Rozmazání fotografie pohybem (motion blur).

Dalším typem filtru určeného k odstranění šumu je Gaussovský filtr (Gaussian Blur), v němž se též provádí průměrování hodnot sousedních pixelů, ale, na rozdíl od filtru předchozího, jsou těmto pixelům přiřazeny různé váhy v závislosti na jejich vzdálenosti od středního pixelu. Taktéž se jedná o konvoluční filtr, ovšem velikost konvolučního jádra je možné měnit. Běžně se používají velikosti jádra 3×3 či 5×5 pixelů, protože při větší velikosti jádra již mají vzdálenější pixely tak nízkou váhu, že se výpočet pouze zbytečně prodlužuje bez většího vlivu na výsledný obrázek. Třetím typem filtru, který je spíše vhodný pro tvorbu více či méně originálních efektů, je filtr nazvaný Motion Blur. Jak již název tohoto filtru napovídá, simuluje rozmazání obrazu vlivem pohybu pozorovatele (fotoaparátu, kamery). U tohoto filtru je možné zadat směr pohybu a tím pádem i směr rozmazání a taktéž to, zda se má jednat o simulaci rozmazání (lineárním) pohybem fotoaparátu, jeho otáčením (nejzajímavější efekt) či změnou zvětšení (zoom).

Obrázek 10: Odstranění šumu Gaussovským filtrem.

Filtry typu Pixelize sice taktéž utlumují šum v obrazu, ale spolu s ním jsou odstraněny i všechny podrobnosti menší než obdélník o zadaných délkách hran (délky jsou specifikovány v pixelech). Je tomu tak z toho důvodu, že se plocha obdélníka vybarví konstantní barvou spočtenou průměrem barev pixelů ležících v tomto obdélníku. Typické použití tohoto filtru spočívá v odstranění nežádoucích informací ze zpracovávaného obrazu nebo pro realizaci zajímavých grafických efektů v případě, že je „pixelizace“ provedena v nové vrstvě a následně je původní obrázek zkombinován s touto novou vrstvou.

5. První demonstrační příklad – tvorba „vzorníku“ základních filtrů potlačujících šum

V dnešním prvním demonstračním příkladu je ukázáno, jakým způsobem lze jednoduše vytvořit „vzorník“ základních filtrů, které slouží k odstranění šumu z obrázku nebo k jeho rozmazání. Po spuštění skriptu (který nemá žádné parametry, tudíž se nezobrazí žádný dialog) se v aktivním obrázku vytvoří šest nových vrstev, z nichž každá obsahuje kopii obsahu původní (základní) vrstvy. Následně jsou vrstvy přejmenovány a na jejich obsah je aplikován zvolený filtr. Po dokončení práce skriptu je možné kliknutím na ikonu „očička“ jednotlivé vrstvy zapínat či vypínat a zobrazit si tak výsledek práce jednoho z filtrů. Vzhledem k tomu, že všechny vrstvy i pixely v nich uložené jsou neprůhledné, je nutné zneviditelnit všechny vrstvy ležící nad vrstvou, jejíž obsah potřebujeme vidět (pro zobrazení základní vrstvy, tj. původního obrázku, se tedy musí zneviditelnit všechny vrstvy ostatní). Obrázky číslo 8 až 12 byly vytvořeny právě na základě výsledků práce tohoto demonstračního příkladu.

Obrázek 11: Použití pixelizace s velikostí bloků 10×10 pixelů.

Zdrojový kód dnešního prvního demonstračního příkladu má tvar:

; Skriptování v GIMPu (4)
; Demonstrační příklad číslo 1
(define (script-fu-filter-samples
                             selected-image
                             selected-layer)
  ; pomocná funkce která vytvoří kopii vybrané vrstvy
  (define (create-new-layer selected-layer)
    (car (gimp-layer-copy selected-layer FALSE))
  )
  (let* (
      ; vytvoření nových vrstev
      (new-layer-blur  (create-new-layer selected-layer))
      (new-layer-mblur (create-new-layer selected-layer))
      (new-layer-gauss (create-new-layer selected-layer))
      (new-layer-pixelize (create-new-layer selected-layer))
      (new-layer-pixelize2h (create-new-layer selected-layer))
      (new-layer-pixelize2v (create-new-layer selected-layer))
    )
    ; pojmenování nově vytvořených vrstev
    (gimp-layer-set-name new-layer-blur "Blur filter")
    (gimp-layer-set-name new-layer-mblur "Motion blur filter")
    (gimp-layer-set-name new-layer-gauss "Gauss blur filter")
    (gimp-layer-set-name new-layer-pixelize "Pixelize filter")
    (gimp-layer-set-name new-layer-pixelize2h "Pixelize2 horizontal filter")
    (gimp-layer-set-name new-layer-pixelize2v "Pixelize2 vertical filter")
    ; vrstvy je zapotřebí přidat do obrázku
    (gimp-image-add-layer selected-image new-layer-blur 0)
    (gimp-image-add-layer selected-image new-layer-mblur 0)
    (gimp-image-add-layer selected-image new-layer-gauss 0)
    (gimp-image-add-layer selected-image new-layer-pixelize 0)
    (gimp-image-add-layer selected-image new-layer-pixelize2h 0)
    (gimp-image-add-layer selected-image new-layer-pixelize2v 0)
    ; aplikace filtrů na jednotlivé vrstvy
    (plug-in-blur      1 selected-image new-layer-blur)
    (plug-in-mblur     1 selected-image new-layer-mblur 0 20 45 0 0)
    (plug-in-gauss-rle 1 selected-image new-layer-gauss 10 1 1)
    (plug-in-pixelize  1 selected-image new-layer-pixelize 8)
    (plug-in-pixelize2 1 selected-image new-layer-pixelize2h 10 1)
    (plug-in-pixelize2 1 selected-image new-layer-pixelize2v 1 10)
    ;                  ^     ^             ^                 ^
    ;                  |     |             |                 +- parametry filtru
    ;                  |     |             |
    ;                  |     |             +------------------- identifikátor hladiny
    ;                  |     |
    ;                  |     +--------------------------------- identifikátor obrázku
    ;                  |
    ;                  +--------------------------------------- 1=neinteraktivní běh
    ;                                                           0=zobrazení dialogu
  )
  ; přinutíme GIMP, aby finální obrázek překreslil
  (gimp-displays-flush)
)
; základní informace o skriptu a definice dialogu
; zobrazeného uživateli
(script-fu-register
    "script-fu-filter-samples"
    "Make samples of basic filters"
    "Makes "
    "Pavel Tisnovsky"
    "Pavel Tisnovsky"
    "2010-05-25"
    "RGB*, GRAY*"
    SF-IMAGE    "Image"         0
    SF-DRAWABLE "Layer"         0)
; registrace skriptu do menu
(script-fu-menu-register "script-fu-filter-samples"
                         "<Image>/Root.cz")
; finito

Obrázek 11: Použití horizontální pixelizace s velikostí bloků 10×1 pixelů.

Obrázek 12: Použití vertikální pixelizace s velikostí bloků 1×10 pixelů.

6. Detekce hran v obrázku a jeho zaostření

Kromě odstraňování šumu z obrazu je mnohdy žádoucí naopak obraz zaostřit (což ovšem vede ke zvýraznění šumu), popř. v něm nalézt hrany. Grafický editor GIMP samozřejmě obsahuje filtry, pomocí nichž lze tyto operace snadno provést. Pro nalezení hran v obrázku lze použít mnoho typů filtrů, založených například na Robertsově operátoru, Sobelově operátoru, Laplaceově operátoru atd. Jedná se o konvoluční filtry, jejichž konvoluční jádro má většinou rozměry 2×2 popř. 3×3 pixely, což znamená, že je aplikace těchto filtrů velmi rychlá. Nejjednodušším z těchto filtrů je filtr založený na Robertsově operátoru, jehož konvoluční jádro (resp. dvojice konvolučních jader) má rozměry 2×2 pixely. Výpočet je prováděn na základě změny barvy (či jasu) v obou diagonálních směrech. Nevýhodou tohoto filtru je to, že zvýrazní i šumy, proto se většinou používá v kombinaci s některým filtrem popsaným v předchozí kapitole. Obě konvoluční jádra mají tvar:

-1  0
 0  1
 0 -1
 1  0

Obrázek 14: Aplikace Robertsova operátoru na testovací fotografii.

Další filtr podobného typu je založený na operátoru Prewittové. Tento filtr je určen pro zvýraznění horizontálních a/nebo vertikálních hran v obrazu. Konvoluční maska tohoto filtru je většinou (ze zvyku a pro porovnání s dalšími filtry) zapisována maticí o rozměrech 3×3 prvky i když se ve skutečnosti jedná o filtr s maskou 1×3 popř. 3×1 prvek:

-1 -1 -1
 0  0  0
 1  1  1
-1  0  1
-1  0  1
-1  0  1

Obrázek 15: Aplikace operátoru Prewittové na testovací fotografii.

Taktéž filtr založený na Sobelově operátoru je určen pro detekci vodorovných a svislých hran, ovšem je možné ho upravit i pro detekci hran diagonálních. Na výpisu konvolučních jader tohoto filtru si povšimněte, že se pomocí větší váhy zvýraznil vliv pixelů ležících v těsné blízkosti s pixelem právě zpracovávaným:

-1 -2 -1
 0  0  0
 1  2  1
-1  0  1
-2  0  2
-1  0  1

Obrázek 16: Aplikace Sobelova operátoru zvýrazňujícího vertikální hrany na testovací fotografii.

Velmi zajímavý i užitečný je filtr založený na Laplaceově operátoru (Laplaciánu). Tento filtr zvýrazňuje všechny hrany bez ohledu na jejich sklon, proto ho lze použít například při ostření obrazu (ne samozřejmě samostatně, ale v kombinaci s dalšími typy filtrů). Jednou vážnější nevýhodou tohoto filtru je jeho poměrně velká citlivost na šum a taktéž to, že hrany o šířce jednoho pixelu se po aplikaci tohoto filtru rozpadnou na dvojici hran mezi nimiž leží jednopixelová mezera. Konvoluční jádra tohoto filtru mohou být různá; jejich typický tvar je vypsán níže:

 0  1  0
 1 -4  1
 0  1  0
-1  2 -1
 2 -4  2
-1  2 -1

Obrázek 17: Aplikace Laplaceova operátoru na testovací fotografii.

7. Druhý demonstrační příklad – tvorba „vzorníku“ filtrů pro detekci hran a zaostření obrázku

Druhý demonstrační příklad se v mnohém podobá příkladu prvnímu. Taktéž se jedná o skript, po jehož spuštění se vytvoří „vzorník“ filtrů, přičemž každý filtr je aplikován na novou vrstvu. Povšimněte si především toho, že filtr využívající Sobelův operátor je představován samostatnou funkcí plug-in-sobel, zatímco ostatní filtry určené pro zvýrazňování hran v obraze se volají pomocí jediné funkce nazvané plug-in-edge, v níž je pomocí jednoho celočíselného parametru specifikován konkrétní typ filtru. Následuje výpis zdrojového kódu druhého demonstračního příkladu:

; Skriptování v GIMPu (4)
; Demonstrační příklad číslo 2
(define (script-fu-filter-samples2
                             selected-image
                             selected-layer)
  ; pomocná funkce která vytvoří kopii vybrané vrstvy
  (define (create-new-layer selected-layer)
    (car (gimp-layer-copy selected-layer FALSE))
  )
  (let* (
      ; vytvoření nových vrstev
      (new-layer-sobel   (create-new-layer selected-layer))
      (new-layer-sobel-h (create-new-layer selected-layer))
      (new-layer-sobel-v (create-new-layer selected-layer))
      (new-layer-roberts (create-new-layer selected-layer FALSE))
      (new-layer-prewitt (create-new-layer selected-layer FALSE))
      (new-layer-laplace (create-new-layer selected-layer FALSE))
    )
    ; pojmenování nově vytvořených vrstev
    (gimp-layer-set-name new-layer-sobel "Sobel filter in both directions")
    (gimp-layer-set-name new-layer-sobel-h "Sobel filter in horizontal direction")
    (gimp-layer-set-name new-layer-sobel-v "Sobel filter in vertical direction")
    (gimp-layer-set-name new-layer-roberts "Roberts filter")
    (gimp-layer-set-name new-layer-prewitt "Prewitt filter")
    (gimp-layer-set-name new-layer-laplace "Laplace filter")
    ; vrstvy je zapotřebí přidat do obrázku
    (gimp-image-add-layer selected-image new-layer-sobel 0)
    (gimp-image-add-layer selected-image new-layer-sobel-h 0)
    (gimp-image-add-layer selected-image new-layer-sobel-v 0)
    (gimp-image-add-layer selected-image new-layer-roberts 0)
    (gimp-image-add-layer selected-image new-layer-prewitt 0)
    (gimp-image-add-layer selected-image new-layer-laplace 0)
    ; aplikace filtrů na jednotlivé vrstvy
    (plug-in-sobel 1 selected-image new-layer-sobel   1 1 0)
    (plug-in-sobel 1 selected-image new-layer-sobel-h 1 0 0)
    (plug-in-sobel 1 selected-image new-layer-sobel-v 0 1 0)
    (plug-in-edge  1 selected-image new-layer-roberts 10 0 3)
    (plug-in-edge  1 selected-image new-layer-prewitt 10 0 1)
    (plug-in-edge  1 selected-image new-layer-laplace 10 0 5)
    ;                  ^     ^             ^          ^    ^
    ;                  |     |             |          |    +--- 0=Sobelův operátor
    ;                  |     |             |          |         1=operátor Prewittové
    ;                  |     |             |          |         3=operátor Robertsův
    ;                  |     |             |          |         5=operátor Laplaceův
    ;                  |     |             |          |
    ;                  |     |             |          +-------- parametry filtru
    ;                  |     |             |
    ;                  |     |             +------------------- identifikátor hladiny
    ;                  |     |
    ;                  |     +--------------------------------- identifikátor obrázku
    ;                  |
    ;                  +--------------------------------------- 1=neinteraktivní běh
    ;                                                           0=zobrazení dialogu
  )
  ; přinutíme GIMP, aby finální obrázek překreslil
  (gimp-displays-flush)
)
; základní informace o skriptu a definice dialogu
; zobrazeného uživateli
(script-fu-register
    "script-fu-filter-samples2"
    "Make samples of basic filters (2)"
    "Makes "
    "Pavel Tisnovsky"
    "Pavel Tisnovsky"
    "2010-05-25"
    "RGB*, GRAY*"
    SF-IMAGE    "Image"         0
    SF-DRAWABLE "Layer"         0)
; registrace skriptu do menu
(script-fu-menu-register "script-fu-filter-samples2"
                         "<Image>/Root.cz")
; finito

8. Třetí demonstrační příklad – interaktivní nastavení základních vlastností filtrů

Ve třetím demonstračním příkladu je ukázáno, jakým způsobem lze aplikovat větší množství filtrů na jeden rastrový obrázek (přesněji řečeno na jeho jednu hladinu). Po spuštění tohoto příkladu se zobrazí dialog, ve kterém je možné specifikovat, které filtry či jejich kombinace se mají na obrázek aplikovat. Na výběr je filtr provádějící rozmazání obrazu Blur, filtr pro detekci hran (Edge detection) a operace, která provede inverzi obrazu (jedná se o operaci implementovanou přímo v jádře grafického editoru). U rozmazávacího filtru a filtru detekujícího hrany lze navíc specifikovat jejich rozsah, tj. velikost konvoluční masky zadávanou v pixelech. Různé kombinace aplikovaných filtrů jsou zobrazeny na obrázcích 19, 20, 21 a 22. Každou operaci prováděnou skriptem je možné vrátit pomocí příkazu Undo nebo naopak zopakovat příkazem Redo. S využitím těchto dvou příkazů tak lze skriptem, přesněji řečeno grafickými operacemi prováděnými skriptem, „krokovat“.

Obrázek 18: Dialog zobrazený po spuštění třetího demonstračního příkladu.

Následuje výpis zdrojového kódu třetího demonstračního příkladu:

; Skriptování v GIMPu (4)
; Demonstrační příklad číslo 3
(define (script-fu-layers-and-filters
                             selected-image
                             selected-layer
                             blur-amount
                             edge-radius
                             apply-blur
                             apply-edge-filter
                             apply-inversion)
  (let* (
      ; vytvoření nové vrstvy
      (new-layer (car (gimp-layer-copy selected-layer FALSE))))
    ; pojmenování nově vytvořené vrstvy
    (gimp-layer-set-name new-layer "Nova hladina")
    ; vrstvu je zapotřebí přidat do obrázku
    (gimp-image-add-layer selected-image new-layer 0)
    ; aplikace prvního filtru - rozmazání obrázku
    (if (= apply-blur TRUE)
        (plug-in-gauss-rle 1 selected-image new-layer blur-amount 1 1))
    ; aplikace druhého filtru - detekce hran
    (if (= apply-edge-filter TRUE)
        (plug-in-edge TRUE selected-image new-layer edge-radius 0 0))
    ; inverze vrstvy
    (if (= apply-inversion TRUE)
        (gimp-invert new-layer))
  )
  ; přinutíme GIMP, aby finální obrázek překreslil
  (gimp-displays-flush)
)
; základní informace o skriptu a definice dialogu
; zobrazeného uživateli
(script-fu-register
    "script-fu-layers-and-filters"
    "Layers and filters"
    "Basic layers and filters manipulation"
    "Pavel Tisnovsky"
    "Pavel Tisnovsky"
    "2010-05-25"
    "RGB*, GRAY*"
    SF-IMAGE    "Image"         0
    SF-DRAWABLE "Layer"         0
    SF-VALUE    "Blur amount"  "5"
    SF-VALUE    "Edge radius"  "5"
    SF-TOGGLE   "Apply blur"   TRUE
    SF-TOGGLE   "Apply edge detection"  TRUE
    SF-TOGGLE   "Apply image inversion" TRUE
)
; registrace skriptu do menu
(script-fu-menu-register "script-fu-layers-and-filters"
                         "<Image>/Root.cz")
; finito

Obrázek 19: Použití filtru pro detekci hran a operace inverze obrazu.

Obrázek 20: Rozmazání obrazu a detekce hran.

CS24_early

Obrázek 21: Aplikace obou filtrů i inverze obrazu.

Obrázek 22: Změna parametrů obou filtrů.

9. Odkazy na Internetu

  1. Odstranění šumu
    http://cs.wiki­pedia.org/wiki/Od­stran%C4%9Bn%C3%AD_%C5%A­1umu
  2. Detekce hran
    http://cs.wiki­pedia.org/wiki/De­tekce_hran
  3. Konvoluce
    http://cs.wiki­pedia.org/wiki/Kon­voluce
  4. Starry sky
    http://www.td-e.com/soft/starry-sky.php
  5. A Script-Fu Tutorial
    http://www.li­nuxtopia.org/on­line_books/grap­hics_tools/gim­p_user_manual/en/gimp-using-script-fu-tutorial.html
  6. A Script-Fu Tutorial
    http://docs.gim­p.org/en/gimp-using-script-fu-tutorial.html
  7. Script-fu Tutorial
    http://www.se­ul.org/~grumbel/gim­p/script-fu/script-fu-tut.html
  8. Lambda calculus
    http://en.wiki­pedia.org/wiki/Lam­bda_calculus
  9. A Short Introduction to the Lambda Calculus
    http://www.cs­.bham.ac.uk/~ax­j/pub/papers/lam­bda-calculus.pdf
  10. A Tutorial Introduction to the Lambda Calculus
    http://www.inf.fu-berlin.de/leh­re/WS03/alpi/lam­bda.pdf
  11. (welcome '(schemers . org))
    http://www.sche­mers.org/
  12. Revised5 Report on the Algorithmic Language Scheme
    http://www.sche­mers.org/Docu­ments/Standar­ds/R5RS/
  13. The Revised6 Report on the Algorithmic Language Scheme
    http://www.r6rs­.org/
  14. Scheme
    http://groups­.csail.mit.edu/mac/pro­jects/scheme/
  15. The Kawa language framework
    http://www.gnu­.org/software/ka­wa/
  16. Scheme 48
    http://s48.org/
  17. Introductory textbooks for Schemers
    http://www.sche­mers.org/Docu­ments/#intro-texts
  18. Scheme (programming language)
    http://en.wiki­pedia.org/wiki/Sche­me_(programmin­g_language)
  19. Scheme
    http://cs.wiki­pedia.org/wiki/Sche­me
  20. Scheme-faq
    http://communi­ty.schemewiki­.org/?scheme-faq
  21. Scheme implementations
    http://communi­ty.schemewiki­.org/?scheme-faq-standards#imple­mentations
  22. Successful Scheme
    http://www.it­world.com/swol-1013-regex
  23. Guy L. Steele, Jr.
    http://en.wiki­pedia.org/wiki/Gu­y_L._Steele
  24. Gerald Jay Sussman
    http://en.wiki­pedia.org/wiki/Ge­rald_Jay_Sussman
  25. PLT Scheme
    http://www.plt-scheme.org/
  26. Quick: An Introduction to PLT Scheme with Pictures
    http://docs.plt-scheme.org/quick/
  27. PLT Scheme
    http://en.wiki­pedia.org/wiki/Plt_sche­me
  28. PLT Scheme Guide
    http://docs.plt-scheme.org/guide/
  29. The DrScheme Project: An Overview
    http://citese­erx.ist.psu.e­du/viewdoc/sum­mary?doi=10.1­.1.22.9543
  30. DrScheme
    http://en.wiki­pedia.org/wiki/DrSche­me
  31. How to Design Programs
    http://www.htdp­.org/
  32. An Introduction to Scheme
    http://www.ac­m.org/crossro­ads/xrds1–2/scheme.html

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.