Índice
1. Detecção de borda do operador Laplaciano
Função de detecção de borda laplaciana Laplacian()
2. Detecção de borda do operador astuto
Função de algoritmo Canny Canny()
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:
- Converta a imagem em tons de cinza (se não em tons de cinza).
- Um modelo discreto para aplicar o operador Laplaciano a uma imagem.
- Limite os resultados da convolução para extrair informações de borda.
- 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)