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

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

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

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

IB111 Úvod do programování skrze Python

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

Úvod do počítačové grafiky

Kreslíme do webu. Canvas

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

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

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

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

Zdroj:

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

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

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

13 Barvy a úpravy rastrového

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

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

Projekt programu Inženýrská Informatika 2

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

IB111 Úvod do programování skrze Python

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

VY_32_INOVACE_INF.10. Grafika v IT

PB001: Úvod do informačních technologíı

Prioritní fronta, halda

Úvodem... 9 Kapitola 1 Karetních

Geometrické transformace pomocí matic

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

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

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),

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

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

školení frontend CSS Preprocesory

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

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

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

INFORMATIKA. Grafické studio ve škole

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

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

Jazyk C# (seminář 9)

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

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

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

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

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

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

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Reprodukce obrazových předloh

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

BPC2E_C08 Parametrické 3D grafy v Matlabu

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

Základy zpracování obrazu

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

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

VYUŽITÍ POČÍTAČOVÉ GRAFIKY

Pracovní text a úkoly ke cvičením MF002

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

Základy algoritmizace a programování

DTP1. (příprava textu pomocí počítače) Kapitola 3 / Obrázky a rastrování

. 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.

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

Programování v jazyku LOGO - úvod

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

Barvy a barevné modely. Počítačová grafika

Algoritmus pro generování normálních magických čtverců

Kreslení elipsy Andrej Podzimek 22. prosince 2005

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

DTP1. (příprava textu pomocí počítače) Petr Lobaz,

Digitální grafika. Digitální obraz je reprezentace dvojrozměrného obrazu, který používá binární soustavu (jedničky a nuly).

Paměť počítače. alg2 1

IB112 Základy matematiky

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

Rekurze. IB111 Úvod do programování skrze Python

Digitální učební materiál

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

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

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

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

IB111 Základy programování Radek Pelánek

MBI - technologická realizace modelu

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

Vybrané kapitoly z matematiky

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

Rastrový obraz Barevný prostor a paleta Zmenšení barevného prostoru Základní rastrové formáty

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

MINISTERSTVO ŠKOLSTVÍ, MLÁDEŽE A TĚLOVÝCHOVY. Učební osnova předmětu MATEMATIKA. pro studijní obory SOŠ a SOU (8 10 hodin týdně celkem)

KMI / TMA Tvorba mobilních aplikací

Knihovna CanvasLib TXV první vydání prosinec 2014 změny vyhrazeny

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

KTE / ZPE Informační technologie

Gymnázium Jiřího Ortena, Kutná Hora

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

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

Základy informatiky. 10 Počítačová grafika

MATURITNÍ TÉMATA Z MATEMATIKY

1 Webový server, instalace PHP a MySQL 13

Kombinatorika, výpočty

Omezení barevného prostoru

Transkript:

Obrázky (reprezentace, generování, úpravy) IB111 Úvod do programování 2016 1 / 67

2 / 67

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

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 / 67

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 / 67

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

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 / 67

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 / 67

Proč nepoužívat import * from X import * V malém programu nemusí vadit, ale ve větších projektech považováno za velmi špatnou praxi. nepořádek v jmenném prostoru kolize, přepis překlepy se mohou chovat magicky složitější interpretace chybových hlášek Python Zen: Explicit is better than implicit. 9 / 67

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 open, convert otevření obrázku, konverze na RGB mód getpixel zjištění barvy bodu putpixel změna barvy bodu size velikost obrázku show, save zobrazení, uložení 10 / 67

Knihovna Image technické poznámky Python Imaging Library (PIL): jen pro Python 2 http://www.pythonware.com/products/pil/ implementace Pillow (i pro Python 3): https://pypi.python.org/pypi/pillow/2.1.0 from PIL import Image 11 / 67

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

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") 13 / 67

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

Kruh def disc(a = 150, r = 50): im = Image.new("RGB", (a, a), (255, 255, 255)) for x in range(a): for y in range(a): if XXX: im.putpixel((x, y), (0, 0, 0)) im.show() 15 / 67

Kruh def disc(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() 16 / 67

Barevný kruh 17 / 67

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)) 18 / 67

Barevné kruhy 19 / 67

