Articles

Introdução à SIFT( Scale Invariantes Feature Transform)

Deepanshu Tyagi

Siga

Mar 16, 2019 · 7 min de leitura

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.

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.

Gaussian Blur operador

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *