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

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

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

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

Kreslíme do webu. Canvas

Úvod do počítačové grafiky

IB111 Úvod do programování skrze Python

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

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

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

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

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

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

13 Barvy a úpravy rastrového

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

Zdroj:

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

Projekt programu Inženýrská Informatika 2

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

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

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

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

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

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

IB111 Úvod do programování skrze Python

Geometrické transformace pomocí matic

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

INFORMATIKA. Grafické studio ve škole

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

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

Jazyk C# (seminář 9)

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

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

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

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

Reprodukce obrazových předloh

Základy zpracování obrazu

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

VY_32_INOVACE_INF.10. Grafika v IT

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

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

Prioritní fronta, halda

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

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

školení frontend CSS Preprocesory

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

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

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

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

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

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

IB112 Základy matematiky

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

BPC2E_C08 Parametrické 3D grafy v Matlabu

Digitální učební materiál

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

Kombinatorika, výpočty

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

Základy algoritmizace a programování

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

Vybrané kapitoly z matematiky

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

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

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

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

Algoritmizace a programová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.

Programování v jazyku LOGO - úvod

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

1 Webový server, instalace PHP a MySQL 13

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

KMI / TMA Tvorba mobilních aplikací

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

Reflections, refractions, interreflections

KTE / ZPE Informační technologie

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

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

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

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

1 Základní funkce pro zpracování obrazových dat

Kaskádové styly (CSS)

M M S. Značkovací jazyky

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

Počítačová grafika 1. Úvod do grafiky, základní pojmy. Rastrová grafika.

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

CZ 1.07/1.1.32/

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

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

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

Comenius Logo. Princip programování. Prostředí Comenius Logo

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

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

Osvědčené postupy pro zpracování tiskových dat s vynikající kvalitou tisku

Komplexní čísla, Kombinatorika, pravděpodobnost a statistika, Posloupnosti a řady

Vyhodnocení experimentálního měření kmitání vibrační třídičky pomocí optické metody

Projekt IMPLEMENTACE ŠVP. pořadí početních operací, dělitelnost, společný dělitel a násobek, základní početní operace

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

Obsah. 1. Změny rozměrů a rozlišení. Změna rozměrů v obrazových bodech pro webový výstup. 1. Změny rozměrů a rozlišení. 2. Pravítka, mřížky, vodítka

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

Zobrazovací jednotky a monitory

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

Transkript:

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

2 / 71

Úč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 / 71

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

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

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

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

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í 8 / 71

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 9 / 71

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) 10 / 71

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

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

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() 13 / 71

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() 14 / 71

Barevný kruh 15 / 71

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

Barevné kruhy 17 / 71

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

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

Geometrické obrazce 20 / 71

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

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

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() 22 / 71

Vzory II 23 / 71

Mandelbrotova množina 24 / 71

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

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

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/ 27 / 71

Úpravy obrázků 28 / 71

Úprava barev 29 / 71

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

Ú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() 30 / 71

Ú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)) 31 / 71

Zrcadlový obraz 32 / 71

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

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))) 33 / 71

Překlopení 34 / 71

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

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) 35 / 71

Rotace 36 / 71

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

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() 37 / 71

Rotace ilustrace height y width x height-y-1 x 38 / 71

Rotace o zadaný úhel 39 / 71

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

Kahoot def make_image1(a=150): im = Image.new("RGB", (a, a), (255, 255, 255)) for x in range(a): for y in range(a): if y*10 > (x-a/2)**2: im.putpixel((x, y), (0, 0, 0)) im.show() make_image1() 40 / 71

Kahoot def make_image2(a=160): im = Image.new("RGB", (a, a), (255, 255, 255)) for x in range(a): for y in range(a): if (x // 20 + y // 20) % 2 == 0: im.putpixel((x, y), (0, 0, 0)) im.show() make_image2() 41 / 71

Kahoot def transform(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)) g, b = int(g*0.8), int(b*0.8) r = min(int(r*1.4), 255) im.putpixel((x, y), (r, g, b)) im.show() 42 / 71

Kahoot transformace 43 / 71

Praktickáÿ aplikace - šifra 44 / 71

Histogram variace na téma frekvenční analýza 45 / 71

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í) 46 / 71

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 47 / 71

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

Pořádek (nejen) v umění 49 / 71

Pořádek v umění pixel po pixelu 50 / 71

Ř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 51 / 71

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() 52 / 71

Řazení pixelů 53 / 71

Ř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])) 54 / 71

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

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) 56 / 71

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> 57 / 71

Hvězda 58 / 71

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() 59 / 71

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() 60 / 71

Variace na hvězdu 61 / 71

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) 62 / 71

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

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

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

Implementace III def save(filename): f = open(filename, "w") f.write("<svg>") for x1, y1, x2, y2 in lines: f.write( <line x1=" + str(x1) + " y1=" + str(y1) " x2=" + str(x2) + " y2=" + str(y2) + " + \ style="stroke:black;stroke-width:1" /> ) f.write("</svg>") f.close() 66 / 71

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 lepší přes objektovou reprezentaci 67 / 71

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 68 / 71

Absolutní vs relativní vykreslování (souřadnice vs želva) 69 / 71

Jak vykreslíte tyto obrázky? 70 / 71

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