Soroll impulsiu
Conceptes treballats
- Numpy
- PIL: Python Image Library
- Impulsive Noise
El soroll impulsiu (impulsive noise) és un tipus de soroll caracteritzat per pics d'alta intensitat que es produeixen de manera breu i sobtada. El soroll impulsiu aplicat a les imatges en color es manifesta com píxels amb valors anòmalament alts o baixos en una petita proporció de la imatge, creant punts brillants o foscos que es distribueixen de manera aleatòria.

Consell
Fer servir imatges menudes per a les proves, de 50x50 com a molt.
Exercici 1. Addició de soroll sintètic/artificial
Moltes vegades no podrem torbar dataset o dades reals per a treballar. En eixos casos hem de saber fabricar-les per a crear i provar els nostres programes. Aquest concepte s'anomena aumentació.
Fes un programa que reb com arguments un nom d'arxiu (imatge en color: png, bmp o similar) i un percentatge entre 1 i 40 (es recomana 5% per a les proves inicials). Aquest programa afegirà dit percentatge de soroll impulsiu a cada píxel de la imatge, seguint el següent algorisme:
- Obrirem la imatge amb PIL
- La transformem a un array de numpy
- Recorrem el array. Les vores no es tenen en consideració.
- Amb probabilitat p apliquem soroll o no de la següent manera:
- 10 % a tots 3 canals
- 30% al canal R
- 30% al canal G
- 30% al canal B
- Transformem la imatge contaminada a imatge PIL
- Guardem la imatge al disc amb el nom
nom_i_num.pngon nom és el nom original i num el valor de contaminació
Comprova (amb un comptador dels píxels que contamines i els càlculs adients) que el nombre de soroll afegit es correspon al nivell de soroll exigit (p).
Exercici 2. Detecció de soroll
Anem ara a detectar el soroll. Es demana fer un programa que rebrà el nom de la imatge contaminada, i altres paràmetres que estudiarem a continuació.
- m és la distancia (coloromètrica) a partir de la qual es considera que un píxel és proper a altre. Poden fer-se servir varies fórmules de distància. Per simplificar farem servir la L2 o Euclidea.
- w és el tamany de la finestra corredera (imparell, lo que serà 3x3 o 5x5, etc)
- k és el número de veïns propers
Per a fer-ho fixa't que no és més que detectar un element estrany entre altres normals.
Definició
Un píxel és considera no sorollós si dins d'una finestra w x w te almenys k veins a menys d'una distància m. Si no els trobem dits m veins, es considera sorollos

L'algorisme a implementar serà:
-
Creem una imatge de la mateixa dimensió de la imatge original, que serà una màscara. Aquesta màscara, un cop acabat el procés, indicarà si el píxel en certa posició és o no sorollòs:
-
Si el valor
i,jval0, vol dir que el píxeli,jés bo -
Si el valor
i,jval1, vol dir que els pixeli,jés soroll -
Recorrem tots els píxels de la imatge, convertida en array numpy. Les vores no es consideren.
- Sobre el píxel en consideració, construim una finestra W x W (per exemple 3x3) on el píxel avaluat és el central.
- Recorrem els 8 veins (en una 3x3) i anem calculant distàncies. En el moment que en tenim k veïns propers (a menys distància m), ja podem deduir que és un pixel bo.
- Si hem recorregut tots els veins i no arribem a m veins, el diagnostiquem com a soroll.
- Marquem el bit de la màscara a 1
En acabar guardarem la màscara al disc com a mascara_nom_imatge.png
Comprova (amb un comptador i els càlculs adients) la bondat de la detecció de soroll:
- Es correspon el nivell de soroll afegit amb el detectat
- Que pots fer per ajustar-ho?
Exercici 3. Filtratge
Ara es tracta de filtrar la imatge per a restaurar-la. Per a això necessitem la imatge sorollosa que hem generat així com la màscara de soroll detectada i el tamany de la finestra w.
Simplement per a cada píxel sorollos hem de substituir-lo per alguna aproximació entre els seus veins de la finestra W x W no sorollosos. La més senzilla és la mitjana aritmètica.
Altra opció millor, però més costosa és substituir-lo per aquell vei que minimitza la distància a la resta dels veins de la finestra. És a dir el millor element com a central.
- Carregar la imatge sorollosa i màscara de soroll.
- Iterem sobre tots els píxels de la imatge (les vores no conten)
- Si el pixel és net, passem al següent
- Si no, calculem la mitjana aritmètica dels pixels nets de la imatge.
- Reemplacem el central per aquesta mitjana, arrodonida a nombre enter
- Implementa una versió del MAE (Error Mitjà Absolut) i calcula'l entre la imatge filtrada i la imatge original.
- Guardar la imatge filtrada com a
nom_filtered.png