2013-03-23 1 views
0

정확하게 작동하는지 이해하려고합니다.행에 대한 허프 (Hough) 변환 이해하기

모든 에지 픽셀에 대해 모든 에지 픽셀을 찾아 누적 기 어레이 값 (기울기와 y 절편에 해당)을 1 씩 위로 늘립니다. 많은 엣지 포인트들을 통과하는 것은 accumulator 배열에서 많은 득표를 가질 것입니다.

내가 이해할 수없는 것은 구현을 위해 찾은 코드에 있습니다. 첫째, 가장자리 감지기가 적용된 후 에지 픽셀이 0이 아닌 값을 가지며 가장자리가 0이 아닌 것으로 가정 할 수 있다고 생각합니다. 내 교과서의 코드에서 프로그램은 0 점이있는 모든 점을 검색하고, 통과하는 모든 라인에 대해 해당 누적 기 값을 1 씩 증가시킵니다. 빈 포인트가 아닌 가장자리 포인트 (NON-ZERO)를 통과하는 라인을 찾지 않을 것이라고 생각 했습니까? 누군가이 부분을 나에게 설명 할 수 있습니까?

다음은 이미지 처리 교과서에서 찾은 Matlab 코드입니다. 나는 C++로 작업하면서 테스트하지 않았다. % 메시지는 특정 행의 기능을 이해하고 있습니다.

function HTline(inputimage) 

[rows,columns] = size(inputimage); 

acc1 = zeros(rows,91); 
acc2 = zeros(columns,91); 

for x = 1:columns 
    for y = 1:rows 
    if(inputimage(x,y)==0     %If pixel=0, i.e., non-edge 
     for m = -45:45      %For a certain range of slope values 
     b = round(y-tan((m*pi)/180)*x); %Calculate y-intercept for slope values 
     if (b<rows & b>0)     %If y-intercept is within the image height 
      acc1(b,m+45+1)=acc1(b,m+45+1)+1; %Increase accumulator values. What? 
     end 
     end 
     for m=45:135       %etc 
     b=round(x-y/tan((m*pi)/180)); 
     if(b<columns & b>0) 
      acc2(b,m-45+1)=acc2(b,m-45+1)+1; 
     end 
     end 
    end 
    end 
end 

답변

0

윌리엄은 가장자리가 어디에 위치하는지 정의하는 방법에 따라 다릅니다. 일반적으로 이미지는 바이너리 마스크로 변환되고 가장자리 값은 trues (1s)로 저장되고 가장자리 값이 아닌 값은 false (0s)로 저장되므로 염려스러운 것처럼 보입니다. 어쩌면 당신이 당신의 책에서 약간의 문맥이나 의역을 추가 할 수 있다면 어쩌면 그들은 왜 엣지 값에 false (0)을 사용하는지에 대한 타당성을 제시 할 수 있지만, 다른 표현보다 유리하다. 그것은 단순히 대회입니다.

당신이 hough 변환을하는 방식은 오래된 기법이라는 것을 유의하십시오. 대부분의 현대 기술은 선이 수직 인 상황을 설명하기 위해 "정상적인 발"매개 변수화 (ρ/세타)를 사용합니다. 또한 일부는 소벨 필터를 사용하여 선의 법선 방향을 가리키는 가장자리 점의 그라디언트 벡터를 직접 계산합니다. 이렇게하면 (코드에서와 같이) 이러한 점을 통과하는 모든 선의 가능성을 계산하는 대신 에지 점에 대한 단일 ρ/Θ 값을 직접 계산할 수 있습니다.

그러나 어쨌든, 귀하의 경우, 기울기와 절편을 사용하여 선을 매개 변수화하십시오. 이 값은 비닝 된 다음 코드에 표시된 것처럼 누산기에 배치됩니다. 단일 에지 점의 경우 무한 수의 선이 통과 할 수 있지만이 선은 사면과 절편의 binned 값만 사용하여 유한하게 만듭니다. 귀하의 경우에는 경사면에 가능한 91 개의 값을 사용합니다. 동일 선상에있는 점은 다른 점보다 더 많은 값을 누적하는 특정 "상자"를 생성합니다. 어큐뮬레이터의 이러한 로컬 피크는 이미지 내에서 라인 (또는 가장자리 감지기가 사용되는 경우 가장자리)을 나타냅니다. 이에 대한 좋은 예가 hough transform에 대한 위키피디아 기사에 나와 있습니다. 바라기를 이것은 당신의 질문에 도움이되기를 바랍니다.

+0

불행히도이 책에서는 이해하기 쉽도록 개념을 설명하지만, 코드는 누적 기의 최대 값을 취하여 발견된다는 점을 제외하고는 많은 직접적인 참조없이 코드를 그림에 넣습니다. 따라서 검정색을 반전하지 않습니다. 화이트. 나는 학생이기 때문에 나는 틀렸다는 것을 믿을 의향이 있지만, 나는 C로 무엇인가를 만들고 무엇이 일어날지를 생각할 때라고 생각한다. 자세한 답장을 보내 주셔서 감사 드리며, 내가 말씀 드린 것을 계속 보관 해드릴 것입니다. – William

+0

@ 윌리엄 당신이 테스트하고 물건을 쉽게 될 것이므로 당신이 matlab에 이것을 밖으로 시도 해야할지 모르겠다면. 그러나 C가 당신의 것이라면 앞으로 나아가 야합니다. 또한, 내가 말했듯이, 당신이 위에서 쓴 코드가 낡은 것임을 알아라. 나는 실제로 머신 비전 클래스에서 rho/theta 매개 변수화 및 그래디언트/소블 메서드를 기반으로 한 hough 변환을 구현 한 코드를 가지고 있습니다. 나는 당신이 관심이 있다면 그것을 나의 대답에 덧붙일 수있다. 마지막으로, 내 대답이 귀하의 질문에 답변한다면 그것을 수락하는 것이 좋습니다. – Justin

+0

나는 아마 C를 고수하고 내 자신의 페이스대로 조금씩 배울 것이다. 그러나 어쨌든 고마워한다.Btw, 위의 내 의견에 오류가 실현, 어쩌면 실제로 흑백 반전했다. 죄송합니다 수락 잊어 버렸습니다! – William