[OpenCV-Python] 18 degradado de imagen

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:
   img

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:
     src

Kernel de convolución utilizado por el filtro de Laplace:
      núcleo

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:

Laplaciano

¡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:

Doble filo

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/113421615
Recomendado
Clasificación