2012-11-06 4 views
4

두 선의 교차점 사이에있는 픽셀 값을 찾아야합니다. 다음 이미지는 내가 원하는 지점, 즉 갈색 영역을 보여줍니다.두 개의 교차하는 선 사이의 픽셀

이러한 4 개의 좌표는 변경 될 수 있으며 꼭 꼭지점은 아닙니다.

enter image description here

픽셀 값을 얻을 수있는 가장 빠른 방법은 무엇입니까? 필요한 마스크를 줄 수있는 기능이 있습니까?

+0

항상 한 줄 아래의 영역과 다른 영역보다 위의 영역을 원하십니까? 한 라인의 왼쪽과 다른 라인의 오른쪽은 어떨까요? 그것들은 또한 라인 사이에있다. – Isaac

+0

갈색 영역을 원합니다 ... – anon

+0

선은 항상 이미지의 대각선입니까? – Junuxx

답변

6

각 점에 대해 줄 위 또는 아래에 있는지 계산해야합니다. 그 라인이 방정식 형태 Ax+By+C으로 주어진다면,이 표현식의 부호를 계산하는 것만 큼 간단합니다. (x,y). 당신의 라인이 다른 형태로 주어지면, 먼저 위의 폼을 계산해야합니다.

하자가 첫 번째 줄 아래에있는 모든 점들의 집합 L1 (herehere 참조), 및 L2 두 번째 줄 아래에있는 모든 점의 집합. 그런 다음 집합입니다 X = Xor(L1,L2)

[enter image description here]이 Xor는 [enter image description here]

같음 : 여기

enter image description here

가 당신에게 문제를 해결하는 MATLAB 코드입니다 내가 지금까지 설명한 솔루션을 기반으로 한 코너 포인트. 코드에서 회선 방정식을 조정할 수 있습니다.

function CreateMask() 
    rows = 100; 
    cols = 200; 
    [X,Y] = ndgrid(1:cols,1:rows); 

    belowFirstLine = X*(1/cols) + Y*(-1/rows) + 0 < 0; 
    belowSecondLine = X*(-1/cols) + Y*(-1/rows) + 1 < 0; 

    figure;imshow(transpose(xor(belowSecondLine,belowFirstLine))); 
end 
0

넌 X & Y 두 행렬 생성으로 시작 좌표 : 다음 하나 4 개 마스크에 X *는 + Y의 * B를 < C 변환 4 개 라인 방정식 필요

1 2 3 4 5  1 1 1 1 1 
1 2 3 4 5 vs. 2 2 2 2 2 sized as the region 
1 2 3 4 5  3 3 3 3 3 

: 대각선해야 XORED 및 위쪽/아래쪽 마스크 ANDED
또는 논리식 없음 : mask = mod (diag1 + diag2,2) * top_mask * bot_mask;

a와 b가 정규화되었다고 가정하면 선 폭의 'c'에 선의 폭을 더하여 제어 할 수 있습니다.

1

여기에는 분석적 솔루션이 아니라 기하학적 솔루션이 있습니다.

먼저 마스크 이미지를 구성해야합니다. 처음에는 모두 0으로 채워집니다. 그런 다음 Bresenham's algorithm을 사용하여 두 줄을 모두 그려야합니다. Matlab에는 기본 구현이 없지만 Matlab Central에서 하나를 선택할 수 있습니다. 이미지 테두리가있는 선과 교차하는 좌표가 있다고 가정합니다.

그런 다음 이미지가 4 개의 영역으로 나누어지고 bwfill을 사용하여 이미지를 두 개 채워야합니다. 그리고 지금 당신은 마스크를 가지고 있습니다.

+2

반드시 작동하지 않아도됩니다. 축축한 경우에 플러드 채우기가 반드시 채워질 단 하나 또는 두 개의 픽셀을 찾을 필요는 없습니다 (꼭 연결할 필요는 없습니다.) 또한이 대답은 포인트가 있다고 가정합니다. 적어도 반복적 접근법이 행렬보다 실제로 빠르다는 것을 의문의 여지가 있습니다. –

+0

모든 점에 동의하십시오. – Mikhail

관련 문제