Salta el contingut

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.

Impulsive noise

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:

  1. Obrirem la imatge amb PIL
  2. La transformem a un array de numpy
  3. Recorrem el array. Les vores no es tenen en consideració.
  4. Amb probabilitat p apliquem soroll o no de la següent manera:
    1. 10 % a tots 3 canals
    2. 30% al canal R
    3. 30% al canal G
    4. 30% al canal B
  5. Transformem la imatge contaminada a imatge PIL
  6. Guardem la imatge al disc amb el nom nom_i_num.png on 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

sliding Windows

L'algorisme a implementar serà:

  1. 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:

  2. Si el valor i,j val 0, vol dir que el píxel i,j és bo

  3. Si el valor i,j val 1, vol dir que els pixel i,j és soroll

  4. Recorrem tots els píxels de la imatge, convertida en array numpy. Les vores no es consideren.

  5. Sobre el píxel en consideració, construim una finestra W x W (per exemple 3x3) on el píxel avaluat és el central.
  6. 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.
  7. Si hem recorregut tots els veins i no arribem a m veins, el diagnostiquem com a soroll.
  8. 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.

  1. Carregar la imatge sorollosa i màscara de soroll.
  2. Iterem sobre tots els píxels de la imatge (les vores no conten)
  3. Si el pixel és net, passem al següent
  4. Si no, calculem la mitjana aritmètica dels pixels nets de la imatge.
  5. Reemplacem el central per aquesta mitjana, arrodonida a nombre enter
  6. Implementa una versió del MAE (Error Mitjà Absolut) i calcula'l entre la imatge filtrada i la imatge original.
  7. Guardar la imatge filtrada com a nom_filtered.png