我用這個代碼創建了一個黑色的正方形,中間有一條白色的垂直線,我想創建一個關於這條線的距離地圖,但只在左側垂直線。我怎樣才能做到這一點?創建一個單側距離地圖
以下代碼會在行的兩側生成距離圖。
c=zeros(500,500);
c(:,250)=1;
figure, imshow(c)
[D, idx]= bwdist(c,'euclidean')
我用這個代碼創建了一個黑色的正方形,中間有一條白色的垂直線,我想創建一個關於這條線的距離地圖,但只在左側垂直線。我怎樣才能做到這一點?創建一個單側距離地圖
以下代碼會在行的兩側生成距離圖。
c=zeros(500,500);
c(:,250)=1;
figure, imshow(c)
[D, idx]= bwdist(c,'euclidean')
實際計算累積和做到這一點,這個問題可能會被要求在不同的和具有挑戰性的方式。如果我有不同的輸入形狀(不是單列線),以及如果我想要在特定角度間隔(而不僅僅是左側)中找到距離圖,該怎麼辦?這是我的解決方案。找到輸入形狀的(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)
比方說,我想距離映射朝180度。只是改變了 「mainDirection」
mainDirection = 180;
讓我們來試試不同的形狀。
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;
如果你想在一個特定的方向間隔口罩(THETA + -interval),只是改變了 「dirInterval」。下面是一個例子
mainDirection = 180;
dirInterval = 30;
在原來的問題,@Mac想掩蔽朝向左側的距離圖。然後:
im=zeros(100); im(:,50)=1;
mainDirection = 270;
dirInterval = 90;