对于此类问题,您可以随时查看项目 Octave 提供的代码。
使用此链接,您可以看到该功能strel
是如何在 Octave 中实现的。
以下代码完全摘自 Octave 的 strel 函数,对应 case strel('line')
:
## Parameters (degrees and linelenght)
degrees = 30
linelen = 5
## Line length are always odd, to center strel at the middle of the line.
## We look it as a diameter of a circle with given slope
deg90 = mod (degrees, 90);
if (deg90 > 45)
alpha = pi * (90 - deg90) / 180;
else
alpha = pi * deg90 / 180;
endif
ray = (linelen - 1)/2;
## We are interested only in the discrete rectangle which contains the diameter
## However we focus our attention to the bottom left quarter of the circle,
## because of the central symmetry.
c = round (ray * cos (alpha)) + 1;
r = round (ray * sin (alpha)) + 1;
## Line rasterization
line = false (r, c);
m = tan (alpha);
x = [1:c];
y = r - fix (m .* (x - 0.5));
indexes = sub2ind ([r c], y, x);
line(indexes) = true;
## We view the result as 9 blocks.
# Preparing blocks
linestrip = line(1, 1:c - 1);
linerest = line(2:r, 1:c - 1);
z = false (r - 1, c);
# Assemblying blocks
SE.nhood = vertcat (
horzcat (z, linerest(end:-1:1,end:-1:1)),
horzcat (linestrip, true, linestrip(end:-1:1,end:-1:1)),
horzcat (linerest, z(end:-1:1,end:-1:1))
);
# Rotate/transpose/flip?
sect = fix (mod (degrees, 180) / 45);
switch (sect)
case 1, SE.nhood = transpose (SE.nhood);
case 2, SE.nhood = rot90 (SE.nhood, 1);
case 3, SE.nhood = fliplr (SE.nhood);
otherwise, # do nothing
endswitch
SE