Obrázky (reprezentace, generování, úpravy) IB111 Úvod do programování skrze Python



Podobné dokumenty
Obrázky (reprezentace, generování, úpravy) IB111 Úvod do programování

Obrázky (reprezentace, generování, úpravy) IB111 Základy programování Radek Pelánek

IV122 Matematika a programování Úvod kurzu. Radek Pelánek

IB111 Úvod do programování skrze Python

Kreslíme do webu. Canvas

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Úvod do počítačové grafiky

Projekt programu Inženýrská Informatika 2

Zdroj:

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Zobrazování barev Josef Pelikán CGG MFF UK Praha.

Programy a algoritmy pracující s čísly. IB111 Úvod do programování

IB111 Úvod do programování skrze Python

13 Barvy a úpravy rastrového

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace a programování

DATOVÉ FORMÁTY GRAFIKY, JEJICH SPECIFIKA A MOŽNOSTI VYUŽITÍ

Informatika pro moderní fyziky (8) Javascript, CSS - stylování dokumentů, SVG - tvorba obrázků, složitější interaktivní dokument

Téma: Vektorová grafika. Určete pravdivost následujícího tvrzení: "Grafická data jsou u 2D vektorové grafiky uložena ve voxelech."

Hisab al-džebr val-muqabala ( Věda o redukci a vzájemném rušení ) Muhammada ibn Músá al-chvárizmího (790? - 850?, Chiva, Bagdád),

Základy zpracování obrazu

VY_32_INOVACE_INF.10. Grafika v IT

Základní ovládání a práce s programem CorelDraw 11

Základy graky. Jan Hamá ek. 13. zá í 2016

Jazyk C# (seminář 9)

Využití ICT techniky především v uměleckém vzdělávání. Akademie - VOŠ, Gymn. a SOŠUP Světlá nad Sázavou

Geometrické transformace pomocí matic

INFORMATIKA. Grafické studio ve škole

Počítačová grafika. OBSAH Grafické formy: Vektorová grafika Bitmapová (rastrová grafika) Barevné modely

Inovace bakalářského studijního oboru Aplikovaná chemie

POČÍTAČOVÁ GRAFIKA. Počítačová grafika 1

Využití programu GeoGebra v Matematické analýze

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Gymnázium Česká a Olympijských nadějí, České Budějovice, Česká 64, 37021

BPC2E_C08 Parametrické 3D grafy v Matlabu

Kaskádové styly (CSS)

M M S. Značkovací jazyky

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

Prioritní fronta, halda

On-line škola mladých autorů , pořadatel: ČVUT FEL. Jak na obrázky? Martin Žáček

Obsah. Předmluva 13. O autorovi 15. Poděkování 16. O odborných korektorech 17. Úvod 19

MBI - technologická realizace modelu

Zobrazovací jednotky a monitory

Počítačová grafika. Studijní text. Karel Novotný

Kartografická webová aplikace. Přednáška z předmětu Počítačová kartografie (KMA/POK) Otakar Čerba Západočeská univerzita

Synchronizace dvou pohybů - posuvného ve směru osy x a totačního kolem osy z. scena.pov. anim.ini #include colors.inc

Předmluva 9 Obsah knihy 9 Typografické konvence 10 Informace o autorovi 10 Poděkování 10

Počítačová grafika 1 (POGR 1)

Vstupní požadavky, doporučení a metodické pokyny

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Digitální učební materiál

. Grafika a plovoucí prostředí. Zpracování textů na počítači. Ing. Pavel Haluza, Ph.D. ústav informatiky PEF MENDELU v Brně haluza@mendelu.

Úloha 1. Text úlohy. Vyberte jednu z nabízených možností: NEPRAVDA. PRAVDA Úloha 2. Text úlohy

Slovo ALGEBRA pochází z arabského al-jabr, což znamená nahrazení. Toto slovo se objevilo v názvu knihy

Úvodem... 9 Kapitola 1 Karetních

Obsah. Úvod Barevná kompozice Světlo Chromatická teplota světla Vyvážení bílé barvy... 20

Mgr. Ladislav Zemánek Maturitní okruhy Matematika Obor reálných čísel

