Lição 4-3: Extração e descrição de recursos de imagem OpenCV --- Algoritmo SIFT/SURF

meta de aprendizagem

  • 理解SIFT / SURF SIFT/SURFPrincípio do algoritmo S I FT / S U RF ,
  • Capacidade de usar SIFT/SURF SIFT/SURFS I FT / S U RF detectam pontos-chave

Algoritmo SIFT/SURF

1.1 Princípio SIFT

Nas duas seções anteriores apresentamos Harris HarrisH a rr i sS hi − Tomasi Shi-TomasiShhh , oi-Algoritmo de detecção de ponto de canto Tomas i . Esses dois algoritmos têm invariância de rotação, mas não invariância de escala. Tome a figura a seguir como exemplo. Os cantos podem ser detectados na imagem pequena à esquerda, mas depois que a imagem é ampliada , o Usando na mesma janela, os pontos de canto não podem ser detectados.
Insira a descrição da imagem aqui
Portanto, a seguir apresentaremos um algoritmo de visão computacional, transformação de recurso invariante de escala, ou seja,SIFT (Scale - invariantfeaturetrans form) SIFT (Scale-invariant feature transform)S IFT ( Escala _ _ _ _ _-in v a r iant feature retrans f or m ) . _ _ _ _ _ _ _ _ _ É usado para detectar e descrever características locais em imagens. Ele encontra pontos extremos na escala espacial e extrai seus invariantes de posição, escala e rotação. Este algoritmo foi publicado por David Lowe em 1999 e aperfeiçoado em 2004. Resumir. O escopo da aplicação inclui reconhecimento de objetos, percepção e navegação de mapas de robôs, costura de imagens, construção de modelos 3D, reconhecimento de gestos, rastreamento de imagens e comparação de ações, etc.

A essência do algoritmo SIFT é encontrar pontos-chave (pontos característicos) em diferentes espaços de escala e calcular a direção dos pontos-chave. Os pontos-chave encontrados pelo SIFT são alguns pontos muito proeminentes que não mudarão devido a fatores como iluminação, transformação afim e ruído, como pontos de canto, pontos de borda, pontos brilhantes em áreas escuras e pontos escuros em áreas claras.

1.1.1 Processo básico

Devo LoweL o w eSIFT SIFTO algoritmo SIFT é decomposto nas quatro etapas a seguir :

  1. Detecção de valores extremos de espaço de escala: pesquise locais de imagens em todas as escalas. Os pontos-chave potenciais que são invariantes à escala e à rotação são identificados através de funções de diferença gaussianas.
  2. Posicionamento do ponto-chave: Em cada posição candidata, a posição e a escala são determinadas através de um modelo bem ajustado. Os pontos-chave são escolhidos com base na sua estabilidade.
  3. Determinação da direção do ponto-chave: Com base na direção do gradiente local da imagem, uma ou mais direções são atribuídas a cada posição do ponto-chave. Todas as operações subsequentes nos dados da imagem são transformadas em relação à direção, escala e posição dos pontos-chave, garantindo assim a invariância a estas transformações.
  4. Descrição do ponto-chave: Na vizinhança de cada ponto-chave, o gradiente local da imagem é medido em uma escala selecionada. Esses gradientes servem como descritores de pontos-chave, que permitem deformações locais relativamente grandes ou alterações de iluminação.

Vamos ao longo Lowe LowePassos baixos para SIFTSIFT _O processo de implementação do algoritmo SIFT é introduzido:

1.1.2 Detecção de valores extremos no espaço de escala

Em espaços de escala diferentes, a mesma janela não pode ser usada para detectar pontos extremos. Janelas pequenas são usadas para pontos-chave pequenos e janelas grandes são usadas para pontos-chave grandes. Para atingir o objetivo acima, usamos filtros de espaço de escala.

O kernel gaussiano é a única função do kernel que pode gerar espaço multiescala. -"Teoria do espaço escala: Uma ferramenta básica para análise de estruturas em diferentes escalas".

O espaço de escala L ( x , y , σ ) de uma imagem L(x,y,σ)eu ( x ,sim ,σ ) , definido como a imagem originalI ( x , y ) I(x,y)Eu ( x ,y ) com uma escala variável de2 2Função gaussiana bidimensional G ( x , y , σ ) G(x,y,σ)G ( x ,sim ,σ ) operação de convolução, ou seja:

L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x,y,σ)=G(x,y,σ)∗I(x,y)eu ( x ,sim ,e )=G ( x ,sim ,e )Eu ( x ,você )

em:

