Giter Club home page Giter Club logo

convolution's Introduction

Základní informace

Název: Konvoluce 2

Obrázek:

Result

Datum vydání: 26. 10. 19

Doba vývoje: 14 dní

Programovací jazyk: C

Program: GIMP 2.8

Operační systém: Linux Debian (64-bit)

Vývojové prostředí: obraz virtuálního počítače pro testování semestrálních úloh z předmětu BI-PA2 spuštěný ve Virtual Boxu

Popis

Konvoluce 2 je plug-in, který umožňuje upravovat 2D obrázky pomocí konvoluce. Nabízí až 5 základních filtrů – Sharpen (zaostření), Gaussian Blur (rozostření), Box Blur (rozmazání), Edge Detection (detekce hran) a Emboss (reliéf).

Pro filtry Sharpen, Gaussian Blur a Box Blur je navíc k dispozici volba radiusu – hodnoty, která udává sílu daného filtru. Filtr Edge Detection je možné použít ve třech různých variantách.

Specialitou tohoto plug-inu je poslední možnost ve výběru filtrů – Customize. Tato možnost zobrazí matici, která uživateli umožňuje vytvářet mnohem více konvolučních filtrů a neomezuje jej tak na filtry v nabídce. Společně s maticí je k dispozici i přednastavení čtyř základních filtrů. Uživatelem nastavená matice se zachovává do dalších instancí plug-inu. Náhled reaguje na každou změnu jejích hodnot.

Customize

Filtry

Pro ukázky filtrů v této dokumentaci jsem zvolil obrázek Lenny.

Lenna

Sharpen

Radius: 1–3

Základní matice:

-1 -1 -1
-1 9 -1
-1 -1 -1

Popisek: Zaostřuje obrázek. Pro radius 1 je výsledek přijatelný, u vyššího radiusu však dochází k deformaci obrázku.

Sharpen 1
Sharpen 2
Sharpen 3

Gaussian Blur

Radius: 1–2

Základní matice:

1 2 1
2 4 2
1 2 1

Popisek: Hladce rozostřuje obrázek. Rozdíl lze rozpoznat až u vyššího radiusu (to platí speciálně pro velké obrázky).

Gaussian Blur 1
Gaussian Blur 2

Box Blur

Radius: 1–3

Základní matice:

1 1 1
1 1 1
1 1 1

Popisek: Výrazně rozmazává obrázek. Podobně jako u filtru Gaussian Blur lze rozdíl rozpoznat až u vyššího radiusu.

Box Blur 1
Box Blur 2
Box Blur 3

Edge Detection 1–3

Základní matice:

1 0 -1
0 0 0
-1 0 1

0 1 0
1 -4 1
0 1 0

-1 -1 -1
-1 8 -1
-1 -1 -1

Popisek: Vyhledává hrany ve třech možných variantách.

Edge Detection 1
Edge Detection 2
Edge Detection 3

Emboss

Základní matice:

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

Popisek: Vytváří reliéf.

Emboss

Instalace (Linux)

  1. Otevřete terminál.

  2. Pomocí příkazu echo $HOME zjistěte vaši domovskou složku.

  3. Do této složky vložte ručně soubor convolution-2.c a přesuňte se do ní pomocí příkazu cd $HOME.

  4. Zadejte následující příkazy:

    • sudo apt update

      • aktualizuje všechny nainstalované balíčky

    • sudo apt install gimp

      • nainstaluje GIMP

    • sudo apt install libgimp2.0-dev

      • nainstaluje balíček pro práci s plug-iny

    • gimptool-2.0 --install convolution-2.c

      • zkompiluje a nainstaluje plug-in

    • gimp

      • spustí GIMP

  5. Otevřete v GIMPu nějaký obrázek.

  6. Běžte do záložky „Filters/Misc“ a klikněte na „Convolution 2…“, čímž spustíte plug-in.

Program

Kód plug-inu je rozdělen do několika částí:

  • Načtení plug-inu

  • Algoritmus konvoluce

  • Posluchače událostí

  • GUI

Načtení plug-inu zahrnuje import všech důležitých knihoven, funkční prototypy, strukturu pro zachování uživatelem nastavených hodnot, proměnnou PLUG_IN_INFO, MAIN a funkce query pro registraci a run pro spuštění samotného plug-inu.

Jako ukázku této části kódu jsem zvolil funkci query, která zaregistruje plug-in do Procedural Database (tzv. PDB) a hlavního menu:

Loading

Algoritmus konvoluce funguje na velice jednoduchém principu. Pro každý pixel v obrázku je proveden součet barevných hodnot jeho sousedů a jeho samotného. Každý sčítanec je navíc vynásoben odpovídající hodnotou z konvoluční matice. Čím větší je tato matice, tím je zpracováno více sousedních pixelů. Algoritmus tak může být pomalejší, ale výsledek je o to výraznější. Velikost konvoluční matice určuje radius podle rovnice: velikost_matice = 2 * hodnota_radiusu + 1. Po získání součtu sčítanců pronásobených hodnotami konvoluční matice je tato hodnota vydělena normalizátorem (tj. součet hodnot konvoluční matice), který slouží pro usměrnění výsledku. Takto znormalizovaný výsledek následně uložíme do právě zpracovávaného pixelu. Díky tomuto principu můžeme dosáhnout mnoha rozličných grafických úprav, které se liší pouze v hodnotách konvoluční matice.

Problém nastává na okrajích obrázku, kde pixely nemusí mít nutně na všech stranách sousedy. Tato situace je v pluginu řešena zrcadlově. Pokud se algoritmus při zpracování sousedů dostane mimo obrázek, je započítán osově souměrný pixel atp.

Jako ukázku této části kódu jsem zvolil alokaci paměti pro 2D pole pixelů:

Convolution

Posluchače událostí slouží k odposlouchávání akcí, které uživatel provede v rámci GUI. Odposlouchávána jsou všechna tlačítka včetně volby radiusu, položek v seznamu atd.

Jako ukázku této části kódu jsem zvolil posluchač, který zobrazí matici s přednastavením poté, co uživatel klikne na položku Customize… ve výběru filtrů. V případě ostatních položek zmíněné prvky skryje.

Listeners

GUI zajišťuje grafické uživatelské rozhraní celého plug-inu. Jelikož je kód prvků GUI v programovacím jazyce C značně expanzivní, tato část společně s posluchači událostí tvoří více než polovinu celého kódu plug-inu.

Jako ukázka poslouží kód náhledu, který uživateli umožňuje prohlédnout si aplikaci zvoleného filtru na výřezu obrázku o velikosti 250 x 250 px.

GUI

Testování

Plug-in je kompatibilní s GIMPem 2.8 na operačním systému Linux Debian. K testování plug-inu a všech filtrů jsem použil čtyři obrázky – Lenna (512 x 512 px), logo (704 x 933 px), 4K, 8K.

Lenna
Logo
4K
8K

Na obrazu virtuálního počítače pro testování semestrálních úloh z předmětu BI-PA2 spuštěném ve Virtual Boxu plug-in pracoval bez problémů pro Lennu, logo a 4K obrázek. U 8K obrázku se objevovaly problémy v podobě nedostatečné paměti, kterou se GIMPu nepodařilo alokovat. Plug-in se vždy spustil nejvýše jednou (podobně jako všechny ostatní filtry v GIMPu). Z tohoto důvodu jsem do plug-inu přidal jednoduché kontroly, které uživatele omezují na použití nejvýše 4K obrázku:

Testing

Na školním počítači však fungovaly všechny testované obrázky včetně 8K bez problému.

convolution's People

Contributors

karelvrabeckv avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.