Objektově orientované programování v jazyce Python

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Grafika na počítači. Bc. Veronika Tomsová

Omezení barevného prostoru

Počítačové zpracování obrazu Projekt Učíme se navzájem

Kreslení elipsy Andrej Podzimek 22. prosince 2005

Semestrální práce Mozaika aneb Co všechno umí pan Voronoi

KTE / ZPE Informační technologie

Grafická prezentace projektu GNUškola

Úvod do Adobe Illustrator CS 5

Jak ovládat ručičku tachometru (ukazatel)?

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Reprodukce obrazových předloh

Projekt Obrázek strana 135

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

Zadání soutěžních úloh

Matematika. ochrana životního prostředí analytická chemie chemická technologie Forma vzdělávání:

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

IB112 Základy matematiky

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

CZ 1.07/1.1.32/

Téma: Práce se základními objekty, výplní a obrysem

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

Objektově orientované programování v jazyce Python

Lineární algebra s Matlabem. Přednáška 4

Barvy a barevné systémy Formáty obrázků pro WWW

Bottle -- příklad. Databáze. Testovací data. id Jedinečný identifikátor řádku: Bude typu INT s AUTO_INCREMENT a nastavíme ho jako primární klíč

Práce na počítači. Bc. Veronika Tomsová

Programování v jazyku LOGO - úvod

Počítačová grafika 2 (POGR2)

Cvičné texty ke státní maturitě z matematiky

Programování v Pythonu

1. Téma 03 - Rozhodování

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Inovace výuky prostřednictvím šablon pro SŠ

Matice se v některých publikacích uvádějí v hranatých závorkách, v jiných v kulatých závorkách. My se budeme držet zápisu s kulatými závorkami.

Transkript:

Obrázky (reprezentace, generování, úpravy) IB111 Úvod do programování skrze Python 2014 1 / 66

2 / 66

Účel přednášky procvičení základních konstrukcí z jiného pohledu propojení programování a matematiky téma reprezentace dat podklad pro zajímavé cvičení 3 / 66

Poznámka k efektivitě, obrázkům ukázky programů v přednášce: snaha o čitelnost programů neefektivní (pomalé): algoritmy technická realizace (např. putpixel vs load + pixel access object) nízká / rozličná kvalita obrázků čistě pragmatické důvody (nepříliš velké PDF), žádná skrytá pointa 4 / 66

Další zdroje, náměty obrázky, zvuk, video: kniha Introduction to Computing and Programming in Python, A Mutlimedia Approach, M. J. Guzdial, B. Ericson. http://coweb.cc.gatech.edu/mediacomp-teach 5 / 66

Reprezentace obrázků Bitmapová grafika Vektorová grafika (5,27) (25,27) (5,15) (5,3) (25,3) 6 / 66

Reprezentace barev více barevných modelů (aditivní, subtraktivní) budeme používat aditivní model RGB red, green, blue každá složka = hodnota 0-255 (8 bitů, 1 byte) barva = trojice, např. (15,255,100) 7 / 66

Knihovny (moduly) v Pythonu knihovna poskytuje rozšiřující funkcionalitu zdroje knihoven: standardní distribuce (např. math, turtle) separátní instalace (např. numpy) vlastní knihovny použití knihoven: import knihovna následná volání knihovna.funkce() import knihovna as nazev from knihovna import funkce from knihovna import * (nedoporučeno) 8 / 66

Knihovna Image knihovna pro práci s bitmapovými obrázky velmi bohatá funkcionalita použijeme jen základní operace: new vytvoření obrázku getpixel zjištění barvy bodu putpixel změna barvy bodu show, save zobrazení, uložení http://www.pythonware.com/products/pil/ 9 / 66

N-tice reprezentace souřadnic a barev pomocí n-tic (tuple) podobné jako seznamy, ale neměnitelné zápis pomocí kulaté závorky (místo hranatých) u obrázků typicky: souřadnice: (x,y) barva: (r,g,b) 10 / 66

