Sunteți pe pagina 1din 6

Filtros espaciales para eliminar elementos impulsivos de una

Imagen.
AUTOR: JORGE RÍOS.

En este documento se muestra el funcionamiento de el filtro de promediado o de mediana y el filtro de deteccion de bordes de
Prewitt para eliminacion de artefactos impulsivos o irregularidades en la intensidad lumínica de las imagenes digitales.

In [20]:

%matplotlib inline
import numpy as np
from numpy import random
from numpy.random import rand
import scipy
from scipy import signal
from scipy.signal import convolve2d
import skimage
from skimage import io, filters, color, util, morphology, data
from skimage.filters import median, prewitt
from skimage.util import img_as_ubyte
from skimage.morphology import disk
import matplotlib
from matplotlib import pyplot as plt

Procedemos a cargar la imagen objetivo.

In [21]:
Img = data.astronaut()
plt.figure(figsize=(5.2,5.2))
plt.imshow(Img)
Img.shape

Out[21]:
(512, 512, 3)

Eliminamos la profundidad de bits de la imagen, obteniendo una imagen en 2 dimensiones para evitar trabajar en 3 dimensiones.

In [22]:
gray = color.rgb2gray(Img)
plt.figure(figsize=(5.2,5.2))
plt.imshow(gray,cmap='gray')
gray.shape

Out[22]:

(512, 512)
(512, 512)

Cambiamos el formato de la imagen al formato de bytes sin signo para la implementacion de bucles iteradores.

In [23]:

img = img_as_ubyte(gray[::1])
img_out= img.copy()

In [24]:

print(type(img_out))
img_out

<class 'numpy.ndarray'>
Out[24]:

array([[149, 106, 62, ..., 121, 117, 120],


[172, 142, 115, ..., 119, 116, 116],
[195, 179, 166, ..., 121, 118, 116],
...,
[174, 174, 171, ..., 0, 0, 0],
[172, 170, 169, ..., 0, 1, 0],
[171, 169, 166, ..., 0, 1, 0]], dtype=uint8)

Esta funcion evita el sobredimensionamiento de la imagen, manteniendo los valores de intensidad de iluminacion entre los valores
máximos y mínimos de la imagen, los cuales son 255 y 0 respectivamente.

In [25]:

def limit_noise(img):
idx_up = img > 255
img[idx_up] = 255
idx_low = img < 0
img[idx_low] = 0
return img

In [26]:
def salt_pepper(image,prob):
'''
Add salt and pepper noise to image
prob: Probability of the noise
'''
output = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = np.random.rand()
int(rdn)
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
return output

Con la función para añadir ruido impulsivo tipo sal y pimienta en la imagen, establecemos una probabildad de que se reemplaze
un pixel de la imagen por un pixel con un valor de intesidad máximo o mínimo(0 - 255). La densidad de artefactos impulsivos sal y
pimienta mas acorde a lo pactado es del 2% de la imagen.

El ruido digital es la variación de manera aleatoria de la intensidad o color en una imagen digital. Las principales fuentes de ruido
surgen durante la adquisición y/o transmisión de las imágenes. [2]

In [27]:

#adding salt and pepper noise to the image


saltpeper = limit_noise(salt_pepper(img,0.02)) #probabilidad de pixel sal o pimienta (2%)
plt.figure(figsize=(7,7))
plt.imshow(saltpeper,cmap='gray')
Out[27]:
<matplotlib.image.AxesImage at 0x1eea0c95518>

El ruido impulsivo de tipo sal y pimienta tiene su nombre por la similitud que tienen los píxeles afectados por este a la sal blanca y
a la pimienta negra. Esto en imagenes digitales se traduce a valores máximos y mínimos de intensidad de los píxeles de forma
aleatoria. (255-0 ó 1-0).

In [28]:
dato1=np.max(saltpeper)
dato2=np.min(saltpeper)
print("valor máximo de pixel:", dato1)
print("valor mínimo de pixel:", dato2)

valor máximo de pixel: 255


valor mínimo de pixel: 0

El Filtro de promediado o de mediana, tiene su nombre debido a la tarea promediado de intensidad de pixeles que realiza. para
este filtro se ha diseñado una ventana de 3 colunmas x 3 filas, una vecindad para un pixel de alrededor de 16 pixeles en sus
cercanías.

In [29]:
img_outm = saltpeper.copy()
height = img_outm.shape[0]
width = img_outm.shape[1]
#margenes limite para el filtro -2<pixel=<2
for i in np.arange(2,height-2):
for j in np.arange(2,width-2):
neighbors = []
#tamaño de la ventana para el filtro 3rows x3 Columns
for k in np.arange(-2, 3):
for l in np.arange(-2, 3):
for l in np.arange(-2, 3):
a = saltpeper.item(i+k, j+l)
neighbors.append(a)
neighbors.sort()
#la cantidad de pixeles vecinos para el pixel a promediar vecindad = 16 x 16 pixeles
median = neighbors[16]
b = median
img_outm.itemset((i,j), b)

