Python >> Tutorial de Python >  >> Python

Filtro mediano de OpenCV

En esta demostración, aprenderemos qué es un filtro mediano y analizaremos dos tipos de filtros medianos en OpenCV. Luego, también aprenderemos cómo eliminar el ruido de sal y pimienta de una imagen con la ayuda de estos filtros medianos.

Eliminar el ruido de sal-y-pimienta de una imagen Con la ayuda del filtro mediano en OpenCV

Veamos el filtro mediano, que es excelente para eliminar el ruido, especialmente el tipo de ruido de sal y pimienta. Antes de saltar a una lección rápida sobre la mediana, todos sabemos que la media no es más que el promedio de todos los números y el ejemplo típico que usa la gente.

Por ejemplo, usted vive en un vecindario donde su casa oscila entre 350 000, 425 000, etc. Probablemente tenga un par de tipos ricos viviendo en su vecindario, en algún lugar de la colina, cuyas casas valen 2.2 millones, 3.2 millones, etc.

Suponga que mira la media de todos estos y ve 931 500, que lo sorprendió. Probablemente, usted pensaría que 931 500 es el precio promedio de una casa; por eso siempre miras la mediana de los precios de la vivienda.

Mire la mediana de estos valores; llega a 512 500, lo que representa el margen mejor que la media. Estas son las Estadísticas que probablemente aprendiste en quinto o sexto grado, y la razón por la que mencionamos esto es porque las mostraremos en esta imagen.

La imagen a continuación se agregó artificialmente con mucho ruido de sal y pimienta, y podemos ver muchos píxeles oscuros y brillantes. Si hacemos zoom, podemos ver esta región que se supone que es homogéneamente gris.

Premiere Pro - Cómo eliminar el ruido de fondo

¿Por qué aparecen estos ruidos de sal y pimienta? Por muchas razones, la principal fuente de ruido de sal y pimienta está ahí, especialmente en los dispositivos electrónicos más antiguos que usaste para capturar tus imágenes donde la conversión de analógico a digital tiene algunos problemas.

El desenfoque gaussiano está bien, pero no es bueno para limpiar este tipo de ruido y, técnicamente, el filtro mediano debería hacer un mejor trabajo. Si observa detenidamente, todos estos tienen un gris homogéneo, excepto este píxel que se muestra como un píxel brillante.

Si aplicamos un kernel de 3x3 y miramos el valor medio, estamos mirando todo lo que rodea a este píxel central. La mediana de todos estos números dentro de este cuadro rojo es 140.

Si sustituimos el 255 por el 140, obtenemos una imagen uniforme y homogénea muy bonita.

Esta es una representación gráfica pictórica rápida, así que pasemos al código de Python. Comenzaremos importando cv2 y median de skimage.filters para demostrar el uso de la mediana en ambos paquetes.

Estamos importando dos imágenes, una imagen para sal y pimienta y para cambiar su tamaño. Necesitamos usar medianBlur() método, pásele una imagen y establezca el tamaño del kernel en 3.

import cv2
from skimage.filters import median

SP_IMG = cv2.imread('inp.tif', 0)
IMG=cv2.resize(SP_IMG,(720,600))

IMG = IMG

Opencv_Median = cv2.medianBlur(IMG, 3)

Ahora, estamos usando la misma terminología. La skimage es muy similar, excepto que define su núcleo y usa algo que llamamos disco.

Necesitamos llamar a la median() método de skimage empaquetar y pasar una imagen. En lugar del tamaño del kernel, estamos creando un tamaño de disco.

Cuando imprimimos un disco, crea una matriz donde cero píxeles se multiplican por cero, y estos píxeles se multiplican por uno cuando se mueve sobre la imagen.

Ahora, pasamos el mode argumento. No es nada, pero ¿cómo lidiar con los píxeles finales cuando este núcleo llega al final de la imagen?

Como no hay nada a su derecha, agregará algunos píxeles con un valor constante.

Código de ejemplo:

import cv2
from skimage.filters import median

SP_IMG = cv2.imread('inp.tif', 0)
IMG=cv2.resize(SP_IMG,(720,600))

IMG = IMG

Opencv_Median = cv2.medianBlur(IMG, 3)

from skimage.morphology import disk
print(disk(3))

SK_Median = median(IMG, disk(3), mode='constant', cval=0.0)

cv2.imshow("Original", IMG)
cv2.imshow("cv2 median", Opencv_Median)
cv2.imshow("Using skimage median", SK_Median)

cv2.waitKey(0)
cv2.destroyAllWindows()

Tenemos tres salidas, y una es una imagen original con algo de ruido gaussiano.

La segunda salida es la imagen mediana usando OpenCV. En esta salida, el resultado es mejor que la imagen original.

Si miramos la siguiente salida usando skimage mediana, se ve muy limpia, sin nada de fondo.

Podemos observar que la skimage la mediana se ve incluso mejor que la mediana de OpenCV porque el tamaño del kernel es un poco más pequeño para esta mediana y no muy limpio en comparación con la imagen original. ¿Por qué no skimage y las imágenes de salida medianas de OpenCV tienen el mismo aspecto?

En la skimage mediana, definimos un tamaño de disco, y en la mediana de OpenCV, definimos un tamaño de kernel.

Los tamaños de los granos son diferentes; por lo tanto, las salidas se ven ligeramente diferentes. Las matemáticas serán las mismas si obtiene el mismo tamaño de kernel.


Publicación siguiente