Image demo def demo(): im = Image.new("RGB", (20,20), (255,255,255)) # model, velikost, barva pozadi im.putpixel((10,10), (0,0,0)) im.putpixel((8,7), (255,0,0)) im.putpixel((5,13), (100,255,105)) im.show() im.save("demo.png") 11 / 66

Geometrické útvary Napište programy pro generování následujících útvarů: čtverec trojúhelník kruh elipsa spirála 12 / 66

Kruh def kruh(a = 150, r = 50): im = Image.new("RGB", (a, a), (255,255,255)) for x in range(a): for y in range(a): if XXXXXX: im.putpixel((x,y), (0,0,0)) im.show() 13 / 66

Kruh def kruh(a = 150, r = 50): im = Image.new("RGB", (a, a), (255,255,255)) for x in range(a): for y in range(a): if (x-a/2)**2 + (y-a/2)**2 < r**2: im.putpixel((x,y), (0,0,0)) im.show() 14 / 66

Barevný kruh 15 / 66

Barevný kruh Barvu namícháme podle vzdálenosti od středu kruhu: d = math.sqrt((x-a/2)**2 + (y-a/2)**2) if d < r: c = int(255*d/r) im.putpixel((x,y), (c,0,255-c)) 16 / 66

Barevné kruhy 17 / 66

Přidání náhodného kruhu do obrázku def pridej_nahodny_kruh(im): (sirka, vyska) = im.size r = random.randint(8, min(sirka, vyska) / 6) sx = random.randint(r+1, sirka-r-1) sy = random.randint(r+1, vyska-r-1) barva = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) for x in range(sirka): for y in range(vyska): if (x-sx)**2 + (y-sy)**2 < r**2: im.putpixel((x,y), barva) 18 / 66

Námět na procvičení 19 / 66

Geometrické obrazce 20 / 66

Základní princip potřebujeme plynulý přechod mezi bílou a černou jakou matematickou funkci využijeme? 21 / 66

Základní princip potřebujeme plynulý přechod mezi bílou a černou jakou matematickou funkci využijeme? sinus hodnoty mezi -1 a 1, perioda 2π potřebujeme hodnoty mezi 0 a 255, perioda (např.) 20 21 / 66

Pruhy def pruhy(velikost = 150, pocet = 5): im = Image.new("RGB", (velikost, velikost)) for x in range(velikost): for y in range(velikost): z = math.sin(pocet * 2 * math.pi * x/velikost) odstin = int(255 * (z + 1) / 2) im.putpixel((x,y), (odstin, odstin, odstin)) im.show() 22 / 66

Vzory II 23 / 66

Mandelbrotova množina 24 / 66

Mandelbrotova množina z 1 = 0, c = x + yi je konstanta (komplexní číslo) definujeme posloupnost z n+1 = z 2 n + c c patří do Mandelbrotovy množiny tato posloupnost je omezená 25 / 66

Mandelbrotova množina detail Zdroj: Wikipedia Video zoom: http://www.youtube.com/watch?v=gew8xpb1ara 26 / 66

Mandelbrotova množina _ = ( 255, lambda V,B,c :c and Y(V*V+B,B, c -1)if(abs(V)<6)else ( 2+c-4*abs(V)**-0.4)/i ) ;v, x=1500,1000;c=range(v*x );import struct;p=struct.pack;m,\ j = <QIIHHHH,open( M.bmp, wb ).write for X in j( BM +P(M,v*x*3+26,26,12,v,x,1,24))or C: i,y=_;j(p( BBB,*(lambda T:(T*80+T**9 *i-950*t **99,T*70-880*T**18+701* T **9,T*i**(1-T**45*2)))(sum( [ Y(0,(A%3/3.+X%v+(X/v+ A/3/3.-x/2)/1j)*2.5 /x -2.7,i)**2 for \ A in C [:9]]) /9) ) ) http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/ 27 / 66

Úpravy obrázků 28 / 66

Úprava barev 29 / 66

Úprava barev pro každý pixel: zjisti barvu (getpixel) ulož upravenou barvu (putpixel) 29 / 66

Úprava barev kód def odstran_zelenou(nazev): im = Image.open(nazev) im.convert("rgb") sirka, vyska = im.size for x in range(sirka): for y in range(vyska): (r,g,b) = im.getpixel((x,y)) im.putpixel((x,y), (r, 0, b)) im.show() 30 / 66

