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 我只能按照代码进行解释,如果还有看不懂的,自己举一个实例就能搞懂,这种算法的原理我还找不到相关文献有一个理论解释,如果你能找到能告诉我吗?谢谢了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报 。