matlab中的fspecial中有一个功能叫‘motion’。哪位大神帮帮忙解释一下那段代码什么意思。急!!!
我想要自己重新编一个函数实现motion功能但是看不太懂他是什么意思。。。求各位帮帮忙吧case'motion'%Motionfilterusesbilinearinte...
我想要自己重新编一个函数实现motion功能但是看不太懂他是什么意思。。。求各位帮帮忙吧
case 'motion' % Motion filter uses bilinear interpolation
len = max(1,p2);
half = (len-1)/2;% rotate half length around center
phi = mod(p3,180)/180*pi;
cosphi = cos(phi);
sinphi = sin(phi);
xsign = sign(cosphi);
linewdt = 1;
% define mesh for the half matrix, eps takes care of the right size
% for 0 & 90 rotation
sx = fix(half*cosphi + linewdt*xsign - len*eps);
sy = fix(half*sinphi + linewdt - len*eps);
[x y] = meshgrid([0:xsign:sx],[0:sy]);
% define shortest distance from a pixel to the rotated line
dist2line = (y*cosphi-x*sinphi);% distance perpendicular to the line
rad = sqrt(x.^2 + y.^2);
% find points beyond the line's end-point but within the line width
lastpix = find((rad >= half)&(abs(dist2line)<=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);
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);
h(end+[1:end]-1,end+[1:end]-1) = dist2line;
h = h./(sum(h(:)) + eps*len*len);
if cosphi>0,
h = flipud(h);
end 展开
case 'motion' % Motion filter uses bilinear interpolation
len = max(1,p2);
half = (len-1)/2;% rotate half length around center
phi = mod(p3,180)/180*pi;
cosphi = cos(phi);
sinphi = sin(phi);
xsign = sign(cosphi);
linewdt = 1;
% define mesh for the half matrix, eps takes care of the right size
% for 0 & 90 rotation
sx = fix(half*cosphi + linewdt*xsign - len*eps);
sy = fix(half*sinphi + linewdt - len*eps);
[x y] = meshgrid([0:xsign:sx],[0:sy]);
% define shortest distance from a pixel to the rotated line
dist2line = (y*cosphi-x*sinphi);% distance perpendicular to the line
rad = sqrt(x.^2 + y.^2);
% find points beyond the line's end-point but within the line width
lastpix = find((rad >= half)&(abs(dist2line)<=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);
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);
h(end+[1:end]-1,end+[1:end]-1) = dist2line;
h = h./(sum(h(:)) + eps*len*len);
if cosphi>0,
h = flipud(h);
end 展开
1个回答
展开全部
这位同学真有缘,我今天正打算研究这段代码是什么鸟意思。想知道具体回答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
我只能按照代码进行解释,如果还有看不懂的,自己举一个实例就能搞懂,这种算法的原理我还找不到相关文献有一个理论解释,如果你能找到能告诉我吗?谢谢了。
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
我只能按照代码进行解释,如果还有看不懂的,自己举一个实例就能搞懂,这种算法的原理我还找不到相关文献有一个理论解释,如果你能找到能告诉我吗?谢谢了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询