opencv suavizado medio desenfoque, suavizado mediano medianaBlur, suavizado gaussiano GaussianBlur(), suavizado bilateral bilateralFilter()


1. Todos los coeficientes de la ventana deslizante de suavizado medio de desenfoque de suavizado medio () son 1/(alto de la ventana * ancho de la ventana).

dst=cv2.blur(src, ksize[, dst[, anchor[, borderType]]])

src: imagen de origen, el número de canales no está limitado, el tipo de datos debe ser CV_8U, CV_16U, CV_16S, CV_32F o CV_64F; ksize:
tamaño del núcleo, tamaño de la ventana, tipo de tupla, el valor del elemento puede ser par o impar;
ancla: ancla punto, el valor predeterminado es (-1, -1), que actúa sobre el punto central de la ventana deslizante;
borderType: tipo de procesamiento de borde;

img_ret = cv2.blur(img,(3,3))

2. Suavizado de mediana El suavizado de mediana medianBlur()
también utiliza una ventana deslizante como el suavizado de media, pero no calcula ninguna suma ponderada en la ventana deslizante, sino que utiliza la mediana de todos los valores de píxeles ordenados en la ventana deslizante de la imagen original. valor como el valor de píxel de la nueva imagen.
dst=cv2.medianBlur(src, ksize[, dst])
src: imagen de origen, el número de canales puede ser 1, 3 o 4. Cuando ksize es 3 o 5, el tipo de datos puede ser CV_8U, CV_16U, CV_32F. Cuando se utiliza un ksize mayor, el tipo de datos solo puede ser CV_8U; ksize
: Tamaño del kernel, tamaño de la ventana, tipo de número entero, valor impar mayor que 1;

img_ret = cv2.medianBlur(img,3)

3. El suavizado del contraste del valor de los píxeles
es un tipo de filtrado de imágenes que puede considerarse como un filtrado de paso bajo. Elimina la "señal" de alta frecuencia de la imagen y hace que la imagen se vea borrosa y más suave. Al cambiar los valores de los píxeles ​​de la imagen antes y después del cambio. Este efecto de suavizado se puede observar más visualmente dibujando una curva.

4. Suavizado gaussianoGaussionBlur()
El suavizado gaussiano tiene diferentes pesos dependiendo de la distancia desde el punto central. Este método parece ser más "convencional".

Se puede ver la curva de la distribución gaussiana (cuando μ = 0):
cuando x = 0, el valor de f (x) es el mayor. Cuando x cambia hacia ambos lados, el valor de f (x) se vuelve cada vez más pequeño. ;
esta curva está en x Los dos lados de =0 son simétricos, f(-1)=f(1), f(-2)=f(2); cuanto mayor σ, más plana será la curva y más
baja valor cuando x=0.

En OpenCV se utiliza la distribución gaussiana bidimensional.

Trazar una distribución gaussiana bidimensional con matplotlib:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig) 
X = np.arange(-3, 3.1, 0.1,dtype=np.float64).reshape(-1,1)
Y = np.arange(-3, 3.1, 0.1,dtype=np.float64)
mux,muy=0,0
sigmax,sigmay = 0.8,0.8
expont = -0.5*(((X-mux)/sigmax)**2 + ((Y-muy)/sigmay)**2)
Z=np.exp(expont)/(2*np.pi*sigmax*sigmay)
ax.plot_surface(X, Y, Z, rstride=2, cstride=2, cmap=cm.viridis)
plt.show()

Forma de interfaz de GaussianBlur():
dst=cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

src: el número de canales es arbitrario, el procesamiento real se divide en canales; la profundidad de la imagen solo puede ser CV_8U, CV_16U, CV_16S, CV_32F o CV_64F; ksize: tipo de tupla, tamaño de ventana, ancho y alto pueden ser diferentes, pero
deben ser un número impar positivo; si se establece en 0, se calcula en función de sigma.
sigmaX: la desviación estándar de la imagen en
Cuando se pasa 0, sigmaX y sigmaX se calculan en función de ksize;
borderType: método de procesamiento de bordes;

Nota : La primera letra de GaussianBlur es una G mayúscula, que es ligeramente diferente de la mayoría de los otros nombres de funciones OpenCV que usan un estilo de nomenclatura en mayúsculas y minúsculas.