In [30]:
med = filters.median(img, disk(3))
fig, (median1, median2) = plt.subplots(ncols=2, figsize=(11, 11),sharex=True, sharey=True)
median1.imshow(img_outm,cmap='gray')
median2.imshow(med, cmap='gray')
Out[30]:
<matplotlib.image.AxesImage at 0x1eea0d24128>

Debido a limitaciones del algoritmo, el búcle iterador no ha promediado algunos pixeles en los bordes de la imagen filtrada. Por
otra parte, hemos obtenido la imagen practicamente identica a la imagen inicial sin el ruido de sal y pimienta adicionado.

Por ultimo usamos un detector de bordes para destacar los contornos de los bordes de las ilustraciones en la imagen. El detector
de bordes implementado esta basado en el operador de Judith M. S. Prewitt. Este método consiste en convolucionar la imagen
objetivo con 2 matrices de coeficientes establecidos los cuales calculan la magnitud y direccion del gradiente de intensidad de la
imagen. En consecuencia de esto solo se resaltan los contornos de las texturas ignorando el resto de propiedades disponibles en
la imagen.

Los operadores de Prewitt estan basados en la estimación del módulo del gradiente usando máscaras 3x3. Los dos operadores,
en la dirección del eje x y en la dirección del eje y son.[3]

El operador de Prewitt calcula una estimación gradiente de la función de intensidad de la imagen. En cada punto de la imagen, el
resultado del operador de Prewitt es el grado de direccion del gradiente correspondiente o la norma de este vector. [4]

In [36]:
Hx = np.array([[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]])
Hy = np.array([[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]])
img_x = convolve2d(img_outm, Hx, mode="same", boundary="symm")/ 6.0
img_y = convolve2d(img_outm, Hy, mode="same", boundary="symm")/ 6.0
img_out = np.sqrt(np.power(img_x, 2) + np.power(img_y, 2)) #Funcion magnitud del gradiente /norma del gradiente.[5]
img_out = (img_out / np.max(img_out)) * 255 #Direccion del gradiente en grados. [5]

La imagen en escala de grises filtrada para la deteccion de sus contornos, debe ser interpolada para su correcta visualización.

la interpolación aplica este mismo método para conseguir un tamaño mayor de la imagen inicial, rellenando la información que
falta con datos «inventados» a partir de un algoritmo específico. [1]

Interpolación bicúbica: Usada por programas como Adobe Photoshop o Paint Shop Pro es el método de interpolación considerado
estándar (promedia 16 pixeles adyacentes).[1]
In [37]:
plt.figure(figsize=(6,6))
plt.imshow(img_out, cmap = 'gray', interpolation = 'bicubic')
Out[37]:
<matplotlib.image.AxesImage at 0x1eea0471dd8>

In [33]:
imprewitt = filters.prewitt(img_outm)
plt.figure(figsize=(5.5,5.5))
plt.imshow(imprewitt ,cmap = 'gray', interpolation = 'bicubic')
plt.show()

Conclusiones.
los filtros de eliminacion de artefactos impulsivos nos permiten eliminar toda clase de irregularidades de intesidad lumínica en
todos los casos, inclusive en los casos cuando un filtro no basta para reparar la imagen. Es posible utilizar mas de un filtro
espacial para obtener los resultados deseados o para mejorar los obtenidos.

Referencias
[1]W. Org, "Interpolación (fotografía)", Es.wikipedia.org, 2019. [Online]. Available:
https://es.wikipedia.org/wiki/Interpolaci%C3%B3n_(fotograf%C3%ADa). [Accessed: 23- Jan- 2019].

[2]S. Pezonaga and J. Sanz Delgado, "Tratamiento de imágenes con ruido impulsivo mediante reglas difusas y algoritmos
genéticos", Pregrado., Universidad Pública de Navarra., 2015.
[3]"Filtros de realce", Www6.uniovi.es, 1995. [Online]. Available: http://www6.uniovi.es/vision/intro/node43.html. [Accessed: 23-
Jan- 2019].

[4]"Prewitt operator", En.wikipedia.org, 2019. [Online]. Available: https://en.wikipedia.org/wiki/Prewitt_operator. [Accessed: 23- Jan-
2019].

[5]"5 prewitt", YouTube, 2015. [Online]. Available: https://www.youtube.com/watch?v=avGb7cGDEjM. [Accessed: 23- Jan- 2019].

S-ar putea să vă placă și