分享

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

 mscdj 2015-02-19

这位同学真有缘,我今天正打算研究这段代码是什么鸟意思。想知道具体回答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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多