Pergunta

Eu tenho usado o SIFT implementação de < a href = "http://www.vlfeat.org/overview/sift.html" rel = "nofollow noreferrer"> Andrea Vedaldi , para calcular os descritores Sift de duas imagens semelhantes (a segunda imagem é efectivamente uma imagem ampliada do mesmo objecto a partir de um ângulo diferente).

Agora, eu não sou capaz de descobrir o como comparar os descritores de dizer o quão semelhantes as imagens são ?

Eu sei que esta questão não é responsável a menos que você realmente ter jogado com este tipo de coisas antes, mas eu pensei que alguém que tenha feito isso antes pode conhecer este , então eu postei a pergunta.

o pequeno eu fiz para gerar os descritores:

>> i=imread('p1.jpg');
>> j=imread('p2.jpg');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i);  % a has the frames and b has the descriptors
>> [c, d]=sift(j);
Foi útil?

Solução

Em primeiro lugar, você não deveria estar usando vl_sift vez de peneira?

Em segundo lugar, você pode usar SIFT correspondência recurso para encontrar correspondências nas duas imagens. Aqui está um código de exemplo:

    I = imread('p1.jpg');
    J = imread('p2.jpg');

    I = single(rgb2gray(I)); % Conversion to single is recommended
    J = single(rgb2gray(J)); % in the documentation

    [F1 D1] = vl_sift(I);
    [F2 D2] = vl_sift(J);

    % Where 1.5 = ratio between euclidean distance of NN2/NN1
    [matches score] = vl_ubcmatch(D1,D2,1.5); 

    subplot(1,2,1);
    imshow(uint8(I));
    hold on;
    plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');

    subplot(1,2,2);
    imshow(uint8(J));
    hold on;
    plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');

vl_ubcmatch () essencialmente faz o seguinte:

Suponha que você tenha um ponto P na F1 e você quer encontrar o "melhor" jogo em F2. Uma maneira de fazer isso é comparar o descritor de P na F1 para todos os descritores em D2. Ao comparar, quero dizer encontrar a distância euclidiana (ou o L2-norma da diferença dos dois descritores).

Então, acho que dois pontos em F2, dizem L & V, que tem o menor e segunda menor distância (por exemplo, Du e DV) de P, respectivamente.

Aqui está o que Lowe recomenda: se Dv / Du> = limiar (eu usei 1,5 no código de exemplo), então este jogo é aceitável; Caso contrário, é ambiguamente combinados e é rejeitado como uma correspondência e nós não correspondem qualquer ponto F2 para P. Essencialmente, se há uma grande diferença entre os melhores e segunda melhores partidas, você pode esperar que este seja um jogo de qualidade.

Isto é importante uma vez que há um monte de espaço para jogos ambíguas em uma imagem:. Imaginar pontos combinando em um lago ou um edifício com várias janelas, os descritores podem ser muito parecidas, mas a correspondência é obviamente errado

Você pode fazer a correspondência em qualquer número de maneiras .. você pode fazê-lo muito facilmente com MATLAB ou você pode acelerá-lo usando um KD-árvore ou uma busca pelo número mais próximo aproximada como FLANN que foi implementado em OpenCV .

EDIT: Além disso, há várias implementações kd-árvores em MATLAB

Outras dicas

Você deve ler papel de David Lowe, que fala sobre como para fazer exatamente isso. Deve ser suficiente, se você quiser comparar imagens de exato o mesmo objeto. Se você quiser combinar imagens de diferentes objectos da mesma categoria (por exemplo, carros ou aviões) você pode querer olhar para o Pyramid Jogo Kernel por Grauman e Darrell.

Tentar comparar cada descritor a partir da primeira imagem com descritores do segundo situado em uma estreita proximidade (usando a distância euclidiana). Assim, você atribui uma pontuação para cada descritor a partir da primeira imagem com base no grau de semelhança entre ele e o descritor vizinho semelhante mais a partir da segunda imagem. A medida estatística (soma, média, dispersão, erro médio, etc) de todas essas pontuações lhe dá uma estimativa de quão semelhantes as imagens são. Experimente com diferentes combinações de tamanho de vizinhança e medida estatística para lhe dar a melhor resposta.

Se você quiser apenas comparar imagem ampliada e girado com o centro conhecido de rotação você pode usar correlação de fase em coordenadas log-polar. Por nitidez de pico e histograma de correlação de fase você pode julgar quão perto as imagens são. Você também pode usar distância euclidiana em valor absoluto de coeficientes de Fourier.

Se você quer comparar descritor SIFT, ao lado de distância euclidiana você também pode usar "distância difusa" - ficando descritor na escala progressivamente mais áspera e concatenando-los com descritor originais. Essa semelhança recurso caminho "grande escala" teria mais peso.

Se você quiser fazer a correspondência entre as imagens, você deve usar vl_ubcmatch (no caso de você não tê-lo usado). Você pode interpretar a saída de 'pontuação' para ver o quão perto as características são. Isto representa o quadrado da distância euclidiana entre o descritor de recurso dois correspondente. Você também pode variar o limiar entre a melhor correspondência e 2º melhor jogo como entrada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top