Úprava barev obecnější řešení def uprav_barvy(nazev, f_uprava): im = Image.open(nazev) im.convert("rgb") sirka, vyska = im.size for x in range(sirka): for y in range(vyska): (r,g,b) = im.getpixel((x,y)) im.putpixel((x,y), f_uprava(r,g,b)) im.show() def inverze(r, g, b): return (255-r, 255-g, 255-b) uprav_barvy("les.jpg", inverze) uprav_barvy("les.jpg", lambda r,g,b: (255-r,b,g)) 31 / 66

Zrcadlový obraz 32 / 66

Zrcadlový obraz pro každý pixel v levé polovině: zjisti jeho barvu (getpixel) ulož barvu na příslušnou pozici v pravé polovině (putpixel) 32 / 66

Zrcadlový obraz kód for x in range(sirka / 2): for y in range(vyska): im.putpixel((sirka-1-x,y), im.getpixel((x,y))) 33 / 66

Překlopení 34 / 66

Překlopení prohazování symetrických bodů 34 / 66

Překlopení kód V předchozím kódu (zrcadlový obraz) změníme tělo for cyklu: tmp = im.getpixel((sirka-1-x,y)) im.putpixel((sirka-1-x,y), im.getpixel((x,y))) im.putpixel((x,y), tmp) 35 / 66

Rotace 36 / 66

Rotace vytvoř nový obrázek a naplň jej pixely podle originálu vhodně pozměněné souřadnice 36 / 66

Rotace kód s cenzurou def rotace(nazev): im = Image.open(nazev) im.convert("rgb") sirka, vyska = im.size novy = Image.new("RGB", (vyska, sirka)) for x in range(sirka): for y in range(vyska): novy.putpixel((xxx, XXX), im.getpixel((x,y))) novy.show() 37 / 66

Rotace ilustrace výška y šířka x výška-y-1 x 38 / 66

Rotace o zadaný úhel 39 / 66

Rotace o zadaný úhel goniometrické funkce, lineární transformace, matice aplikace (procvičení) pojmů z matematiky 39 / 66

Histogram variace na téma frekvenční analýza 40 / 66

Histogram textový výpis 0-19: 0.3 % 20-39: 3.5 % 40-59: 6.3 % 60-79: 8.3 % 80-99: 12.7 % 100-119: 17.1 % 120-139: 18.5 % 140-159: 15.2 % 160-179: 9.0 % 180-199: 4.0 % 200-219: 1.8 % 220-239: 1.1 % 240-259: 2.2 % (implementace doporučené cvičení) 41 / 66

Další náměty na úpravy změna velikosti obrázku převod do stupňů šedi rozmazání (blur), detekce hran... další věci co umí váš grafický program 42 / 66

Pořádek v umění http://www.ted.com/talks/ursus_wehrli_tidies_up_art.html 43 / 66

Pořádek (nejen) v umění 44 / 66

Pořádek v umění pixel po pixelu 45 / 66

Řazení pixelů podle barvy vytvoříme seznam všech použitých barev seznam trojic [ (0, 150, 20), (255,255,255), (0, 0, 255),... ] seznam seřadíme barvy umístíme do obrázku 46 / 66

def uklid(nazev): im = Image.open(nazev) im.convert("rgb") sirka, vyska = im.size pixely = [] for y in range(vyska): for x in range(sirka): pixely.append(im.getpixel((x,y))) pixely.sort() novy = Image.new("RGB", (sirka, vyska)) for y in range(vyska): for x in range(sirka): novy.putpixel((x,y), pixely[y*sirka+x]) novy.show() 47 / 66

Řazení pixelů 48 / 66

Řazení pixelů pixely je seznam trojic (r, g, b) sort() používá lexikografické řazení pokud chceme řazení dle součtu (intenzity) nahradíme pixely.sort() za: pixely = sorted(pixely, key=lambda (r,g,b):-(r+g+b)) 49 / 66

