2014-10-22 2 views
0

데이터 세트가 있고 Y 축과 평행 한 선을 형성하는 점을 그룹화하고 싶습니다 (이미지 참조). 나는 그것을 할 수있는 방법은 Hough 변환을 사용하는 것입니다; Matlab에서 어떻게하는지에 대한 제안이 있습니까? 감사! 음이 상기 제한 만, 전체 허프 변환은 Y 축에 평행 한 선을 검출Hough transfrom을 사용하여 선을 형성하는 점을 찾으십시오

enter image description here

+2

의견이 어디에 있습니까? 당신이 나에게 진실을 말하도록 요구했다면 나는 당혹 스러울 것이다. –

+0

선은 Y 축과 평행해야합니다. 나는 그 질문을 갱신했다. –

+3

당신의 선택은 다소 임의적이며 2 가지 경우를 보여주는 것만으로는 충분하지 않습니다. 모든 라인을 보여줄 수 있습니까? [내 생각에 당신은 단지 재현 할 수없는 방법입니다.] 정확하게 수직 인 경우, 가장 먼저해야 할 일은 모든 포인트를 수평 크기로 투영하고 로컬 포인트 밀도를 관찰하는 것입니다. Parzen 창을 사용하여 배포 모드를 추정 할 수 있습니다. (사실 이것은 Hough 변환의 고정 된 각도 버전입니다.) –

답변

0

필요는 없다. 단지 x 축의 모든 점을 투영하여 그것들을 축적하고 봉우리를 찾으십시오.

%assuming you want a resolution of 0.01 covering x space from 0 to 1 
points = rand(1000,2); 
figure(1); 
plot(points(:,1),points(:,2),'b.'); 
minX = 0; 
maxX = 1; 
resolution = 0.01; 
xValues = minX:resolution:maxX; 
accu = zeros(1,length(xValues)); 
for i = 1:length(points) 
    xVal = points(i,1); % access x value of point; 
    idx = round(((xVal-minX)/resolution))+1; 
    accu(idx) = accu(idx) +1; 
end 

이제 maximas를 검색 할 수있는 어큐뮬레이터가 있습니다.

[pks,idx] = findpeaks(accu); 

당신은 적어도 minPoints 점으로 최고점을 고려하는 것이 좋습니다 :

minPoints = 10; 
idx = idx(pks>minPoints); 

그럼 당신은 더이 라인을 처리 할 수 ​​있습니다 :

for i = 1:length(idx) 
    % select all points corresponding to line: 
    idc = abs(points(:,1)-xValues(idx(i))) < resolution/2; 
    pointsOnLine = points(idc,:); 
    figure(1); 
    hold on; 
    plot(pointsOnLine(:,1),pointsOnLine(:,2),'ro'); 
    minY = min(pointsOnLine(:,2)); 
    maxY = max(pointsOnLine(:,2)); 
    plot([xValues(idx(i)),xValues(idx(i))],[minY,maxY],'r-'); 
end 

는 큰 격차 당신을 줄을 제거하려면 sort()을 사용하여 y 값에 따라 포인트를 정렬 한 다음 diff으로 큰 점프를 찾을 수 있습니다.

관련 문제