Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni47 pagine

Slides 04

Caricato da

nogik21947
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni47 pagine

Slides 04

Caricato da

nogik21947
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 47

Fondamenti di

Informatica
Introduzione ai concetti fondamentali

Copyright © 2021 Vincenzo Grassi ([email protected]) – Università degli studi di Roma “Tor Vergata”
Except where otherwise noted, this work is licensed under
http://creativecommons.org/licenses/by-nc-sa/4.0/
Applicare un “filtro” a un’immagine
• Creare l’effetto di un’immagine vista attraverso un
filtro
• un filtro di colore C fa passare solo le componenti
“vicine” a C, e trattiene le altre
• p.es., un filtro verde-azzurro
• fa passare immutate le componenti green e blue, e
riduce quella red

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 2
Algoritmo
• algoritmo : data un’immagine P
• riduci di un ammontare x% il valore di red nei colori di P
• ∀ pixel 𝑝 ∈ 𝑃:
• riduci del 50% il valore della componente red nel colore di p
1. ottieni il valore attuale della componente red del colore di p
2. calcola un nuovo valore ridotto del 50% rispetto al valore
attuale
3. modifica p assegnando alla componente red del suo colore il
nuovo valore calcolato

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 3
Algoritmo
• ∀ pixel 𝑝 ∈ 𝑃:
• riduci del 50% il valore della componente red nel colore
di p
1. ottieni il valore attuale della componente red del colore di p
2. calcola un nuovo valore ridotto del 50% rispetto al valore
attuale
3. modifica p assegnando alla componente red del suo colore il
nuovo valore calcolato

∀ pixel 𝑝 ∈ 𝑃 :
1. originalRed = getRed(p)
2. newRed = originalRed * 0.5
3. setRed(p, newRed)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 4
Algoritmo
?
 pixel pP :
1. originalRed = getRed(p)
2. newRed = originalRed * 0.5
3. setRed(p, newRed)

Pict : Pict :
allPix =
getPixels(P)

allPix : [ …]
allPix[0] allPix[1] allPix[2] …

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 5
Algoritmo
∀ pixel 𝑝 ∈ 𝑃 :
originalRed = getRed(p)
newRed = originalRed * 0.5
setRed(p, newRed)
allPix = getPixels(Pict)

