- strokeCap sarebbe il rounded per le linee
- strokeJoin sarebbe il rounded per gli angoli dei quadrati (Default: MITER, BEVEL e ROUND)
- stroke(0,255,0); colore dei bordi a verde
- fill(0,0,255); colore del riempimento blu
- noFill(); reimposta il riempimento
- dist() ritorna la distanza tra due punti dati
- arc(x,y,dimX,dimY, PI_start, PI_end)
- color c = color(255,255,0); variabile di tipi colore (il colore specificato è il giallo)
| Angolo (Radianti) | Posizione p5.js / Processing |
|---|---|
| Ore 3 (Destra) | |
HALF_PI () | Ore 6 (Basso) |
PI () | Ore 9 (Sinistra) |
TWO_PI () | Ore 3 (Giro completo) |
- line(xStart,yStart,yStart, yEnd)
- text(“A1”,185,50); scrive A1 nelle coordinate date
- mouseX,mouseY coordinate di dove si trova il mouse
- bezier(x1, y1, x2, y2, x3, y3, x4, y4);
Per visualizzare come funziona, immagina che la curva sia un elastico teso tra il primo e l’ultimo punto, mentre i punti centrali agiscono come magneti.
- Punto 1 (x1, y1): Punto di ancoraggio iniziale. La curva parte esattamente da qui.
- Punto 2 (x2, y2): Primo punto di controllo. Determina la direzione e la “forza” della curvatura iniziale.
- Punto 3 (x3, y3): Secondo punto di controllo. Determina come la curva si raccorda verso la fine.
- Punto 4 (x4, y4): Punto di ancoraggio finale. La curva termina esattamente qui.
- void mousePressed(){} azione dopo un click
- mousePressed variabile d’ambiente che ci indica se il mouse è cliccato
- void keyPressed(){} azioni dopo un click di un tasto della tastiera
- key variabile d’ambiente che ci indica quale tasto è stato cliccato (case-sensitive)
- ellipse crea un ellisse
- rect crea un rettangolo rect(x,y, width, heigth)
- lerp(50,100,0.1): funzione che calcola la distanza tra due punti con uno specifico incremento percentuale (terzo parametro):
- 0.1: quasi vicino allo start
- 0.5: a metà
- Per fare la scia di un qualcosa:
void draw(){
fill(0,25);
rect(0,0,width,height);
x = lerp(x,mouseX, 0.1);
y = lerp(y,mouseY, 0.1);
fill(255);
ellipse(x,y,60,60);
}- Per far muovere verso una direzione piuttosto che un’altra usare: con dir che diventa l’opposto quando si arriva ai bordi
- translate(width/2, height/2); questo comando trasla quello che vediamo della canvas, in pratica shifta l’origine di width/2 e height/2 (in questo caso)
- rotate(TWO_PI) ruota la canvas rispetto all’origine (in questo caso specifico lo fa ogni 10 secondi)
- map(10, 0, width, 20, 250); mappa il primo range in un range più grande
- constrain(valore, min, max) mappa il valore ad un range dato
- scale(scale); scalta rispetto al parametro passato
- PushMatrix e PopMatrix quando vogliamo utilizzare translate/rotate in un punto rispetto a qualcosa e in altro punto ripetto a qualcos’altro dobbiamo usare questi due comandi
pushMatrix(); //Inizio blocco 1
translate(width/2, height/2);
fill(255,0,0);
ellipse(0,0, 15, 15);
rotate(random(255));
drawRainbowRect();
popMatrix(); //Fine blocco 1
pushMatrix();//Inizio blocco 2
translate(width/2+200,height/2+200);
rotate(millis()*0.001*PI);
ellipse(0,50,15,15);
popMatrix(); //Fine blocco 2- PImage: tipo variabile img
- PImage I = createImage(dim,dim, spazio di colore): crea un immagine usando lo spazio di colore specificato (RGB sempre)
- PImage I = loadImage(“lena.png”): carica l’immagine lena.png dalla cartella data che si trova insieme allo script
- I.loadPixels(): carica i pixel della nostra immagine dentro l’array I.pixels per trovare un pixel data la sua posizione nella canvas facciamo in questo modo:
int pos(int x, int y, int w){
return x+y*w;
}- I.set(x,y,c): setta il colore c nelle coordinate date
- I.get(x,y): prende il colore
- red(), blue(), green(): per dividere le componenti in modo da poter agire in modo diverso per ognuna di queste dobbiamo usare queste funzioni, che ritornano il valore di quella componente nel valore passato
- image(I,0,0); : inserisce l’img I dentro la canvas in posizione 0,0
- Creazione classe:
class Square {
float posX;
Square(float tempPosX){
posX = tempPosX;
}
void display(){...}
}- Estensione di una classe
class ColorSquare extends Square{
color c;
ColorSquare(float tempPosX, color tempColor){
super(tempPosX);
c = tempoColor;
}
void display(){
fill(color)
...
}
}- ArrayList Template: molte volte ci verra chiesto di creare una lista di oggetti con classi padre e figlie, si fa in questo modo:
ArrayList<Square> SquareList = new ArrayList<Square>(); // lo tipizziamo con la classe padre
for (Square sq : SquareList) {
sq.display();
}Vari filtri
Tutti i filtri presentati di seguito devono essere implementati rispetto ad ogni componente di colore
- Negativo:
- Logartimo: con
- Gamma: con
- Quantizzazione (su un singolo componente di colore se non riechiesto):
- Mediano: scorri l’img in input e per ogni pixel prendi il suo intorno chiami sort e prendi il valore in mezzo
- Massimo: scorri l’img in input e per ogni pixel prendi il suo intorno chiami max e rimpiazzi il valore
- Minimo: scorri l’img in input e per ogni pixel prendi il suo intorno chiami min e rimpiazzi il valore
PImage mediano(PImage I, int N) {
PImage R = createImage(I.width, I.height, RGB);
int offset = N/2;
float[] v = new float[N*N];
for (int i = 0; i < I.width; i++) {
for (int j = 0; j < I.height; j++) {
int count = 0;
for (int x = -offset; x < offset; x++) {
for (int y = -offset; y < offset; y++) {
v[count] = I.get(i+x, y+j);
count++;
}
}
sort(v);
R.set(i, j, int(v[(v.length/2)-1]));
}
}
return R;
}- Laplace, Nbox3, Sharpening: anche se teoricamente li da lui di seguito i kernel di questi 3 filtri
float[][] nbox3 = {{n3, n3, n3}, {n3, n3, n3}, {n3, n3, n3}};
float[][] lapl = {{-1, 0, -1}, {0, 4, 0}, {-1, 0, -1}};
float[][] sharp = {{-1, 0, -1}, {0, 5, 0}, {-1, 0, -1}};Possibili richieste
- Bitplane: un immagine composta dall’iesimo bit
...
int bit = (val>>nb)&1; // shifto val di nb posizioni e prendo solo l'ultimo
...- Replication: crei un immagine 2 volte più grande e per ogni valore della prima ne crei 4 nella nuova
- MSE:
- PSNR:
- Stretching: cerco il minimo e massimo tra tutti i colori dell’img poi scorro di nuovo l’array per normalizzare i valori usando la seguente formula:
float min = 255;
float max = 0;
R.pixels[i] = color(255*(red(R.pixels[i])-min)/(max-min));- Equalizzazione: Richiamo la funzione istogramma (punto sotto), calcolo la somma cumulativa tra i campi () poi faccio la seguente cosa:
for(int i = 0; i < R.pixels.length; i++){
R.pixels[i] = color(255*H[int(red(R.pixels[i]))]);
}- Istogramma: faccio un array H di 256 posti e conto quanti pixel di ogni specifico colore ci sono, poi divido ogni valore di H lo divido per il numero totale di pixel
- Funzione visualizzaIstogrammi(): ci permette di visualizzare gli istogrammi alla fine della pagina:
// H1, H2 e H3 sono array risultanti dalla chiamata a istogramma() con le varie img
rectMode(CORNERS);
noStroke();
fill(255, 255, 0);
for (int i=0; i<256; i++) {
rect(i*2, height-(H1[i]*25600), i*2+2, height);
rect(512+i*2, height-(H2[i]*25600), 512+i*2+2, height);
rect(1024+i*2, height-(H3[i]*25600), 1024+i*2+2, height);
}- Convoluzione: prende in input: Pimage e la matrice del kernel:
- scorro tutto l’img con due for
- scorro il kernel con due for
- mantengo una somma parziale necessaria a questa cosa:
int value = I.get(i-N/2+x, j-M/2+y); //N e M dimensioni kernel
res = res + red(value)*K[x][y];
}
}
R[i][j] = res;
}
}
return R;- Converti: quando usiamo la convoluzione per riportare la nostra matrice in forma di immagine dovremmo usare questa funzione:
PImage convertiToImg(float[][] req) {
PImage R = createImage(req[0].length, req.length, RGB);
for (int i = 0; i < R.width; i++) {
for (int j = 0; j < R.height; j++) {
color c = color(constrain(req[i][j], 0, 255));
R.set(i, j, c);
}
}
return R;
}Cose da vedere
- Le implicaizoni delle classi
- Altri filtri
- Fare gli esami vecchi
- capire che cosa è la quantizzazzione e implementarla
- Convoluzione
- Equalizzazione
- Stretching+
- WA11
- WA12
- WA13
- WA14
- WA15
- WA16
- WA17
- WA18