Introdução à SIFT( Scale Invariantes Feature Transform)
PENEIRAR significa Escala-Invariantes Recurso de Transformação e foi apresentado pela primeira vez em 2004, por D. Lowe, da Universidade de British Columbia. SIFT é invariância à escala de imagem e rotação. Este algoritmo é patenteado, por isso este algoritmo está incluído no módulo não-livre do OpenCV.
as Principais vantagens do SIFT são
- Localidade: características locais, de modo robusto, a oclusão e a desordem (não antes de segmentação)
- Peculiaridade: características individuais podem ser combinados para um grande banco de dados de objetos
- Quantidade: muitos recursos podem ser gerados, até mesmo para pequenos objetos
- Eficiência: perto do desempenho em tempo real
- extensibilidade: pode ser facilmente estendido para uma ampla gama de diferentes tipos de recursos, com cada adição de robustez
isto é parte de uma detecção e correspondência de recursos de 7 séries. Outros artigos incluídos
- Introdução À Funcionalidade de Detecção E Correspondência
- Introdução à Harris Canto Detector
- Introdução ao SURF (Acelerado-Up Robust Features)
- Introdução RÁPIDA (Características do Acelerado do Segmento de Teste)
- Introdução BREVE (Binário Robusta, Independente de Características Elementares)
- Introdução ao ORB (Orientada RÁPIDO e Rodado BREVE)
SIFT é bastante envolvidos algoritmo. Há principalmente quatro etapas envolvidas no algoritmo SIFT. Vamos vê-los um a um.
- Scale-space peak selection: Localização potencial para encontrar recursos.
- localização do teclado: localização precisa do teclado.
- orientação atribuição: atribuir orientação aos pontos-chave.
- Keypoint descriptor: Describing the keypoints as a high dimensional vector.
- Keypoint Matching
Scale-space peak Selection
Real world objects are meaning only at a certain scale scale. Você pode ver um cubo de açúcar perfeitamente em uma mesa. Mas se olhar para toda a Via Láctea, então ela simplesmente não existe. Esta natureza multi-escala de objetos é bastante comum na natureza. E um espaço em escala tenta replicar este conceito em imagens digitais.
A escala espacial de uma imagem é uma função L(x,y,σ) que é produzido a partir da convolução de um kernel Gaussiano(Desfoque), em diferentes escalas, com a imagem de entrada. O espaço-escala é separado em oitavas e o número de oitavas e escala depende do tamanho da imagem original. Então nós geramos várias oitavas da imagem original. O tamanho da imagem de cada oitava é metade do anterior.
borrar
dentro de uma oitava, as imagens são progressivamente turvas usando o operador de borrão gaussiano. Matematicamente, “borrão” é referido como a convolução do operador Gaussiano e da imagem. O borrão gaussiano tem uma expressão particular ou” operador ” que é aplicado a cada pixel. O resultado é a imagem desfocada.
G é o Gaussian Blur operador e I é uma imagem. Enquanto x, y são as coordenadas de localização e σ é o parâmetro “escala”. Pensa nisso como a quantidade de borrão. Maior o valor, maior o borrão.
CÃO(Diferença de kernel Gaussiano)
Agora vamos usar essas imagens borradas para gerar um outro conjunto de imagens, a Diferença de Gaussians (Cão). Estas imagens do cão são ótimas para descobrir pontos de teclado interessantes na imagem. A diferença de Gaussiano é obtida como a diferença de borrão gaussiano de uma imagem com dois σ diferentes, seja σ e kσ. Este processo é feito para diferentes oitavas da imagem na pirâmide Gaussiana. Ele é representado na imagem abaixo:
Encontrar keypoints
Até agora, temos gerado uma escala de espaço e utilizada a escala de espaço para calcular a Diferença de Gaussians. Those are then used to calculate Laplacian of Gaussian approximations that are scale invariant.
Um pixel em uma imagem é comparada com seus 8 vizinhos, bem como de 9 pixels na seguinte escala e de 9 pixels anteriores escalas. Desta forma, um total de 26 cheques são feitos. Se é um extremo local, é um ponto-chave potencial. Basicamente significa que o keypoint é melhor representado nessa escala.
localização do teclado
Key0points gerados na etapa anterior produzem um monte de pontos-chave. Alguns deles ficam ao longo de uma borda, ou não têm contraste suficiente. Em ambos os casos, não são tão úteis como as características. Então livramo-nos deles. A abordagem é semelhante à usada no detector de Canto Harris para remover as características edge. Para características de baixo contraste, nós simplesmente verificamos suas intensidades.
eles usaram a expansão da série Taylor do espaço de escala para obter uma localização mais precisa de extremos, e se a intensidade neste extremo é menor do que um valor limiar (0,03 de acordo com o artigo), ele é rejeitado. Cão tem uma resposta mais elevada para as bordas, por isso as bordas também precisam ser removidos. Eles usaram uma matriz hessiana 2×2 (H) para calcular a curvatura principal.
Orientação de Atribuição
Agora temos legítimo keypoints. Foram testados para serem estáveis. Já sabemos a escala na qual o teclado foi detectado (é a mesma que a escala da imagem borrada). Então temos invariância de escala. A próxima coisa é atribuir uma orientação a cada teclado para torná-lo invariância de rotação.
Um bairro é feita em todo o keypoint local, dependendo da escala, e o gradiente de magnitude e direção é calculado da região. Um histograma de orientação com 36 caixas cobrindo 360 graus é criado. Digamos que a direção do gradiente em um determinado ponto (na” região de coleta de orientação”) é de 18.759 graus, então ele vai para o bin de 10-19 graus. E a “quantidade” que é adicionada ao bin é proporcional à magnitude do gradiente nesse ponto. Uma vez que você tenha feito isso para todos os pixels em torno do teclado, o histograma terá um pico em algum momento.
O maior pico do histograma é tomada e qualquer pico acima de 80% ele também é considerado para calcular a orientação. Ele cria pontos chave com a mesma localização e escala, mas direções diferentes. Contribui para a estabilidade da correspondência.
descritor Keypoint
neste ponto, cada keypoint tem uma localização, escala, orientação. Em seguida, é computar um descritor para a região de imagem local sobre cada ponto-chave que é altamente distintivo e invariante o quanto possível para variações como mudanças de ponto de vista e iluminação.
para fazer isso, uma janela 16×16 em torno do ponto de teclado é tomada. Está dividida em 16 subconjuntos de tamanho 4×4.
For each sub-block, 8 bin orientation histogram is created.
So 4 X 4 descriptors over 16 X 16 sample array were used in practice. 4 X 4 X 8 directions give 128 bin values. It is represented as a feature vector to form keypoint descriptor. Este Vector apresenta algumas complicações. Temos de nos livrar deles antes de finalizar a impressão digital.dependência de rotação o vetor recurso usa orientações gradientes. Claramente, se você rodar a imagem, tudo muda. Todas as orientações do gradiente também mudam. Para alcançar a independência de rotação, a rotação do ponto-chave é subtraída de cada orientação. Assim, cada orientação do gradiente é relativa à orientação do ponto-chave.dependência da iluminação se nós limiar números que são grandes, podemos alcançar a independência da iluminação. Assim, qualquer número (dos 128) maior que 0,2 é alterado para 0,2. Este vector resultante é normalizado novamente. E agora você tem um vector de característica independente de iluminação!
Keypoints Matching
Keypoints between two images are matched by identifying their nearest neighbors. Mas, em alguns casos, o segundo jogo mais próximo pode estar muito perto do primeiro. Pode acontecer devido ao ruído ou a outras razões. Nesse caso, a relação entre a distância mais próxima e a distância mais próxima é tomada. Se for superior a 0,8, serão rejeitados. Elimina cerca de 90% das correspondências falsas, enquanto as devoluções apenas 5% corrigem as correspondências, de acordo com o papel.
implementação
I foi capaz de implementar sift usando OpenCV(3.4). Aqui está como eu fiz:
Github link para o código: https://github.com/deepanshut041/feature-detection/tree/master/sift