originalRed = getRed(allPix[0])
newRed = originalRed * 0.5
setRed(allPix[0], newRed)
originalRed = getRed(allPix[1])
newRed = originalRed * 0.5
setRed(allPix[1], newRed)
originalRed = getRed(allPix[2])
newRed = originalRed * 0.5
setRed(allPix[2], newRed)
… Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
6
Roma “Tor Vergata”
Iterazione
• molti utili algoritmi richiedono di eseguire
ripetutamente un’azione
• un costrutto per esprimere questa ripetizione
(“iterazione”)
• il ciclo
• fate caso all’indentazione
for i in range(0, len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 7
Ingredienti
• la funzione range()
• il comando for
• … e la funzione len()

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 8
range
• range : ℕ → sequence_of_int
• range(k) genera la sequenza [0, 1, …, k-1]
• Default: start = 0, step = 1

• range :ℤ × ℤ → sequence_of_int
• range(h, k) genera la sequenza [h, h+1, …, k-1]
• Default: step = 1

• range :ℤ × ℤ × ℤ → sequence_of_int
• range(h, k, p) genera la sequenza [h, h+p, …, h+jp]
• dove j è il massimo intero tale che:
• h+jp < k, se p>0
• h+jp > k, se p<0
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 9
Attenzione!
• il valore finale non è mai incluso nella sequenza
generata: range(0, 10) termina con 9

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 10
La funzione len()
• se S è una sequenza
• len(S) restituisce la lunghezza di S

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 11
len + range
• se pict è il nome di un oggetto di tipo Picture
0 1 2 n-1
Pixel, Pixel,
Pixel, Pixel, Pixel,
color color
color color color
getPixels(pict) r=135
r=67 r=133
r=66 r=134 … r=66
g=131 g=114
g=114 g=114 g=114
b=105 b=46
b=46 b=45 b=46

len(getPixels(pict)) n

range(0, len(getPixels(pict))) [0, 1, 2, 3, . . . , n-1]

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 12
Sintassi
◼ sintassi: forindex in sequence:
block
for nome del comando
index variabile indice
in (parola del linguaggio Python)
sequence una “sequenza”
: due punti (“:”)
attenzione a non dimenticarli !
block : righe di codice, indentate rispetto a for

for i in range(0, len(allPix)):


originalRed =
getRed(allPix[i])
newRed = originalRed*0.5
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
13
Roma “Tor Vergata”
Il comando for
for i in range(0,len(allPix)):
sequenza generata
originalRed = getRed(allPix[i]) dalla funzione
newRed = originalRed*0.5 getPixels()
setRed(allPix[i], newRed)

associa a index il 1° valore


◼ semantica : in sequence

spesso, la
esegui block
variabile index
(il suo valore)
falso viene usata
associa a index il sequence
prossimo valore in all’interno del
terminata?
sequence blocco
vero
Copyright © 2021 Vincenzo Grassi

14
([email protected]) – Università degli studi di
Roma “Tor Vergata” 14
Step by Step
• Seguiamo passo passo il “percorso” dell’esecuzione
• Prendiamo tutti i pixel ...
for i in range(0,len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)

0 1 2
Pixel, Pixel, Pixel, pict
color color color getPixels()
r=135 r=133 r=134 …
g=131 g=114 g=114
b=105 b=46 b=45
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 15
allPix[0]
Step by Step
• Prendiamo il colore del pixel Prendiamo il valore di red del
pixel 0

for i in range(0,len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)

0 1 2
Pixel, Pixel, Pixel, pict
color color color getPixels()
r=135 r=133 r=134 …
g=131 g=114 g=114
b=105 b=46 b=45
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 16
allPix[0]
Step by Step
• Calcoliamo il filtro Modifichiamo il valore di red
del pixel 0 allo 0.5 (50%) di
originalRed

for i in range(0,len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)

0 1 2
Pixel, Pixel, Pixel, pict
color color color getPixels()
r=68 r=133 r=134 …
g=131 g=114 g=114
b=105 b=46 b=45
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 17
allPix[0]
Step by Step
• Modifichiamo il valore del pixel Modifichiamo il valore di red
del pixel 0

for i in range(0,len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)

0 1 2
Pixel, Pixel, Pixel, pict
color color color getPixels()
r=68 r=133 r=134 …
g=131 g=114 g=114
b=105 b=46 b=45
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 18
allPix[0]
Step by Step
• Passiamo al pixel 1 Prendiamo il valore di red del
pixel 1

for i in range(0,len(allPix)):
originalRed = getRed(allPix[i])
newRed = originalRed*0.5
setRed(allPix[i], newRed)

0 1 2
Pixel, Pixel, Pixel, pict
color color color getPixels()
r=135 r=133 r=134 …
g=131 g=114 g=114
b=105 b=46 b=45
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 19
allPix[1]
Stepping, Passeggiate
• Quanto fatto è una “passeggiata attraverso” (stepping,
walking through) il codice da eseguire
• Si esamina ogni passo (comando) nello stesso ordine in cui il
computer lo eseguirebbe
• Considerando che cosa succederebbe esattamente
• Annotando quale valore ha ogni variabile (nome) a ogni
passo.
• E’ un esempio di debugging
• una abilità che ognuno deve avere (ed esercitare)
• … ed esistono strumenti che facilitano la sua applicazione
(debugger)
• Python Tutor può essere considerato uno strumento di
questo tipo
• (torneremo su questo tema più avanti)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 20
Varianti
allPix = getPixels(pict)
for i in range(0, len(allPix)) :
originalRed = getRed(allPix[i])
newRed = originalRed * 0.5
setRed(allPix[i], newRed)

allPix = getPixels(pict)
for i in range(0, len(allPix)) :
originalRed = getRed(allPix[i])
setRed(allPix[i], originalRed * 0.5)

for i in range(0, len(getPixels(pict))) :


originalRed = getRed(getPixels(pict)[i])
setRed(getPixels(pict)[i], originalRed * 0.5)

for i in range(0, len(getPixels(pict))) :


setRed(getPixels(pict)[i], getRed(getPixels(pict)[i]) * 0.5)
All'opera

>>> file = pickAFile() # Search for file to pick


>>> pict = makePicture(file) # Load it in memory
>>> show(pict) # Show the picture
>>> allPix = getPixels(pict) # Put all pixels in a list
>>> for p in allPix: # For each of them
... original = getRed(p) # Get red
... setRed(p, original * 0.5) # …and update
...
>>> repaint(pict) # Refresh the picture window

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 22
E funziona sempre!

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 23
Riutilizzo del codice
• Per poter usare il nostro codice possiamo salvarlo
• Ma prima passeremo nella parte superiore di JES
• Statica! L'inferiore è invece volatile
• E costruiremo una nostra funzione
• Sintassi: decrease_red(): Picture →None

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 24
Blocchi annidati
• Che cosa succede se eseguiamo queste due
funzioni? ... provate…anzi no
def decreaseRed_1(pict):
# @param pict: Picture
allPix = getPixels(pict)
for i in range(0, len(allPix)):
originalRed = getRed(p)
setRed(p, originalRed * 0.5)
print pict

def decreaseRed_2(pict):
# @param pict: Picture
allPix = getPixels(pict)
for i in range(0, len(allPix)):
originalRed = getRed(p)
setRed(p, originalRed * 0.5)
print pict
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 25
Usiamola in questo modo
>>> file = "/ … /barbara.jpg"
>>> pict_1 = makePicture(file)
>>> show(pict_1)
>>> decreaseRed(pict_1)
>>> repaint(pict_1)

>>> file = "/ … /katie.jpg"


>>> pict_2 = makePicture(file)
>>> show(pict_2)
>>> decreaseRed(pict_2)
>>> repaint(pict_2)

parametri attuali
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 26
Versatilità

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 27
Altri problemi (filtri)
• creare un negativo
• passare da colore a b/n
• eliminare colore (blu, p.es.)
• effetto tramonto

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 28
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di 29
Roma “Tor Vergata” 29
Negativo
1. ottieni il colore attuale di p
2. calcola il “negativo” del colore attuale
3. modifica p assegnandogli come colore il negativo
calcolato
• Ma cos'è un negativo in fotografia?
• Dato un colore 𝑐 = 𝑟, 𝑔, 𝑏 in formato RGB il negativo è
definito da:
𝑛 = −𝑐 ≔ 255 − 𝑟, 255 − 𝑔, 255 − 𝑏
• ovviamente
−𝑛 = 255 − 255 − 𝑟 , 255 − 255 − 𝑔 , 255 − 255 − 𝑏 =𝑐

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 30
Let's do it

def negative(pict):
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_red = getRed(p)
original_green = getGreen(p)
original_blue = getBlue(p)
setRed(p, 255-original_red)
setGreen(p, 255-original_green)
setBlue(p, 255-original_blue)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 31
Short version
• Potete spiegarla?
• hint: white := makeColor(255, 255, 255)
def negative(pict):
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_color = getColor(p)
setColor(p, white-original_color)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 32
Greyscale
• Per il filtro greyscale saranno costruite 2 versioni:
• filtro mediano
1
𝑟+𝑔+𝑏 ,
3
1
𝑐= 𝑟+𝑔+𝑏 ,
3
1
𝑟+𝑔+𝑏
3
• filtro ottimizzato
0.299 ⋅ 𝑟 + 0.587 ⋅ 𝑔 + 0.114 ⋅ 𝑏,
𝑐 = 0.299 ⋅ 𝑟 + 0.587 ⋅ 𝑔 + 0.114 ⋅ 𝑏,
0.299 ⋅ 𝑟 + 0.587 ⋅ 𝑔 + 0.114 ⋅ 𝑏

• Qual è migliore? (Per me praticamente identici…)


Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 33
Greyscale
def greyscale_1(pict):
# Greyscale transformation
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for i in range(0, len(allPix)):
r = getRed(allPix[i])
g = getGreen(allPix[i])
b = getBlue(allPix[i])
grey = 0.299*r+0.587*g+0.114*b
new_col = makeColor(grey, grey, grey)
setColor(allPix[i], new_col)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 34
Greyscale
1 1 1
• Fate voi la versione , ,
3 3 3

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 35
Tramonto
• effetto tramonto: il paesaggio si tinge di rosso
• aumentare il “valore” di Red ?
• risultati non soddisfacenti (provate …)
• meglio replicare quanto avviene in natura
• maggiore filtraggio delle lunghezze d’onda lontane dal
rosso → riduzione di Green e Blue (aumento del peso
relativo di Red)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 36
Soluzione 1
def more_red(pict):
# Soluzione non adatta
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_red = getRed(p)
setRed(p, original_red*2)

def sunset(pict):
# Migliore soluzione
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_green = getGreen(p)
setGreen(p, original_green*0.7)
original_blue = getBlue(p)
setBlue(p, original_blue*0.7) 37
Osservazioni
• “Fare un tramonto” corrisponde a fare
reduce_green e reduce_blue.
• Successivo (e più semplice) problema:
• Come possiamo ridurre blue e green?
• reduce_green e reduce_blue risolvono questi
problemi
• Decomposizione gerarchica

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 38
Decomposizione gerarchica
def reduce_green():
# Riduce il verde di un 30%
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_green = getGreen(p)
setGreen(p, original_green*0.7)

def reduce_blue():
# Riduce il blue di un 30%
# @param pict: Picture
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_blue = getBlue(p)
setBlue(p, original_blue*0.7)
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 39
Decomposizione gerarchica

def sunset_2(pict):
# Nuova versine gerarchica
# @param pict: Picture
# @return: None
reduce_green(pict)
reduce_blue(pict)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 40
Decomposizione gerarchica
• Decomposizione gerarchica:
• Una cosa da risolvere
• Ridefinisci quella cosa in termini di cose più piccole
• Ripeti finchè opportuno
• Poi scrivi le cose più grandi in termini delle cose più
piccole.
• Tutto ciò è indifferente per il computer, ma:
• i programmi sono scritti anche per le persone, non solo
per i computer!
• Manutenzione del codice

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 41
Generalizzazione
• Generalizzare il filtro sunset
• Perché 0.7?
• È sempre il valore migliore indipendentemente
dall'immagine?
• Forse no!

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 42
Generalizzazione (nonsolo0.7)

def sunset_3(pict, level):


# @param pict: Picture
# @param level: float
# @return: None
allPix = getPixels(pict)
for p in allPix:
original_green = getGreen(p)
setGreen(p, original_green*level)
original_blue = getBlue(p)
setBlue(p, original_blue*level)

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 43
Generalizzazione

level = 0.0 level = 0.3 level = 0.6 level = 0.9

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 44
Salviamo il lavoro
• Se volete salvare il risultato:
• ricordate:
• writePictureTo : picture x string → none
• uso: Windows:
• writePictureTo(myPicture,"C:/.../mypicture.jpg")
• MacOS:
• writePictureTo(myPicture,"/.../mypicture.jpg")
• salva le immagini in formato JPEG
• Il nome del file deve terminare con “.jpg” !
• Il path deve essere completo
• Attenti agli spazi nel nomi delle cartelle e dei files!
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 45
Attività
• Supponiamo di avere 3 immagini di identiche
dimensioni
• base.jpg
• panorama.jpg
• foto.jpg
• L’immagine base ha una zona verde ed una zona bianca
• Creare una immagine finale.jpg
• In cui:
• Deve essere sostituita la zona verde con la corrispondente
parte dell’immagine foto.jpg
• Deve essere sostituita la zona bianca con la corrispondente
parte dell’immagine panorama.jpg
• Attenzione ai colori! Usare la funzione distance()
con varie soglie per trovare la migliore

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 46
Cosa abbiamo imparato
• Obiettivi di apprendimento
• generali
• approfondire il concetto di rappresentazione
• lavorare con oggetti bidimensionali (1a parte)
• iterazione
• blocchi annidati
• casi di studio
• rappresentazione di immagini in formato digitale
• manipolazione di immagini
• aumentare/diminuire intensità colori
• convertire da colore a b/n
• negare”

Copyright © 2021 Vincenzo Grassi


([email protected]) – Università degli studi di
Roma “Tor Vergata” 47

Potrebbero piacerti anche