Slides 04
Slides 04
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
∀ pixel 𝑝 ∈ 𝑃 :
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] …
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()
• 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
len(getPixels(pict)) n
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)
allPix = getPixels(pict)
for i in range(0, len(allPix)) :
originalRed = getRed(allPix[i])
setRed(allPix[i], originalRed * 0.5)
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)
parametri attuali
Copyright © 2021 Vincenzo Grassi
([email protected]) – Università degli studi di
Roma “Tor Vergata” 26
Versatilità
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)
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
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)