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 I
de 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: rho
foi 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 hough
matriz-emrho_idx, theta_idx
, eu traduzo os índices para rho,theta
valores:
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)
.
fonte
Respostas:
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.
fonte
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 ().
fonte
atan2
, mas não pareceu corrigir os problemas.