#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Nov 21 09:09:56 2019 @author: andrea """ def scala_di_grigi(img): "produce l'immagine in scala di grigi" grigia = [] for line in img: riga = [] for pixel in line: medio = sum(pixel)//3 riga.append((medio, medio, medio)) grigia.append(riga) return grigia def inversa(img): "produce il negativo della immagine" return [ [ (255-r, 255-g, 255-b) for r,g,b in riga ] for riga in img ] def riflessa_H(img): "riflette l'immagine rispetto ad una linea verticale" return [ list(reversed(riga)) for riga in img ] def riflessa_V(img): "riflette l'immagine rispetto ad una linea orizzontale" return list(reversed(img)) def trasposta(img): "riflette l'immagine rispetto alla diagonale principale" W = len(img[0]) H = len(img) return [ [ img[x][y] for x in range(H) ] for y in range(W) ] def ruota90dx(img): "produce una immagine ruotata a destra di 90°" W = len(img[0]) H = len(img) return [ [ img[H-x-1][y] for x in range(H) ] for y in range(W) ] def colore_medio(lista): "colore medio di una lista di pixel" N = len(lista) medio = [0, 0, 0] for colore in lista: for i in range(3): medio[i] += colore[i] for i in range(3): medio[i] = medio[i] // N return tuple(medio) def blur(img): """ ogni pixel della immagine di destinazione è la media dei pixel del suo vicinato (blocco 3x3 intorno al pixel) """ W = len(img[0]) H = len(img) risultato = [ [(0,0,0)]*W for _ in range(H) ] for y in range(H): ym = max(y-1,0) # minima coordinata y yM = min(y+2,H) # massima coordinata y for x in range(W): vicini = [] xm = max(x-1,0) # minima coordinata x xM = min(x+2,W) # massima coordinata x for xx in range(xm, xM): for yy in range(ym, yM): vicini.append(img[yy][xx]) risultato[y][x] = colore_medio(vicini) return risultato #ALTRIMENTI: gestire il bordo diversamente # per esercizio # contrasto (x-128)*k+128 def contrasto(img, k): "produce una immagine immagine con contrasto variato di k" def contrasto_1_canale(c, k): return max(0, min(round(128+(c-128)*k), 255)) return [ [ (contrasto_1_canale(r,k), contrasto_1_canale(g,k), contrasto_1_canale(b,k)) for r,g,b in riga ] for riga in img ] def filtro(img, funzione): return [ [ funzione(pixel) for pixel in riga ] for riga in img ] def grigio(pixel): medio = sum(pixel)//3 return medio, medio, medio def contrasto2(pixel): def contrasto_1_canale(c, k): return max(0, min(round(128+(c-128)*k), 255)) r, g, b = pixel return (contrasto_1_canale(r, 2), contrasto_1_canale(g, 2), contrasto_1_canale(b, 2)) # lente di ingrandimento/riduzione import math def lente(img, x0, y0, r, k): def pixel_lente(img, x, y, x0, y0, r, k): H = len(img) W = len(img[0]) D = math.sqrt((x-x0)**2 + (y-y0)**2) if D > r: return img[y][x] else: dx = x-x0 dy = y-y0 xx = round(x0 + k* dx) yy = round(y0 + k* dy) xx = min(xx, W-1) xx = max(xx, 0) yy = min(yy, H-1) yy = max(yy, 0) return img[yy][xx] return [ [ pixel_lente(img, x, y, x0, y0, r, k) for x,pixel in enumerate(riga) ] for y,riga in enumerate(img) ]