그라디언트 기반 Hough 변환을 구현하는 방법


9

가장자리 감지에 Hough 변환을 사용하려고하는데 그라디언트 이미지를 기본으로 사용하고 싶습니다.

I 화상은 주어진 지금까지 수행 한 어떤 I크기 [M,N]및 그 부분 유도체 gx, gy등의 각 화소에서의 기울기 각도를 산출한다 thetas = atan(gy(x,y) ./ gx. 마찬가지로 그라디언트 크기를로 계산합니다 magnitudes = sqrt(gx.^2+gy.^2).

Hough 변환을 구축하기 위해 다음 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

결과 Hough 변환은 그럴듯 해 보이지만 ( http://i.stack.imgur.com/hC9mP.png 참조 ) 원래 이미지에서 최대 값을 가장자리 매개 변수로 사용하려고하면 결과가 다소 무작위로 나타납니다. Hough 변환을 구성 할 때 잘못된 점이 있습니까?

업데이트 : 내 코드에서 바보 같은 실수가 발생했습니다 . 대신 rho로 계산되었습니다 . 즉, 나는 코사인과 사인 대신 두 개의 코사인을 사용하고있었습니다. 위의 코드를 편집했으며 새로운 결과 이미지가 아래에 있습니다. 그러나 이것은 훨씬 더 나은 가장자리를 제공하지 않았습니다.x*cos(theta)+y*cos(theta)x*cos(theta)+y*sin(theta)

@endolith :에서 hough-matrix 의 최대 값을 고려하여 모서리를 표시하기 rho_idx, theta_idx위해 색인을 rho,theta값으로 변환 합니다.

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

마지막으로 가장자리를로 표시 y= (rho - x*cos(theta)) / sin(theta)합니다.

새로운 결과


"원래 이미지에서 최대 값을 가장자리 매개 변수로 사용하려고하면 어떻게됩니까?"
endolith

@Jonas Due Vesterheden이 시간 VS 도플러 주파수 이미지가 궁금하십니까? ...
Spacey

@Mohammad : 내가 아는 것은 아닙니다. 원본 이미지는 일부 회로판입니다. "VS"는 무슨 뜻입니까?
Jonas Due Vesterheden

@JonasDueVesterheden 'VS'는 단지 '대'를 의미합니다. (시간 대 도플러 주파수 ') :-)
Spacey

비 최대 억제를 적용하기 전에 허프 맵을 부드럽게해야합니다.

답변:


2

나는 당신의 질문에 약간 혼란 스럽습니다. 거친 변형은 가장자리가 아닌 선을 감지하는 데 사용됩니다.

가장자리 맵만 있으면 그라디언트 크기를 임계 값으로 설정하거나 캐니 가장자리 감지기와 같이 더 멋진 것을 사용해야합니다.

직선을 감지하려면 엣지 맵으로 시작한 다음 hough이미지 처리 도구 상자에 액세스 할 수있는 경우이 기능 을 사용하는 것이 좋습니다. 그래디언트에서 Hough 변환을 수행 할 때의 문제는 직선을 형성하는 가장자리 픽셀이 반대 방향으로 그래디언트 방향을 가질 수 있다는 것입니다. 예를 들어, 바둑판 패턴을 고려하십시오. 두 정사각형 행 사이의 가장자리는 위의 검은 사각형과 아래에 흰색 사각형이 있는지 여부에 따라 방향이 바뀝니다.

구현과 관련하여 문제는 Hough 매트릭스의 빈이 너무 작다는 것입니다. 기본적으로 rho 치수의 빈 크기는 1이고 세타 치수의 빈 크기는 2 도보 다 작습니다. 즉, 그라디언트 방향은 선을 형성하기 위해 매우 정확하게 비춰 져야하며, 실제로는 거의 발생하지 않습니다. 빈이 더 커지도록 rho_idx 및 theta_idx를 계산하면 라인 감지기가 오류에 더 견딜 수 있고 더 나은 라인을 얻을 수 있습니다.


1

나는 이것이 문제인지 아닌지는 모르지만 atan ()은 사분면 모호성 때문에 -90에서 +90 도의 각도 만 제공합니다. 전체 경사각 (-180에서 180까지)을 얻으려면 atan2 ()를 사용해야합니다.


제안 해 주셔서 감사합니다! 내가 이해하는 것처럼 가장자리의 "방향"은 중요하지 않기 때문에 -90에서 +90 도의 각도를 사용하는 것으로 충분합니다. 을 사용해 보았지만 atan2문제를 해결하지 못하는 것 같습니다.
Jonas Due Vesterheden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.