2017-05-14 1 views
5

이미지로 작업 중임을 알리는 순간, 다음과 같은 문제에 직면하고 있습니다. 이미지에 보이는 선의 지름을 측정하는 법을 알지 못합니다. 약간의 정리를 적용 할 수 있습니다. 피타고라스의 경우, 그러나 나는 이미지에서 그것을 할 수 있는지, 예를 들어,이 경우에는 이미지가 두꺼운 선을 할 수 있는지 모르겠지만, 라인이 더 얇은 경우에 할 수 있습니까?이미지에서 선의 직경을 얻는 방법은 무엇입니까?

Example image

는 직경이 변경됩니다 크로스있을 때, 나는 다음 이미지에서 보여 것이 분명하기 때문에 선이 혼자있을 때 나는 직경을 알고 싶습니다. 라인에 주어진 지점에서

당신이 두 가지 중 하나를 수행 할 수 있습니다 두께를 추정 할 : 여기

diameter

+1

당신은 실제로 정말 교차점을 찾을하려고 :

img = imread('qGs5t.png'); % Load RGB image bw = ~im2bw(img); % Convert to black and white and invert bw = imclose(bw, strel('disk', 3)); % Morphological close to remove noise distImage = bwdist(~bw); % Distance transform maxDist = double(max(distImage(:))); % Find maximum distance measure diamImage = 2.*bw.*imdilate(distImage, strel('disk', floor(maxDist))); % Dilate and mask imagesc(diamImage); % Display image colorbar; % Display color bar dcmObj = datacursormode(gcf); % Create data cursor object... set(dcmObj, 'Enable', 'on'); % ... and enable to select points 

그리고 여기에서 선택한 점과 이미지의 (이하 "인덱스"값은 대략 직경입니다)? 어쩌면 라인 두께에서 점프하는 것보다는 골격을 세우고 교차점을 찾는 것을 고려해보십시오. –

답변

2

해상도와 두께가 "충분한"경우에 대한 간단한 해킹은 :

1)가 0과 180 사이의 모든 각도에서 그 시점에서 회선을 스팬과 원래 라인 짧은 오버랩 결과 광고를 찾아 그 두께

2) 스팬에게있을 것이다원이 그 선과 더 이상 겹치지 않을 때마다 다시 중점을 두어 완전히 겹치게하십시오. 다시 중점을 두어 더 이상 중심을 재조정 할 수없는 경우 오버랩이있는 직경이 가장 좋은 선 두께입니다.

1

선 두께를 표시하는 한 가지 방법은 다음과 같습니다. bwdist을 사용하여 선의 각 점에 대해 가장 가까운 모서리까지의 거리를 계산 한 다음 imdilate을 사용하여 선의 폭을 가로 질러 최대 값 (선의 중심을 따라 실행)을 부드럽게 만듭니다. 그런 다음 선상의 점을 선택하여 대략적인 직경을 볼 수 있습니다 (조인과 같이 지름 사이의 전환 근처에서 약간 벗어납니다). 다음은 예입니다 :

enter image description here

+0

하지만 자동으로 원한다면 줄의 직경을 단독으로 추출한 다음 목록 또는 해시 맵에 저장하십시오 (어떤 줄 식별자인지 어떤 두께인지 알고 있음) – AlexZ

+0

@AlexZ : 원한다면 그것을 자동화하기 위해서는, 당신이 원하는 방식에 대해 더 구체적으로해야 할 것입니다. 지름을 측정 할 선을 따라 점을 제공 할 예정입니까? 각 라인이 결합 된 지점에서 선이 끊어 지도록하고 각 세그먼트에 대해 별도의 직경 측정을 수행 하시겠습니까? 선의 직경이 그 길이를 따라 최대 또는 평균 직경으로보고되어야 하는가? – gnovice

관련 문제