Pořádek v umění náměty Zkuste další způsoby řazení: po řádcích / sloupcích po čtverečcích podle jiného kritéria gradient po uhlopříčce 50 / 66

Skrývačky v bitmapové grafice 51 / 66

Scalable Vector Graphics (SVG) vektorový formát založený na XML snadný způsob vytváření obrázků v jakémkoliv jazyce (generujeme prostý text) prohlížení: např. webový prohlížeč ruční editování: např. Inkscape převod na bitmapu: např. convert (ImageMagick) 52 / 66

SVG příklad <svg xmlns="http://www.w3.org/2000/svg"> <line x1="15" y1="20" x2="30" y2="80" stroke="black" stroke-width="1"/> <circle cx="130" cy="50" r="30" stroke="blue" stroke-width="2" fill="green" /> <polyline fill="none" stroke="red" stroke-width="4" points="160,20 180,30 200,10 234,80"/> </svg> 53 / 66

Hvězda 54 / 66

def hvezda(n = 10, delka = 100): svg_hlavicka() stred_x = delka * 1.5 stred_y = delka * 1.5 krok = delka / n for i in range(n + 1): svg_usecka(stred_x + i*krok, stred_y, stred_x, stred_y + (n-i)*krok) svg_usecka(stred_x - i*krok, stred_y, stred_x, stred_y + (n-i)*krok) svg_usecka(stred_x + i*krok, stred_y, stred_x, stred_y - (n-i)*krok) svg_usecka(stred_x - i*krok, stred_y, stred_x, stred_y - (n-i)*krok) svg_paticka() 55 / 66

Kompaktnější zápis def hvezda(n = 10, delka = 100): svg_hlavicka() stred_x = delka * 1.5 stred_y = delka * 1.5 krok = delka / n for i in range(n + 1): for dx, dy in [(-1,-1), (-1,1), (1,-1), (1,1)]: svg_usecka(stred_x + dx*i*krok, stred_y, stred_x, stred_y + dy*(n-i)*krok) svg_paticka() 56 / 66

Variace na hvězdu 57 / 66

Vlastní knihovna pro želví grafiku želví grafika používána knihovna turtle vytvořme vlastní knihovnu s vykreslováním do SVG jen základní příkazy: forward(length) left(angle), right(angle) save(filename) 58 / 66

Princip implementace stav želvy: souřadnice x,y a aktuální natočení heading vykreslený obrazec: seznam souřadnic 59 / 66

Implementace I x = 50 y = 50 heading = 0 lines = [] def left(angle): global heading heading -= angle def right(angle): global heading heading += angle 60 / 66

Implementace II def forward(d): global x global y nx = x + d * math.cos(heading * math.pi / 180) ny = y + d * math.sin(heading * math.pi / 180) lines.append((x, y, nx, ny)) x, y = nx, ny 61 / 66

Implementace III def save(filename): f = open(filename, "w") f.write("""<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/graphics/svg/1.1/dtd/svg11.dtd"> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">""") for x1, y1, x2, y2 in lines: f.write( <line x1=" + x1 + " y1=" + y1 +\ " x2=" + x2 + " y2=" + y2 + " +\ style="stroke:black;stroke-width:1" /> ) f.write("\n</svg>") f.close() 62 / 66

Poznámky jde o názornou ukázku principů, nikoliv dobrou knihovnu: příliš malá funkcionalita chybí dokumentace nevhodné použití globálních proměnných vhodné pro objektovou reprezentaci 63 / 66

class Turtle: def init (self): self.x = 50 self.y = 50 self.heading = 0 self.lines = [] def left(self, angle): self.heading -= angle def right(self, angle): self.heading += angle def forward(self, d): nx = self.x + d * math.cos(self.heading * math.pi / 180 ny = self.y + d * math.sin(self.heading * math.pi / 180 self.lines.append((self.x, self.y, nx, ny)) self.x, self.y = nx, ny 64 / 66

Absolutní vs relativní vykreslování (souřadnice vs želva) 65 / 66

Shrnutí ukázka elementární práce s grafikou bitmapová Image, putpixel, getpixel vektorová SVG, line využití základních konstrukcí (vesměs vnořené for cykly) 66 / 66