OpenCV (26): Detección de bordes (2)

Tabla de contenido

1. Detección de bordes del operador laplaciano

principio:

Función de detección de bordes laplacianos Laplaciano()

Código de muestra:

2. Detección de bordes del operador astuto

principio:

Función del algoritmo Canny Canny()

Código de muestra:


1. Detección de bordes del operador laplaciano

principio:

        El principio del operador laplaciano se basa en la segunda derivada de la imagen. La primera derivada nos ayuda a detectar los bordes de la imagen, mientras que la segunda derivada puede detectar las intersecciones de los bordes, es decir, las esquinas de la imagen.

El operador laplaciano se define como la suma de las derivadas espaciales de segundo orden y se utiliza para el procesamiento de imágenes en casos bidimensionales. Su forma discreta es la siguiente:

L(x, y) = d^2(I(x, y)) / dx^2 + d^2(I(x, y)) / dy^2 

Entre ellos, I (x, y) representa el valor de píxel en la imagen, d ^ 2 representa la derivada parcial, dx representa la derivada en la dirección X y dy representa la derivada en la dirección Y.

El operador laplaciano se puede calcular aplicando convolución discreta. Una plantilla de operador laplaciano discreto común es la siguiente:

 
 

Al convolucionar esta plantilla con la imagen, podemos calcular la respuesta laplaciana para cada píxel de la imagen.

Los pasos específicos son los siguientes:

  1. Convierta la imagen a escala de grises (si no es a escala de grises).
  2. Una plantilla discreta para aplicar el operador laplaciano a una imagen.
  3. Umbral de los resultados de la convolución para extraer información de borde.
  4. Las operaciones de posprocesamiento, como la supresión no máxima y la conexión de bordes, se realizan opcionalmente en la imagen de borde con umbral.

La salida del operador laplaciano es una imagen componente de alta frecuencia que representa el borde. Los bordes suelen aparecer como límites entre píxeles brillantes y oscuros. El ancho y la intensidad de los bordes dependen del tamaño del operador laplaciano y de la variación de la escala de grises en la imagen.

Función de detección de bordes laplacianos Laplaciano()

void cv::Laplaciano (InputArray src,

horario de salida de matriz de salida,

profundidad interna,

int ktamaño = 1,

doble escala = 1,

doble delta = 0,

int borderType = FRONTERA PREDETERMINADA

)

  • src: ingrese la imagen original, que puede ser una imagen en escala de grises o una imagen en color.
  • dst: la imagen de salida, que tiene las mismas dimensiones y número de canales que la imagen de entrada src.
  • dprofundidad: el tipo de datos (profundidad) de la imagen de salida, que tiene diferentes rangos de valores según el tipo de datos de la imagen de entrada.
  • ksize: El tamaño del filtro, que debe ser un número impar positivo.
  • escala: factor de escala para escalar el resultado del cálculo de la derivada, el coeficiente predeterminado es 1, no se realiza ninguna escala.
  • delta: valor de sesgo, agregue el valor de sesgo al resultado del cálculo.
  • borderType: indicador de opción de extrapolación de píxeles.
Código de muestra:
void Laplacian_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat result,result_g,result_G;
    //未滤波提取边缘
    Laplacian(gray,result,CV_16S,3,1,0);
    convertScaleAbs(result,result);
    //滤波后提取边缘
    GaussianBlur(gray,result_g,Size(3,3),5,0);//高斯滤波
    Laplacian(result_g,result_G,CV_16S,3,1,0);
    convertScaleAbs(result_G,result_G);
    //显示图像
    imwrite("/sdcard/DCIM/result.png",result);
    imwrite("/sdcard/DCIM/result_G.png",result_G);
}

                   

  (Extraer imagen de borde sin filtrar) (Extraer imagen de borde después de filtrar)

2. Detección de bordes del operador astuto

principio:

Función del algoritmo Canny Canny()

void cv::Canny (imagen de InputArray,

Bordes de OutputArray,

umbral doble1,

doble umbral2,

tamaño de apertura int = 3,

bool L2gradient = falso

)

  • imagen: imagen de entrada, debe ser una imagen CV 8U de un solo canal o de tres canales
  • bordes: la imagen de salida, una imagen de un solo canal con el mismo tamaño que la imagen de entrada y el tipo de datos es CV 8U.
  • umbral1: el primer umbral de histéresis
  • umbral2: el segundo umbral de histéresis
  • tamaño de apertura: el diámetro del operador Sobel
  • L2gradient: un signo para calcular la magnitud del gradiente de la imagen
Código de muestra:
void Canny_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat resultHigh,resultLow,resultG;
    //大阈值检测图像边缘
    Canny(image,resultHigh,100,200,3);
    //小阈值检测图像边缘
    Canny(image,resultLow,20,40,3);
    //高斯模糊后检测图像边缘
    GaussianBlur(gray,resultG,Size(3,3),5);
    Canny(resultG,resultG,100,200,3);
    //显示图像
    imwrite("/sdcard/DCIM/resultHigh.png",resultHigh);
    imwrite("/sdcard/DCIM/resultLow.png",resultLow);
    imwrite("/sdcard/DCIM/resultG.png",resultG);
}

(El umbral grande detecta el borde de la imagen) (El umbral pequeño detecta el borde de la imagen) (Detecta el borde de la imagen después del desenfoque gaussiano)

Supongo que te gusta

Origin blog.csdn.net/weixin_63357306/article/details/132735357
Recomendado
Clasificación