Přidání náhodného kruhu do obrázku def add_random_disc(im): (width, height) = im.size r = random.randint(8, min(width, height) // 6) sx = random.randint(r+1, width-r-1) sy = random.randint(r+1, height-r-1) color = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) for x in range(width): for y in range(height): if (x-sx)**2 + (y-sy)**2 < r**2: im.putpixel((x,y), color) 20 / 67

Námět na procvičení 21 / 67

Geometrické obrazce 22 / 67

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

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 23 / 67

Pruhy def strips(size = 150, count = 5): im = Image.new("RGB", (size, size)) for x in range(size): for y in range(size): z = math.sin(count * 2 * math.pi * x/size) shade = int(255 * (z + 1) / 2) im.putpixel((x,y), (shade, shade, shade)) im.show() 24 / 67

Vzory II 25 / 67

Mandelbrotova množina 26 / 67

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á 27 / 67

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

Mandelbrotova množina kód _ = ( 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/ 29 / 67

Úpravy obrázků 30 / 67

Úprava barev 31 / 67

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

Úprava barev kód def remove_green(filename): im = Image.open(filename) im = im.convert("rgb") width, height = im.size for x in range(width): for y in range(height): (r, g, b) = im.getpixel((x, y)) im.putpixel((x, y), (r, 0, b)) im.show() 32 / 67

Úprava barev obecnější řešení def transform_colors(filename, f_trans): im = Image.open(filename) im = im.convert("rgb") width, height = im.size for x in range(width): for y in range(height): (r,g,b) = im.getpixel((x,y)) im.putpixel((x,y), f_trans(r,g,b)) im.show() def inversion(r, g, b): return (255-r, 255-g, 255-b) transform_colors("les.jpg", inversion) transform_colors("les.jpg", \ lambda r, g, b: (255-r, b, g)) 33 / 67

Zrcadlový obraz 34 / 67

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

Zrcadlový obraz kód for x in range(width / 2): for y in range(height): im.putpixel((width-1-x,y), im.getpixel((x,y))) 35 / 67

Překlopení 36 / 67

Překlopení prohazování symetrických bodů 36 / 67

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

Rotace 38 / 67

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

Rotace kód s cenzurou def rotation(filename): im = Image.open(filename) im = im.convert("rgb") width, height = im.size new_im = Image.new("RGB", (height, width)) for x in range(width): for y in range(height): new_im.putpixel((xxx, YYY), im.getpixel((x,y))) new_im.show() 39 / 67

Rotace ilustrace height y width x height-y-1 x 40 / 67

Rotace o zadaný úhel 41 / 67

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

Histogram variace na téma frekvenční analýza 42 / 67

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í) 43 / 67

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 44 / 67

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

Pořádek (nejen) v umění 46 / 67

Pořádek v umění pixel po pixelu 47 / 67

Ř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 48 / 67

def tidy_up(filename): im = Image.open(filename) im = im.convert("rgb") width, height = im.size pixels = [] for x in range(width): for y in range(height): pixels.append(im.getpixel((x, y))) pixels.sort() new_im = Image.new("RGB", (width, height)) for y in range(height): for x in range(width): new_im.putpixel((x, y), pixels[y*width+x]) new_im.show() 49 / 67

Řazení pixelů 50 / 67

Řazení pixelů pixely je seznam trojic (r, g, b) sort() používá lexikografické řazení pokud chceme řazení dle součtu (intenzity) nahradíme pixels.sort() za: pixels = sorted(pixels,\ key = lambda c: -(c[0]+c[1]+c[2])) 51 / 67

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 52 / 67

Skrývačky v bitmapové grafice 53 / 67

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) 54 / 67

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> 55 / 67

Hvězda 56 / 67

def star(n = 10, length = 100): svg_header() center_x = length * 1.5 center_y = length * 1.5 step = length / n for i in range(n + 1): svg_line(center_x + i*step, center_y, center_x, center_y + (n-i)*step) svg_line(center_x - i*step, center_y, center_x, center_y + (n-i)*step) svg_line(center_x + i*step, center_y, center_x, center_y - (n-i)*step) svg_line(center_x - i*step, center_y, center_x, center_y - (n-i)*step) svg_finish() 57 / 67

Kompaktnější zápis def star(n = 10, length = 100): svg_header() center_x = length * 1.5 center_y = length * 1.5 step = length / n for i in range(n + 1): for dx, dy in [(-1,-1), (-1,1), (1,-1), (1,1)]: svg_line(center_x + dx*i*step, center_y, center_x, center_y + dy*(n-i)*step) svg_finish() 58 / 67

Variace na hvězdu 59 / 67

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) 60 / 67

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

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

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 63 / 67

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 64 / 67

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 65 / 67

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

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), trocha matematiky 67 / 67