G ( x , y , σ ) = 1 2 π σ 2 ex 2 + y 2 2 σ 2 G(x,y,σ)= \frac{1}{2πσ^{2}}e^{\frac{x ^{2}+y^{2}}{2σ^{2}}}G ( x ,sim ,e )=2 p.s _21e2p .2x2 +você2

SSσ é o fator de espaço de escala, que determina o grau de desfoque da imagem. Em grandes escalas (σ σ(valor σ grande ) representa a informação geral da imagem. Em pequena escala (σ σ(valor σ pequeno ) representa as informações detalhadas da imagem.

Ao calcular a aproximação discreta de uma função gaussiana, em aproximadamente 3σ 3σPixels fora da distância 3σ podem ser considerados ineficazes e o cálculo desses pixels pode ser ignorado . Portanto, em aplicações práticas, calcule apenas( 6 σ + 1 ) ∗ ( 6 σ + 1 ) (6σ+1)*(6σ+1)( 6h _+1 )( 6h _+O kernel de convolução gaussiana de 1 ) pode garantir a influência de pixels relevantes.

Em seguida, construímos uma pirâmide gaussiana da imagem, que é obtida desfocando e reduzindo a resolução da imagem usando uma função gaussiana.Durante a construção da pirâmide gaussiana, a imagem é primeiro duplicada, uma pirâmide gaussiana é construída com base na imagem expandida, e então a pirâmide gaussiana é construída.A imagem neste tamanho é submetida ao desfoque gaussiano, e a coleção de várias imagens desfocadas constitui uma oitava oitavaOitava e depoisOitava _ _ _ _Selecione uma imagem em Oitava para redução da resolução . O comprimento e a largura são duplicados respectivamente, e a área da imagem se torna um quarto da original . Esta imagem é a próximaoitava oitavaA imagem inicial da Octave é completada com base na imagem inicial e pertence a estaOctave OctaveProcessamento de desfoque gaussiano de oitava , e assim por diante, para completar toda a construção de oitava exigida por todo o algoritmo, para que a pirâmide gaussiana seja construída. Todo o processo é mostrado na figura abaixo :

Insira a descrição da imagem aqui
Utilize L o G LoGL o G (método Laplaciano de Gaussiano), que é a segunda derivada da imagem, pode detectar informações de pontos-chave da imagem em diferentes escalas para determinar os pontos característicos da imagem. MasL o G LoGL o G possui grande quantidade de cálculo e baixa eficiência. Portanto, obtemos D o G DoGsubtraindo as imagens de dois espaços adjacentes na escala gaussiana.Faça G (diferença de Gaussianos) para aproximarL o G LoGL o G。 _

Para calcular D o G DoGFaça GNós construímos uma pirâmide de diferença gaussiana, que é construída com base na pirâmide gaussiana mencionada acima. O processo de estabelecimento é: cada oitava oitavana pirâmide gaussianaA subtração de duas camadas adjacentes na Oitava forma uma pirâmide de diferenças gaussianas . Como mostrado abaixo:Insira a descrição da imagem aqui

Pirâmide de Diferença Gaussiana nº 1 1Grupo 1 Nº 1 1O nível 1 é obtido subtraindo o nível 1 do grupo 1 do nível 2 do grupo 1 da pirâmide gaussiana. Por analogia, cada imagem diferencial é gerada grupo por grupo e camada por camada, e todas as imagens diferenciais constituem uma pirâmide diferencial. Resumido comoCÃO CÃOPirâmide D OG No.o Grupo nº1A imagem da camada l é a camadacom pirâmide gaussianaGrupo ol + 1 l+1eu+ andar menosootho Grupo nº1Obtido da camada l . AcompanhamentoSi ift SiftS se t pontos característicos são extraídos emDOG DOGConduzido na Pirâmide D OG

Em D o G DoGApós a conclusão do Do G , os máximos locais podem ser pesquisados ​​em diferentes espaços de escala. Para um pixel na imagem, ele precisa ser consistente com o entorno8 88 vizinhança e adjacente18 (2 x 9) 18 (2x9)Comparado a 18 ( 2 x 9 ) pontos. Se for um máximo local, pode ser um ponto crítico. Basicamente o ponto chave é a melhor representação da imagem no espaço de escala correspondente. Conforme mostrado na figura abaixo:
Insira a descrição da imagem aqui
o processo de busca começa a partir da segunda camada de cada grupo, sendo a segunda camada a camada atual, e oD o G DoGCada ponto na imagem Do G leva uma dimensão 3 × 3 3 × 33×O cubo de 3 , as camadas superior e inferior do cubo são a primeira e a terceira camadas. Desta forma, os pontos extremos obtidos através da busca possuem coordenadas de posição (D o G DoGCoordenadas da imagem de Do G ) e coordenadas de escala espacial (coordenadas da camada). Após a conclusão da pesquisa da segunda camada, a terceira camada é usada como a camada atual. O processo é semelhante à pesquisa da segunda camada. QuandoS = 3 S=3S=3 , procure3 33 andares, então emDOG DOGExiste S + 2 S+2em D OGS+Nível 2 , cada grupo possui S+3 S+3na pirâmide construída pelo primeiro usuárioS+3 andares.

1.1.3 Posicionamento de pontos-chave

Devido ao D o G DoGDo G é sensível a ruídos e bordas, portanto, os pontos extremos locais detectados na pirâmide de diferença gaussiana acima precisam ser inspecionados mais detalhadamente antes que possam ser posicionados com precisão como pontos característicos.

Use a expansão da série de Taylor do espaço da escala para obter a localização exata do valor extremo. Se o valor cinza do ponto extremo for menor que o limite (geralmente 0,03 0,030,03 ou0,04 0,040,04 ) será ignorado. No OpenCV esse tipo de limite é chamadocontrastThreshold.

Cão CãoO algoritmo Do G é muito sensível aos limites, por isso devemos removê-los. Harris HarrisAlém da detecção de pontos de canto, o algoritmo H a r i s também pode ser usado para detectar limites. DeHarris HarrisNo algoritmo de detecção de canto Harris , um limite é detectado quando um valor de recurso é muito maior que outro valor de recurso . Isso está emD o G DoGOs pontos-chave pobres no algoritmo Do G têm uma curvatura principal maior na direção paralela à borda e uma curvatura menor na direção perpendicular à borda. Se a relação entre os dois for superior a um certo limite (chamado de limite em Limite OpenCV), o ponto-chave é considerado um limite e será ignorado. Geralmente, o limite é definido como10 1010 .

Ao remover os pontos-chave de baixo contraste e limites, obtemos os pontos-chave nos quais estamos interessados.

1.1.4 Determinando a direção dos pontos-chave

Após as duas etapas acima, os pontos-chave da imagem foram completamente encontrados e esses pontos-chave apresentam invariância de escala. Para obter a invariância de rotação, também é necessário atribuir um ângulo de direção a cada ponto-chave, ou seja, obter uma referência de direção baseada na estrutura de vizinhança da imagem em escala gaussiana onde está localizado o ponto-chave detectado.

Para qualquer ponto-chave, coletamos as características de gradiente (amplitude e ângulo) de todos os pixels na área da imagem da pirâmide gaussiana com r como o raio, o raio rrr :
r = 3 × 1,5σ r=3×1,5σR=3×1,5p .

onde σ é o ponto chave da oitavaA escala da imagem de oitava pode ser usada para obter a imagem em escala correspondente .

A fórmula de cálculo para a magnitude e direção do gradiente é:

m (x, y) = (L (x + 1, y) - L (x - 1, y) 2 + (L (x, y + 1) - L (x, y - 1)) 2 m (x ,y)=\sqrt{(L(x+1,y)-L(x-1,y)^{2}+(L(x,y+1)-L(x,y-1))^ {2}}m ( x ,você )=( eu ( x+1 ,você )-eu ( x-1 ,você )2+( eu ( x ,sim+1 )-eu ( x ,sim-1 ) )2

θ ( x , y ) = arctan ( L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) ) θ (x, y) =arctan(\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)})θ ( x ,você )=um arco t um (eu ( x+1 ,você )-eu ( x-1 ,você )eu ( x ,sim+1 )-eu ( x ,sim-1 ))

Os resultados do cálculo do gradiente de pixel da vizinhança são mostrados na figura abaixo:
Insira a descrição da imagem aqui

Depois de concluir o cálculo do gradiente do ponto-chave, use o histograma para contar a amplitude do gradiente e a direção dos pixels na vizinhança do ponto-chave. O método específico é converter 360° 360°360° é dividido em36 3636 colunas, a cada10° 10°10° é uma coluna e, em seguida, na área com r como raio, encontre os pixels cuja direção do gradiente está em uma determinada coluna e, em seguida, some suas amplitudes como a altura da coluna. Como a contribuição da amplitude do gradiente dos pixels para o pixel central na área com raio r é diferente, a amplitude precisa ser ponderada, usando ponderação gaussiana com uma variância de 1,5σ1,5σ1,5σ . _ Conforme mostrado na figura abaixo, apenas 8 8é desenhado para simplificar a figura.Histograma em 8 direções.
Insira a descrição da imagem aqui
Cada ponto característico deve receber uma direção principal e uma ou mais direções auxiliares. O objetivo de adicionar direções auxiliares é aumentar a robustez da correspondência de imagens. A definição da direção auxiliar é que quando a altura de um cilindro é maior que 80% da altura do cilindro da direção principal, a direção representada pelo cilindro é a direção auxiliar do ponto característico.

O pico do histograma, ou seja, a direção representada pela coluna mais alta é a direção principal do gradiente da imagem na vizinhança do ponto característico, mas o ângulo representado pela coluna é um intervalo, portanto também precisamos realizar a interpolação ajustando-se ao histograma discreto, para obter um valor de ângulo de direção mais preciso. Use uma parábola para ajustar o histograma discreto, conforme mostrado na figura abaixo:

Insira a descrição da imagem aqui
Após obter a direção principal dos pontos-chave da imagem, cada ponto-chave possui três informações (x, y, σ, θ) (x, y, σ, θ)( x ,sim ,é ,θ ) : posição, escala, direção. A partir disso podemos determinar umSIFT SIFTÁrea característica S IFT . SIFTé geralmente representado por um círculo com uma seta ou uma seta diretamenteExistem três valores na área SI FT : o centro representa a localização do ponto característico, o raio representa a escala do ponto-chave e a seta representa a direção . Como mostrado abaixo:
Insira a descrição da imagem aqui

1.1.5 Descrição dos pontos principais

Através das etapas acima, cada ponto-chave recebe informações de posição, escala e orientação. Em seguida, construímos um descritor para cada ponto-chave que seja distinguível e invariável a certas variáveis, como iluminação, ângulo de visão, etc. Além disso, o descritor inclui não apenas os pontos-chave, mas também os pixels que circundam os pontos-chave que contribuem para isso. A ideia principal é abstrair as informações da imagem dividindo a área da imagem ao redor do ponto-chave em blocos, calculando o histograma de gradiente dentro do bloco e gerando um vetor de características.

O descritor está relacionado à escala em que o ponto característico está localizado, portanto geramos o descritor correspondente na imagem em escala gaussiana onde o ponto chave está localizado. Tomando o ponto característico como centro, divida sua vizinhança próxima em d ∗ dd∗ddd sub-região (geralmented = 4 d=4d=4 ), cada sub-região é um quadrado com comprimento lateral3σ 3σ3 σ , considerando que no cálculo real, a interpolação linear cúbica é necessária, então a vizinhança do ponto característico é3 σ ( d + 1 ) ∗ 3 σ ( d + 1 ) 3σ(d+1)∗3σ(d+1)( d _+1 )( d _+1 ) , conforme mostrado na figura abaixo:
Insira a descrição da imagem aqui
Para garantir a invariância de rotação do ponto característico, tome o ponto característico como centro e gire o eixo de coordenadas na direção principal do ponto chave, conforme mostrado na figura abaixo: Calcule o gradiente dos
Insira a descrição da imagem aqui
pixels na sub-região, E de acordo comσ = 0,5 d σ=0,5dp=A ponderação gaussiana é realizada a 0,5 d e, em seguida, o cálculo da interpolação é realizado para obter o gradiente em oito direções de cada ponto semente. O método de interpolação é mostrado na figura abaixo:
Insira a descrição da imagem aqui

O gradiente de cada ponto semente é composto por 4 4 cobrindo-oÉ obtido por interpolação de 4 sub-regiões. Como o ponto vermelho na imagem cai em0 0Linha 0 e1 11 linha, contribui para ambas as linhas. Certo0 0Linha 0 3 3O fator de contribuição das 3 colunas de pontos iniciais édr drd r , para o nº1 1O fator de contribuição da linha 1 e coluna 3 é1 − dr 1-dr1-d r , da mesma forma, o fator de contribuição para as duas colunas adjacentes édc dcd c1 − dc 1-dc1-d c , o fator de contribuição para as duas direções adjacentes édo dod o1 − faça 1-faça1-faça . _ Então o gradiente final acumulado em cada direção é:

peso = w ∗ drk ( 1 − dr ) 1 − kdcm ( 1 − dc ) 1 − mdon ( 1 − do ) 1 − n peso=w*dr^{k}(1-dr)^{1-k}dc ^{m}(1-dc)^{1-m}faça^{n}(1-faça)^{1-n}nós pensamos _ _ _ _=cdr _k (1-d.r ) _1 k dcm (1-d -c )1 m don (1-faça ) _1 - n

onde k, m, nk, m, nk , m , n são0 00 ou1 11 . As estatísticas acima de 4*4*8=128 informações de gradiente são os vetores de características dos pontos-chave. Ao classificar os vetores de características de cada ponto-chave de acordo com os pontos de características, o vetor de descrição de características SIFT é obtido.

1.1.6 Resumo

PENEIRA PENEIRAO SIFT tem vantagens incomparáveis ​​na extração de recursos invariantes de imagens, mas não é perfeito. Ele ainda apresenta deficiências, como baixo desempenho em tempo real, às vezes menos pontos de recursos e a incapacidade de extrair pontos de recursos com precisão para alvos com bordas suaves. Desde SIFTPeneirarDesde o advento do algoritmo SIFT , as pessoas têm o otimizado e melhorado, sendo o mais famoso deles oSURF SURFAlgoritmo S U RF .

1.2 Princípio SURF

Usando SIFT SIFTA velocidade de execução do algoritmo SIFT para detecção e descrição de pontos-chave é relativamente lenta e é necessário um algoritmo mais rápido . Em 2006, Bay propôsSURF SURFAlgoritmo S U RF , éSIFT SIFTUma versão aprimorada do algoritmo SIFT . Possui poucos cálculos e alta velocidade de operação. Os recursos extraídos são semelhantes aoSIFT. SIFTS I FT é quase o mesmo, compare comSIFT SIFTA comparação do algoritmo SI FT é a seguinte :

Insira a descrição da imagem aqui

1.3 Implementação

O processo de uso do SIFT para detectar pontos-chave no OpenCV é o seguinte:

1. Instanciar peneira
sift = cv.xfeatures2d.SIFT_create()
2. Use sift.detectAndCompute() para detectar pontos-chave e calcular
kp,des = sift.detectAndCompute(gray,None)

parâmetro:

  • gray: Imagem para detecção de ponto-chave, observe que é uma imagem em tons de cinza

retornar:

  • kp: Informações de pontos-chave, incluindo informações de posição, escala e direção
  • des: Descritor de ponto-chave, cada ponto-chave corresponde a 128 vetores de características de informações de gradiente
3. Desenhe os resultados da detecção do ponto-chave na imagem
cv.drawKeypoints(image, keypoints, outputimage, color, flags)

parâmetro:

  • image: A imagem original
  • keypoints: Informações de pontos-chave, desenhadas na imagem
  • outputimage: Imagem de saída, que pode ser a imagem original
  • color: Configuração de cor, (b,g,r)altere a cor do pincel modificando o valor b=azul, g=verde, r=vermelho.
  • flags: Configuração do logotipo da função de desenho
    1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:Crie uma matriz de imagem de saída, use a imagem de saída existente para desenhar pares correspondentes e pontos característicos e desenhe apenas os pontos intermediários para cada ponto-chave
    2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: não cria uma matriz de imagem de saída, mas desenha pares correspondentes na imagem de saída
    3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: desenhe um gráfico de ponto-chave com tamanho e direção para cada ponto característico
    4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS: Os pontos característicos de ponto único não são desenhados.

SURF SURFA aplicação do algoritmo S U RF é consistente com o processo acima e não será descrita em detalhes aqui.

Exemplo:

Aproveitando o SIFT SIFTO algoritmo SIFT detecta pontos-chave nas imagens CCTV e os traça:

import cv2 as cv 
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./image/tv.jpg')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 sift关键点检测
# 2.1 实例化sift对象
sift = cv.xfeatures2d.SIFT_create()

# 2.2 关键点检测:kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
kp,des=sift.detectAndCompute(gray,None)
# 2.3 在图像上绘制关键点的检测结果
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 3 图像显示
plt.figure(figsize=(8,6),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('sift检测')
plt.xticks([]), plt.yticks([])
plt.show()

resultado:

Insira a descrição da imagem aqui


Resumir

Princípio SIFT:

  • Detecção de valor extremo do espaço de escala: construa pirâmide gaussiana, pirâmide de diferença gaussiana e detecte pontos extremos.

  • Posicionamento de pontos-chave: remova a influência de pequenos contrastes e bordas em pontos extremos.

  • Determinação da direção do ponto-chave: Use o histograma de gradiente para determinar a direção dos pontos-chave.

  • Descrição do ponto-chave: divida a área da imagem ao redor do ponto-chave em blocos, calcule o histograma de gradiente dentro do bloco, gere um vetor de recursos e descreva as informações do ponto-chave.

API:cv.xfeatures2d.SIFT_create()

Algoritmo SURF:

As melhorias no algoritmo SIFT incluem melhorias na detecção de valores extremos do espaço de escala, determinação da direção do ponto-chave e descrição do ponto-chave, melhorando a eficiência.

Acho que você gosta

Origin blog.csdn.net/m0_51366201/article/details/132650027
Recomendado
Clasificación