Como implementar uma transformação Hough baseada em gradiente

9

Estou tentando usar a transformação Hough para detecção de borda e gostaria de usar imagens de gradiente como base.

O que tem feito até agora, dada a imagem Ide tamanho [M,N]e seus derivados parciais gx, gy, é calcular o ângulo de inclinação em cada pixel como thetas = atan(gy(x,y) ./ gx. Da mesma forma, eu calculo a magnitude do gradiente como magnitudes = sqrt(gx.^2+gy.^2).

Para criar a transformação Hough, eu uso o seguinte código MATLAB:

max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
    for y=1:N
        theta = thetas(x,y);
        rho = x*cos(theta) + y*sin(theta);

        rho_idx = round(rho)+max_rho;
        theta_idx = floor((theta + pi/2) / pi * 100) + 1;
        hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
    end
end

A transformação Hough resultante parece plausível (consulte http://i.stack.imgur.com/hC9mP.png ), mas quando tento usar seus máximos como parâmetros de aresta na imagem original, os resultados parecem mais ou menos aleatórios. Fiz algo errado na construção da transformação Hough?

ATUALIZAR : Eu tive um erro estúpido no meu código: rhofoi calculado como em x*cos(theta)+y*cos(theta)vez de x*cos(theta)+y*sin(theta). Ou seja, eu estava usando dois cossenos em vez de um cosseno e um seno. Editei o código acima e a nova imagem resultante está abaixo. Isso não deu arestas muito melhores.

@endolith: Para plotar uma aresta, dado um valor máximo na houghmatriz-emrho_idx, theta_idx , eu traduzo os índices para rho,thetavalores:

theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;

Finalmente eu traço a borda como y= (rho - x*cos(theta)) / sin(theta).

Novo resultado

Jonas Due Vesterheden
fonte
"quando tento usar seus máximos como parâmetros de borda na imagem original" Como você está fazendo isso?
endolith 27/10
@ Jonas Devido Vesterheden Basta saber é esta imagem de frequência doppler um VS tempo ...?
Spacey
@ Mohamed: Não que eu saiba. A imagem original é de alguma placa de circuito. O que você quer dizer com "VS"?
Jonas Devido Vesterheden
@JonasDueVesterheden 'VS' significa apenas 'versus'. (Time versus doppler frequency ') :-)
Spacey
Você deve suavizar seu mapa de área antes de aplicar a supressão Não máx.

Respostas:

2

Estou um pouco confuso com sua pergunta. A transformação Hough é usada para detectar linhas, não arestas.

Se tudo o que você deseja é um mapa de bordas, basta limitar a magnitude do gradiente ou usar algo mais sofisticado, como o detector de bordas Canny.

Se você deseja detectar linhas retas, seria melhor começar com um mapa de arestas e depois usar o hough função se a caixa de ferramentas Processamento de imagem, se você tiver acesso a ela. O problema ao fazer uma transformação de Hough no gradiente é que os pixels da borda que formam uma linha reta podem ter orientações opostas ao gradiente. Por exemplo, considere um padrão quadriculado. Uma aresta entre duas linhas de quadrados inverte a orientação, dependendo se você tem um quadrado preto acima e um quadrado branco abaixo ou o contrário.

Quanto à sua implementação, acho que o problema é que os compartimentos em sua matriz Hough são muito pequenos. Essencialmente, o tamanho do compartimento na dimensão rho é 1 e o tamanho do compartimento na dimensão teta é inferior a 2 graus. Isso significa que as orientações do gradiente devem descer com muita precisão para formar uma linha, o que raramente acontece na prática. Se você calcular rho_idx e theta_idx para que os compartimentos sejam maiores, isso tornará seu detector de linha mais tolerante a erros e poderá obter melhores linhas.

Dima
fonte
1

Não tenho idéia se isso é um problema, mas atan () apenas fornece ângulos de -90 a +90 graus por causa da ambiguidade do quadrante. Para obter o ângulo completo do gradiente (de -180 a 180), use atan2 ().

Hilmar
fonte
Obrigado pela sugestão! Pelo que entendi, deve ser suficiente usar os ângulos de -90 a +90 graus, pois as "direções" das arestas não importam. Eu tentei usar atan2, mas não pareceu corrigir os problemas.
Jonas Due Vesterheden