#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Nov 9 23:47:42 2020 @author: andrea """ # colori red = (255, 0, 0) blu = (0, 0, 255) green = (0, 255, 0) black = (0, 0, 0) white = (255, 255, 255) # immagine # nuova immagine def nuova_immagine_iterativa(w, h, c=black): img = [] for y in range(h): riga = [] for x in range(w): riga.append(c) img.append(riga) return img def nuova_immagine_sbagliata(w, h, c=black): "attenzione la immagine ha tanti riferimenti alla stessa riga" return [ [ c ]*w ] * h def nuova_immagine_giusta(w, h, c=black): img = [] for y in range(h): img.append([ c ]*w) return img def nuova_immagine(w, h, c=black): "usando la list comprehension" return [ [c]*w for y in range(h) ] def line_h(img, x, y, l, c ): img[y][x:x+l] = [c]*l def line_v(img, x, y, l, c ): for Y in range(y,y+l): img[Y][x] = c # rettangoli def rettangolo(img, x, y, w, h, c): line_h(img, x, y, w, c ) line_h(img, x, y+h, w, c ) line_v(img, x, y, h, c ) line_v(img, x+w, y, h, c ) def filled_rectangle(img, x, y, w, h, c): for Y in range(y, y+h): line_h(img, x, Y, w, c ) def flip_v(img): h = len(img) nuova = [] for y in range(h-1,-1,-1): nuova.append(img[y].copy()) return nuova def flip_h(img): nuova = [] for linea in img: nuova.append(list(reversed(linea))) return nuova def rotate_90(img): h = len(img) w = len(img[0]) H, W = w, h # scambio altezza e larghezza nuova = [] for Y in range(H): riga = [] for X in range(W): riga.append(img[X][H-1-Y]) nuova.append(riga) return nuova def negativo(img): def opposto(c): R, G, B = c return 255-R, 255-G, 255-B return [ [ opposto(c) for c in linea ] for linea in img ] def grigio(img): def media(c): g = sum(c)//3 return g, g, g return [ [ media(c) for c in linea ] for linea in img ] def luminosita(img, k): "attenzione, k è disponibile a tutte le funzioni interne a luninosita" def bound(componente): return min(max(int(componente),0), 255) def lumi(c): R, G, B = c return bound(R*k), bound(G*k), bound(B*k) return [ [ lumi(c) for c in linea ] for linea in img ] def contrasto(img, k): "attenzione, k è disponibile a tutte le funzioni interne a luninosita" def bound(componente): return min(max(int(componente),0), 255) def contr(c): R, G, B = c return bound((R-128)*k+128), bound((G-128)*k+128), bound((B-128)*k+128) return [ [ contr(c) for c in linea ] for linea in img ] # per calcolare una immagine blurred # creiamo una immagine nuova # per ciascun pixel a coordinate x,y della immagine di destinazione # calcolo la media dei k*k che lo circondano def blur(img, k=1): h = len(img) w = len(img[0]) def media(x,y): "nota, posso usare img,h,w perchè sono dentro alla funziona blur" colore = [0,0,0] quanti = 0 for X in range(x-k, x+k+1): if X >= w or X < 0 : continue for Y in range(y-k, y+k+1): if Y >= h or Y < 0 : continue quanti += 1 # calcolo per ciascun canale la somma delle luminosità for i,canale in enumerate(img[Y][X]): colore[i] += canale R, G, B = colore return R//quanti, G//quanti, B//quanti # valori medi interi nuova = [] for y in range(h): riga = [] for x in range(w): riga.append(media(x,y)) nuova.append(riga) return nuova # filled # flip V reverse img # flip H reverse lines # transpose x<->y # rotate # filtri # - gray sum(R,G,B)//3 # - luminosità X*k # - contrasto (X-128)*k+128 # - blur average over near pixels # - negativo 255-X # filtri passati come argomento # - solo sul pixel # - anche sull'immagine # - con parametri