Filtro mediano de OpenCV

Salman Mehmood 13 junio 2022
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.

Elimine 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 demostraremos en esta imagen.

ejemplo 1 de filtro mediano de opencv

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.

¿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 usó para capturar sus imágenes donde la conversión de analógico a digital tiene algunos problemas.

ejemplo 2 de filtro mediano de opencv

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 son de un gris homogéneo, excepto este píxel que aparece 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 reemplazamos el 255 con 140, obtenemos una imagen uniforme y homogénea muy agradable.

ejemplo 3 de filtro mediano de opencv

Esta es una representación gráfica pictórica rápida, así que pasemos al código de Python. Comenzaremos importando cv2 y median desde 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 el método medianBlur(), pasarle una imagen y establecer 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. El skimage es muy similar, excepto que define su núcleo y usa algo que llamamos disco.

Necesitamos llamar al método median() del paquete skimage y pasar una imagen. En lugar del tamaño del núcleo, 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.

ejemplo 4 de filtro mediano de opencv

Ahora, pasamos el argumento mode. No es nada, pero ¿cómo lidiar con los píxeles finales cuando este kernel 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:

from skimage.morphology import disk
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)


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.

salida 1 del filtro mediano de opencv

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

salida 2 del filtro mediano opencv

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

salida de filtro mediano opencv 3

Podemos observar que la mediana de skimage 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é las imágenes de salida medianas de skimage y OpenCV no tienen el mismo aspecto?

En la mediana de skimage, 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.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python OpenCV