[OpenCV-Python] 16 suavizado de imágenes

OpenCV-Python: Procesamiento de imágenes IV en OpenCV

16 Suavizado de imagen

Objetivos
  • Aprender a usar diferentes filtros de paso bajo para desenfocar imágenes
  • Usar filtros personalizados para convolucionar imágenes (convolución 2D)

Convolución 2D
  Al igual que las señales unidimensionales, también podemos implementar filtrado de paso bajo (LPF), filtrado de paso alto (HPF), etc. en imágenes 2D. LPF nos ayuda a eliminar el ruido y las imágenes borrosas. HPF nos ayuda a encontrar el borde de la imagen
La función cv.filter2D () proporcionada por OpenCV nos permite realizar operaciones de convolución en una imagen. A continuación, usaremos un filtro de promediado en una imagen. El siguiente es un kernel de filtro promedio de 5x5: la
      K = \ frac {1} {25} \ begin {bmatrix} 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ end {bmatrix}
operación es la siguiente: coloque el kernel en un píxel A de la imagen, encuentre la suma de 25 (5x5) píxeles en la imagen correspondiente al kernel, y luego tome el promedio y reemplace con este promedio El valor del píxel A. Repita la operación anterior hasta que se actualice cada valor de píxel de la imagen. El código es el siguiente, ejecútelo.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_logo.png')

kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)

plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

resultado:

Desenfoque de imagen (suavizado de imagen)
Utilice un filtro de paso bajo para lograr el propósito de desenfoque de imagen. Esto es muy útil para eliminar el ruido. De hecho, es para eliminar los componentes de alta frecuencia (como: ruido, borde) en la imagen. Entonces el borde se verá un poco borroso. (Por supuesto, existen algunas técnicas de difuminado que no difuminarán los límites). OpenCV proporciona cuatro técnicas de desenfoque.

16.1 Promedio

Esto se realiza mediante una caja de convolución normalizada. Simplemente usa el valor promedio de todos los píxeles en el área cubierta por el cuadro de convolución para reemplazar el elemento central. Puede utilizar las funciones cv2.blur () y cv2.boxFilter () para realizar esta tarea. También puede ver la documentación para obtener más detalles sobre el cuadro de convolución. Necesitamos establecer el ancho y la altura del cuadro de convolución. El siguiente es un cuadro de convolución normalizado de 3x3:
      K = \ frac {1} {9} \ begin {bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \ end {bmatrix}
Nota: Si no desea utilizar un cuadro de convolución normalizado, debe usar cv2.boxFilter () y luego pasar el parámetro normalize = False.
El siguiente es el mismo ejemplo que la primera parte:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_logo.png')

blur = cv2.blur(img,(5,5))

plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

resultado:

difuminar

16.2 Desenfoque gaussiano

Ahora reemplace el kernel de convolución con un kernel gaussiano (en términos simples, el cuadro permanece sin cambios, el valor original de cada cuadro es igual y el valor interior ahora está de acuerdo con la distribución gaussiana, el centro del cuadro tiene el valor más grande , y el resto La caja disminuye según la distancia desde el elemento central para formar una bolsa colina gaussiana. El promedio original ahora es un promedio ponderado, que es todo el valor en la caja). La función implementada es cv2.GaussianBlur (). Necesitamos especificar el ancho y alto del kernel gaussiano (debe ser un número impar). Y la desviación estándar de la función gaussiana a lo largo de las direcciones X e Y. Si solo especificamos la desviación estándar en la dirección X, la dirección Y también tomará el mismo valor. Si ambas desviaciones estándar son 0, entonces la función se calculará a sí misma de acuerdo con el tamaño de la función del kernel. El filtrado gaussiano puede eliminar eficazmente el ruido gaussiano de la imagen.
Si lo desea, también puede usar la función cv2.getGaussianKernel () para construir un kernel gaussiano usted mismo.
Si desea utilizar el desenfoque gaussiano, el código anterior debe escribirse como:

#0 是指根据窗口大小( 5,5 )来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)

resultado:

Desenfoque gaussiano

16.3 Desenfoque medio

Como su nombre lo indica, el valor mediano del píxel correspondiente al cuadro de convolución se utiliza para reemplazar el valor del píxel central. Este filtro se utiliza a menudo para eliminar el ruido de la sal y la pimienta. Los filtros anteriores usan un nuevo valor calculado para reemplazar el valor del píxel central, mientras que el filtro mediano lo reemplaza con el valor alrededor del píxel central (o él mismo). Puede eliminar eficazmente el ruido. El tamaño del núcleo de convolución también debe ser un número impar.
En este ejemplo, agregamos un 50% de ruido a la imagen original y luego usamos el desenfoque medio.
Código:

median = cv2.medianBlur(img,5)
# 运行有问题,出不了如下结果,下图为照搬的

resultado:

Desenfoque medio

16.4 Filtrado bilateral

La función cv2.bilateralFilter () puede eliminar el ruido de forma eficaz mientras se mantiene despejado el límite. Sin embargo, esta operación es más lenta que otros filtros. Ya sabemos que el filtro gaussiano es encontrar el promedio ponderado gaussiano de los píxeles en la vecindad del punto central. Este filtro gaussiano solo considera la relación espacial entre píxeles, pero no considera la relación entre los valores de los píxeles (similitud de píxeles). Por lo tanto, este método no considera si un píxel está ubicado en el límite. Por lo tanto, el límite no se difuminará, y esto no es lo que queremos. El filtrado bilateral utiliza pesos gaussianos espaciales y pesos gaussianos de similitud de valores grises. La función espacial gaussiana asegura que solo los píxeles del área vecina tengan influencia en el punto central, y la función gaussiana de similitud del valor gris asegura que solo el valor gris del píxel central sea similar al que se utilizará para la operación de desenfoque. Por lo tanto, este método garantizará que el borde no se vea borroso, porque el valor de gris en el borde tiene un cambio relativamente grande.
El código para el filtrado bilateral es el siguiente:

#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)
# 运行有问题,出不了如下结果,下图为照搬的  

Resultado:
Míralo, la textura de la imagen de arriba está borrosa, pero el borde sigue ahí.

Filtrado bilateral

Para obtener más información, preste atención a la cuenta oficial:
img

Supongo que te gusta

Origin blog.csdn.net/yegeli/article/details/113418884
Recomendado
Clasificación