2017-03-31 43 views
1

我用這個代碼創建了一個黑色的正方形,中間有一條白色的垂直線,我想創建一個關於這條線的距離地圖,但只在左側垂直線。我怎樣才能做到這一點?創建一個單側距離地圖

以下代碼會在行的兩側生成距離圖。

c=zeros(500,500); 
c(:,250)=1; 
figure, imshow(c) 

[D, idx]= bwdist(c,'euclidean') 

回答

2

可以計算整個圖像的距離圖,然後就零出(或值設置爲NaN)你不感興趣的

D = bwdist(c, 'euclidean'); 
D(:,251:end) = NaN; 

更健壯的側面在調用bwdist之前,將行的右側的任何內容設置爲1,以便每個像素的結果距離爲0,方法(不對任何列進行硬編碼)將被修改爲c。您可以通過跨行

D = bwdist(cumsum(c, 2) > 0, 'euclidean'); 

enter image description here

0

實際計算累積和做到這一點,這個問題可能會被要求在不同的和具有挑戰性的方式。如果我有不同的輸入形狀(不是單列線),以及如果我想要在特定角度間隔(而不僅僅是左側)中找到距離圖,該怎麼辦?這是我的解決方案。找到輸入形狀的(x,y)座標,然後爲每個像素在特定方向+方向間隔中找到一個遮罩。這是功能。

function mask = directional_mask(im, mainDirection, dirInterval) 

% im: BW input image 
% mainDirection : mask direction (in degrees) 
% dirInterval: mask direction interval (from dirMask-dirInterval to dirMask+dirInterval) 

[Ys, Xs] = find(im); 

[sizeX, sizeY] = size(im); 

[X, Y] = meshgrid(1:sizeX,1:sizeY); 

mask = im * 0; 

for i = 1 : numel(Xs) 

    refX = Xs(i); 
    refY = Ys(i); 

    [theta, ~] = cart2pol(X-refX, Y-refY); 

    % adding pi/2 so that north angle is 0 degree 
    dirmat = wrapTo2Pi(theta + pi/2); 
    dirmat = rad2deg(dirmat); 

    % upper and lower direction intervals 
    thetaUp = mainDirection + dirInterval; 
    thetaDown = mainDirection - dirInterval; 

    dirmat2 = dirmat(:); 

    % finding indices of the angle intervals 
    thetas = [thetaUp, thetaDown]; 
    if thetaUp >= 360 
     thetaUp = thetas(1) - 360; 
     thetaDown = thetas(2); 
     dirmat2((dirmat2>thetaUp) & (dirmat2<thetaDown)) = nan; 
    elseif thetaDown < 0 
     thetaUp = thetas(1); 
     thetaDown = thetas(2) + 360; 
     dirmat2((dirmat2>thetaUp) & (dirmat2<thetaDown)) = nan; 
    else 
     dirmat2((dirmat2>thetaUp) | (dirmat2<thetaDown)) = nan; 
    end 

    % final mask 
    tmp = im*0; 
    tmp(~isnan(dirmat2)) = 1; 

    mask = mask | tmp; 

end 

mask = double(mask); 

然後讓我們說我有一個像下面這樣的輸入圖像,我想計算45度的距離圖。

im=zeros(100); 
for i=35:65; im(i,i)=1; end 
im2=imrotate(im,60); im=imresize(im2,size(im)); im=im~=0; 

mainDirection = 45; 
dirInterval = 5; 
[mask] = directional_mask(im, mainDirection, dirInterval); 

% original distance map 
d = bwdist(im); 

% directional distance map 
d2 = mask.*d; 

figure; 
subplot(131); imagesc(mask+2*im), axis image; colorbar; title('Mask + Orig. Input') 
subplot(132); imagesc(d), axis image; colorbar; title('Initial Distance Map') 
subplot(133); imagesc(d2), axis image; colorbar; title('Directional Distance Map') 
set(findall(gcf,'-property','FontSize'),'FontSize',16) 

enter image description here

比方說,我想距離映射朝180度。只是改變了 「mainDirection」

mainDirection = 180; 

enter image description here

讓我們來試試不同的形狀。

im=zeros(100); 
im(40:60,40:60)=1; im2=imrotate(im,30);im=imresize(im2,size(im)); im=im~=0; 

mainDirection = 180; 
dirInterval = 5; 

enter image description here

如果你想在一個特定的方向間隔口罩(THETA + -interval),只是改變了 「dirInterval」。下面是一個例子

mainDirection = 180; 
dirInterval = 30; 

enter image description here

在原來的問題,@Mac想掩蔽朝向左側的距離圖。然後:

im=zeros(100); im(:,50)=1; 

mainDirection = 270; 
dirInterval = 90; 

enter image description here