Debido a que el punto central de la ventana deslizante se utiliza como origen, para garantizar que el peso del punto central (x, y) = (0, 0) sea el valor máximo, μ1 y μ2 se establecen en 0 en Suavizado gaussiano de OpenCV, de modo que al llamar Cuando se utiliza la función de suavizado gaussiano, solo necesita pasar σ1 (sigmaX) y σ2 (sigmaY).

img_ret = cv2.GaussianBlur(img,(11,11),0)
imshow(cv2.cvtColor(img_ret,cv2.COLOR_BGR2RGB))

Correspondiente a las características de la curva de distribución gaussiana, cuando sigma es mayor, el valor del origen es menor y los valores de los puntos circundantes son mayores, lo que corresponde a menor peso del punto central en la imagen y cuanto mayor es el peso de los puntos circundantes, mayor es el sigma y la imagen se vuelve borrosa.
5. El suavizado bilateral bilateralFilter()
La eliminación de ruido del suavizado medio, mediano y gaussiano es un "ataque indiferente". Todos los píxeles se ven afectados por el mismo coeficiente de ponderación, por lo que los bordes de la imagen también se verán afectados durante el proceso de suavizado. (Donde el píxel los valores cambian repentinamente), el filtrado bilateral que se introducirá a continuación puede eliminar el ruido manteniendo los bordes de la imagen, lo que es "conservación de bordes con ruido".

Forma de interfaz de bilateralFilter():
dst=cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

src: 8 bits o tipo punto flotante; 1 o 3 canales;
d: tamaño de ventana, si es un número no positivo se calcula según sigmaSpace, cuando d>5, la velocidad será más lenta. Cuando el ruido es grave , se puede seleccionar d>=9, pero esto no es adecuado para procesamiento sensible al tiempo;
sigmaColor: parámetro sigma de diferencia de brillo;
sigmaSpace: parámetro sigma de distancia espacial, que actúa en las direcciones X e Y (fila, columna) de la imagen al mismo tiempo;
borderType: método de procesamiento de bordes;

Entre los parámetros del tamaño de la ventana deslizante, el parámetro ksize del suavizado gaussiano es una tupla cuyo ancho y alto pueden ser desiguales, pero el parámetro d utilizado para el suavizado bilateral es de tipo entero, que también determina que el ancho y alto de la ventana deslizante ventana son iguales.

Si d es menor que 0, use sigma_space*1.5 y luego redondee para obtener el radio. Si d es mayor que 0, primero divida por 2 para obtener el radio, luego compare el radio con 1 para obtener el valor mayor y finalmente multiplique por 2 y sumar 1, por lo que se puede garantizar que la d obtenida sea un número impar no menor que 3.

Cuando los parámetros sigmaColor y sigmaSpace son relativamente pequeños (<10), el efecto de suavizado no es muy obvio. Cuando los parámetros son relativamente grandes o la imagen después de múltiples suavizados se verá caricaturesca.

img_ret = cv2.bilateralFilter(img,7,25,25)
img_edge=cv2.Sobel(img_ret,cv2.CV_8U,1,0,ksize=3)

Cuando hay un cambio repentino de color (borde), el suavizado gaussiano solo conserva aproximadamente la mitad del borde, mientras que el suavizado bilateral conserva casi todo el borde, y el brillo promedio del borde del suavizado gaussiano no es tan alto como el del suavizado bilateral.

En comparación con el suavizado medio y mediano, el suavizado gaussiano está más en línea con los valores "convencionales": cuanto más cerca estén los píxeles en la distancia espacial, mayor será el peso cuando se utilice para calcular el valor de nuevos píxeles. El suavizado medio, el suavizado mediano y el suavizado gaussiano lograrán un suavizado indiscriminado de toda la imagen. Una ventana deslizante con un coeficiente fijo actúa sobre toda la imagen, por lo que aunque el ruido se procesa en la imagen suavizada, las partes del borde también se debilitarán. El suavizado bilateral se basa en los coeficientes utilizados en el suavizado gaussiano multiplicados por la función gaussiana de la diferencia de píxeles. Cuanto mayor es la diferencia de píxeles en el punto central, menor es el valor total del coeficiente. Finalmente, el efecto de la eliminación de ruido y la preservación de los bordes se puede logrado.

Supongo que te gusta

Origin blog.csdn.net/aqiangdeba/article/details/129767116
Recomendado
Clasificación