Directorio de artículos
OpenCV-Python: Procesamiento de imágenes IV en OpenCV
18 Gradiente de imagen
Destino
• Gradiente de imagen, límite de imagen, etc.
• Las funciones utilizadas son: cv2.Sobel (), cv2.Schar (), cv2.Laplacian (), etc.
Principio El
gradiente es simplemente la derivada.
OpenCV proporciona tres filtros de gradiente diferentes o filtros de paso alto: Sobel, Scharr y Laplacian. Los presentaremos uno a uno.
Sobel y Scharr están encontrando la primera o la segunda derivada. Scharr es una optimización de Sobel (cuando se usa un pequeño núcleo de convolución para resolver el ángulo de gradiente). Laplaciano es encontrar la segunda derivada.
18.1 Operador Sobel y operador Scharr
El operador Sobel es una combinación de suavizado gaussiano y operación diferencial, por lo que su capacidad anti-ruido es muy buena. Puede establecer la dirección de derivación (xorder o yorder). También puede establecer el tamaño del kernel de convolución utilizado (ksize). Si ksize = -1, se utilizará un filtro Scharr de 3x3 y su efecto es mejor que un filtro Sobel de 3x3 (y la velocidad es la misma, por lo que debe intentar utilizar un filtro Scharr cuando utilice un filtro de 3x3). El kernel de convolución de filtro Scharr 3x3 es el siguiente:
18.2 Laplaciano 算 子
El operador Laplaciano se puede definir en forma de derivada de segundo orden. Se puede suponer que su implementación discreta es similar a la derivada Sobel de segundo orden. De hecho, OpenCV llama directamente al operador Sobel al calcular el operador Laplaciano. Calculado como sigue:
Kernel de convolución utilizado por el filtro de Laplace:
Código
El siguiente código utiliza los tres filtros anteriores para operar en la misma imagen. Los núcleos de convolución utilizados son todos 5x5.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('dave.jpg',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
resultado:
¡Una cosa importante!
Al mirar los comentarios del ejemplo anterior, no sé si se ha dado cuenta: cuando podemos establecer la profundidad (tipo de datos) de la imagen de salida para que sea consistente con la imagen original a través del parámetro -1 , pero estamos en el código Pero se usa cv2.CV_64F. ¿Por qué es esto? Imagine que la derivada de un límite de negro a blanco es un número entero, pero la derivada de un punto límite de blanco a negro es negativa. Si la profundidad de la imagen original es np.int8, todos los valores negativos se truncarán a 0, es decir, se perderá el límite. Entonces, si desea detectar estos dos límites, la mejor manera es establecer el tipo de datos de salida más alto, como cv2.CV_16S, cv2.CV_64F, etc. Tome el valor absoluto y luego devuélvalo a cv2.CV_8U. El siguiente ejemplo demuestra los diferentes efectos causados por la profundidad de la imagen de salida.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('box.png',0)
# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)
# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()
resultado:
Para obtener más información, preste atención a la cuenta oficial: