[Reproducido] Laplaciano de la serie OpenCV-Python (24)

Aprendimos a usar la detección de bordes de Sobel en el ejemplo anterior del tutorial anterior. El principio es utilizar el salto de valores de píxeles en el área del borde. Al encontrar la primera derivada, se puede maximizar el valor del borde. Como se muestra abajo:
Inserte la descripción de la imagen aquí

Entonces, ¿qué obtienes si encuentras la segunda derivada?
Inserte la descripción de la imagen aquí
Puedes observar dónde la segunda derivada es 0. Por lo tanto, este método se puede utilizar para obtener bordes en una imagen. Sin embargo, debe tenerse en cuenta que la segunda derivada de 0 no solo aparece en el borde, sino que también puede haber algunas posiciones sin sentido. Esta situación se puede manejar filtrando según sea necesario.

Diferencial de segundo orden

Ahora analicemos el diferencial de segundo orden, que es la base del operador de Laplace. Es ligeramente diferente del diferencial definido en cálculo. La imagen digital trata con valores discretos, por lo que el diferencial de primer orden de una función unidimensional La definición básica es la diferencia: de
Inserte la descripción de la imagen aquí
manera similar, el diferencial de segundo orden se define como:
Inserte la descripción de la imagen aquí
extender una función unidimensional a dos dimensiones:

Inserte la descripción de la imagen aquí
La definición de diferencial de segundo orden garantiza los siguientes puntos:

1. El valor diferencial en el área gris constante es 0

2. El valor diferencial no es cero en el punto de inicio del escalón gris o pendiente.

Se puede ver que la diferenciación de segundo orden puede detectar los bordes de la imagen y mejorar los detalles.

Laplaciano

De la explicación anterior, se puede ver que la segunda derivada puede tener detección de bordes. Dado que la imagen es bidimensional, es necesario obtener las derivadas en dos direcciones por separado. El operador laplaciano se utiliza aquí como aproximación.

El operador de Laplace se define mediante la siguiente fórmula:

Inserte la descripción de la imagen aquí
entre ellos:

Inserte la descripción de la imagen aquí
Se puede representar en forma digital de muchas formas. Para un área de 3 * 3, en general, la forma más recomendada es:

Inserte la descripción de la imagen aquí
La plantilla de filtro para implementar la fórmula anterior es:
Inserte la descripción de la imagen aquí
podemos encontrar que el operador laplaciano no necesita procesar las direcciones xey por separado como el operador Sobel, se puede procesar directamente, ahora echemos un vistazo a la vuelta en OpenCV El prototipo de función del operador Lass:

dst = cv2.Laplacian (src, ddepth [, dst [, ksize [, scale [, delta [, borderType]]]]])

Si leyó la introducción al operador Sobel en el tutorial anterior, los parámetros aquí no deberían ser difíciles de entender.

Los dos primeros son parámetros obligatorios:

El primer parámetro es la imagen a procesar;

El segundo parámetro es la profundidad de la imagen, -1 significa que se utiliza la misma profundidad que la imagen original. La profundidad de la imagen de destino debe ser mayor o igual que la profundidad de la imagen original;

A continuación se muestran los parámetros opcionales:

dst no necesita explicar;

ksize es el tamaño del operador y debe ser 1, 3, 5, 7. El valor predeterminado es 1.

la escala es la constante de escala de la derivada de escala y no hay un factor de escala por defecto;

delta es un incremento opcional que se agregará al dst final De manera similar, no se agrega ningún valor adicional al dst por defecto;

borderType es el modo para juzgar el borde de la imagen. El valor predeterminado de este parámetro es cv2.BORDER_DEFAULT.

Veamos el código:

	view plaincopy to clipboardprint? 
import cv2   
import numpy as np      
img = cv2.imread("pie.png")   
dst = cv2.Laplacian(img,cv2.CV_16S,ksize=3)   
dst = cv2.convertScaleAbs(dst) 
cv2.imshow("img",img)   
cv2.imshow("res",dst)      
cv2.waitKey(0)   
cv2.destroyAllWindows()

Inserte la descripción de la imagen aquí

Ahora puede comparar este resultado con el resultado del tutorial anterior. Encontramos que este resultado es mucho mejor que el resultado del tutorial anterior, y no hay una gran desviación para la detección de bordes.

Sin embargo, de hecho, esto es solo para imágenes simples, y para una imagen compleja, entonces la extracción de bordes es un poco impotente, veamos el código:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
dst = cv2.Laplacian(img,cv2.CV_16S,ksize=3)  
dst = cv2.convertScaleAbs(dst)  
cv2.imshow("img",img)  
cv2.imshow("res",dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()

Inserte la descripción de la imagen aquí
Se puede ver que para imágenes más complejas, el efecto de Laplacian no es muy bueno. Debido a ciertas limitaciones del diferencial de segundo orden, la detección de borde actual no es perfecta. Necesitamos un algoritmo completo. Esto se presentará en el próximo tutorial.

Consulte la página de resumen del artículo https://blog.csdn.net/weixin_44237705/article/details/107864965
Se puede intercambiar más información técnica de openvino en el grupo ~
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44237705/article/details/108398323
Recomendado
Clasificación