OpenCV (26): Detecção de bordas (2)

Índice

1. Detecção de borda do operador Laplaciano

princípio:

Função de detecção de borda laplaciana Laplacian()

Código de amostra:

2. Detecção de borda do operador astuto

princípio:

Função de algoritmo Canny Canny()

Código de amostra:


1. Detecção de borda do operador Laplaciano

princípio:

        O princípio do operador Laplaciano é baseado na segunda derivada da imagem. A primeira derivada nos ajuda a detectar as bordas da imagem, enquanto a segunda derivada pode detectar as interseções das bordas, ou seja, os cantos da imagem.

O operador Laplaciano é definido como a soma das derivadas espaciais de segunda ordem e é utilizado para processamento de imagens em casos bidimensionais. Sua forma discreta é a seguinte:

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

Entre eles, I(x, y) representa o valor do pixel na imagem, d^2 representa a derivada parcial, dx representa a derivada na direção X e dy representa a derivada na direção Y.

O operador Laplaciano pode ser calculado aplicando convolução discreta. Um modelo comum de operador Laplaciano discreto é o seguinte:

 
 

Ao envolver este modelo com a imagem, podemos calcular a resposta Laplaciana para cada pixel da imagem.

As etapas específicas são as seguintes:

  1. Converta a imagem em tons de cinza (se não em tons de cinza).
  2. Um modelo discreto para aplicar o operador Laplaciano a uma imagem.
  3. Limite os resultados da convolução para extrair informações de borda.
  4. Operações de pós-processamento, como supressão não máxima e conexão de borda, são opcionalmente executadas na imagem de borda com limite.

A saída do operador Laplaciano é uma imagem componente de alta frequência que representa a aresta. As bordas normalmente aparecem como limites entre pixels claros e escuros. A largura e a intensidade das bordas dependem do tamanho do operador Laplaciano e da variação da escala de cinza na imagem.

Função de detecção de borda laplaciana Laplacian()

void cv::Laplacian ( InputArray src,

OutputArray dst,

int profundidade,

int ktamanho = 1,

escala dupla = 1,

delta duplo = 0,

int borderType = BORDA PADRÃO

)

  • src: Insira a imagem original, que pode ser uma imagem em tons de cinza ou colorida.
  • dst: A imagem de saída, que possui as mesmas dimensões e número de canais que a imagem de entrada src.
  • dprofundidade: O tipo de dados (profundidade) da imagem de saída, que possui diferentes faixas de valores dependendo do tipo de dados da imagem de entrada.
  • ksize: O tamanho do filtro, que deve ser um número ímpar positivo.
  • escala: fator de escala para escalar o resultado do cálculo da derivada, o coeficiente padrão é 1, nenhuma escala é executada.
  • delta: valor de polarização, adicione o valor de polarização ao resultado do cálculo.
  • borderType: sinalizador de opção de extrapolação de pixel.
Código de amostra:
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);
}

                   

  (Extrair imagem de borda sem filtragem) (Extrair imagem de borda após filtragem)

2. Detecção de borda do operador astuto

princípio:

Função de algoritmo Canny Canny()

void cv::Canny (imagem InputArray,

Bordas OutputArray,

limiar duplo1,

limiar duplo2,

abertura internaTamanho = 3,

bool L2gradiente = falso

)

  • imagem: imagem de entrada, deve ser imagem CV 8U de canal único ou de três canais
  • bordas: A imagem de saída, uma imagem de canal único com o mesmo tamanho da imagem de entrada e o tipo de dados é CV 8U.
  • limite1: o primeiro limite de histerese
  • limite2: o segundo limite de histerese
  • apertureSize: o diâmetro do operador Sobel
  • L2gradient: um sinal para calcular a magnitude do gradiente da imagem
Código de amostra:
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);
}

(Limite grande detecta borda da imagem) (Limite pequeno detecta borda da imagem) (Detecta borda da imagem após desfoque gaussiano)

Acho que você gosta

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