spoints matlab,matlab中的fspecial中有一个功能叫‘motion’。哪位大神帮帮忙解释一下那段代码什么意思。急!!!...

这位同学真有缘,我今天正打算研究这段代码是什么鸟意思。想知道具体回答qq上解答

case 'motion' % Motion filter uses bilinear interpolation关键思想是双线性差分?

len = max(1,p2);输入的模糊核的长度必须大于1

half = (len-1)/2;% rotate half length around center求出模糊核一半的长度

phi = mod(p3,180)/180*pi;这里的输出角度全部都为0到180度,这也是后面sy求解中的不使用ysign的缘由

cosphi = cos(phi);

sinphi = sin(phi);

xsign = sign(cosphi);

确定网格中x轴的生成方向

linewdt = 1;设置的模糊核的宽度,为什么要设置为1?

% define mesh for the half matrix, eps takes care of the right size其中eps用于保证mesh有正确的size?Eps是matlab中能计算的最小的数,比这个数小的数就认为是0.

% for 0 & 90 rotation

sx = fix(half*cosphi + linewdt*xsign - len*eps);

fix这个函数是将小数向0方向舍入,如果half*cosphi包含小数则会因为向零舍入造成矩阵的size不能包含全部的长度,所以通过linewdt*xsign进行修正。

sy = fix(half*sinphi + linewdt - len*eps);

与sx类似。由于eps的实际值很小,即使乘以len也不存在较大的值,所以我认为其影响只在某些特定的条件下产生:当sinphi=0时如果没有eps的存在,则sy=1,通过矩阵变换最终的模糊核有3行而不是一行,显然一行的情况更合乎逻辑,所以使用eps就是为了这点,但是为何乘以len还不得而知。

[x y] = meshgrid([0:xsign:sx],[0:sy]);mesh这条命令在这个应用里面起到了两层作用:1.产生一个能够容纳线段的矩阵,也就是说这个矩阵有合适的size;2.矩阵的元素是坐标!所以可以通过矩阵元素进行坐标方面的运算。

% define shortest distance from a pixel to the rotated line

dist2line = (y*cosphi-x*sinphi);

% distance perpendicular to the line这条语句就使用了mesh产生的坐标性质,计算这些离散的点距离我们实际的这条线段的距离,直观地认为在直线上的点最好,如果没有直线上的点的话,我们可以选取离直线近的点来充当直线成分。后面就是根据这些距离与linewdt的大小比较获取的。

rad = sqrt(x.^2 + y.^2);计算mesh区域中离散点到原点的距离,主要用于区别超出线段长度的点。这一点也是利用mesh出来的矩阵的坐标特性。

% find points beyond the line's end-point but within the line width

lastpix = find((rad >= half)&(abs(dist2line)<=linewdt));

找出距离原点超出half同时距离直线距离在linewdt宽度内的离散点坐标。这些点留作进一步判断,判断其是否还能用作表示线段的点。

%distance to the line's end-point parallel to the line

x2lastpix = half - abs((x(lastpix) + dist2line(lastpix)*sinphi)/cosphi);

dist2line(lastpix) = sqrt(dist2line(lastpix).^2 + x2lastpix.^2);

该句连同上句是计算lastpix中的点到half末端的距离。后面的判断机制就是看这个距离是否在linewdt之内,在内则可以将该点算作线段内部,不在则将其置为0.

dist2line = linewdt + eps - abs(dist2line); dist2line(dist2line<0) = 0;

% zero out anything beyond line width

% unfold half-matrix to the full size

h = rot90(dist2line,2);

后面这些就是将矩阵进行翻转等,补充一个完整的拥有len长度的线段。

h(end+[1:end]-1,end+[1:end]-1) = dist2line;

h = h./(sum(h(:)) + eps*len*len);

if cosphi>0,

h = flipud(h);

end

我只能按照代码进行解释,如果还有看不懂的,自己举一个实例就能搞懂,这种算法的原理我还找不到相关文献有一个理论解释,如果你能找到能告诉我吗?谢谢了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值