2017-05-14 54 views
5

如您所知我正在處理圖像,此時我正面臨以下問題,我不知道如何測量在我附加的圖像中觀察到的線的直徑,我可以應用一點定理的畢達哥拉斯,但我不知道是否有可能在圖像中做到這一點,例如在這種情況下圖像有粗線條,但如果線條比可以做的更薄?如何獲取圖像中線條的直徑?

Example image

我想知道時的直徑線是孤獨的,因爲很明顯,當有交叉的直徑會改變,我給它下一個形象。

diameter

+1

你實際上是試圖找到交點真的嗎?也許考慮骷髏和尋找交叉點,而不是跳線的厚度。 –

回答

2

下面是在分辨率和厚度「足夠大」簡單的黑客:要估計你可以做2件事情之一厚度

在上線給定點:

1)跨越了從該點的線在0和180之間的每個角度,發現導致與原來的線的最短重疊線,這將是厚度

2)跨越了從那一點開始,每當圓不再與該線重疊時,將其重新居中以具有完全重疊。如果不可能將其重新對中,以至於您完全重疊,那麼您仍然可以重疊的直徑是您對線厚度的最佳估計值

1

顯示線厚度估計值的一種方法是若要使用bwdist計算線中每個點的最近邊的距離,則使用imdilate可以沿線的寬度平滑最大值(沿着線的中心運行)。然後,您可以選擇線上的一個點來查看其近似直徑(這將在直徑之間的轉換附近有點偏離,比如在連接處)。這裏有一個例子:

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 

而這裏的選中了某個點的圖像(「指數」值近似直徑):

enter image description here

+0

但是,如果我希望它是自動的,它會自行提取線的直徑,然後將其保存在列表或散列圖中(它知道哪個線標識符和它具有的厚度) – AlexZ

+0

@AlexZ:如果您想要爲了實現自動化,您需要更具體地瞭解您的工作方式。你打算在直徑要測量的線上提供點嗎?你是否想要在連接點處斷開線條,併爲每個線段完成單獨的直徑測量?該線的直徑是否應作爲沿其長度的最大或平均直徑報告? – gnovice