Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的组合卷积滤波器_Matlab_Convolution - Fatal编程技术网

matlab中的组合卷积滤波器

matlab中的组合卷积滤波器,matlab,convolution,Matlab,Convolution,有没有办法在下面的代码中使用低通和高通过滤器,并将它们组合到一个内核中,然后应用一个conv2()函数 注意:长度(lfilter)=21,长度(hfilter)=81 我们在最后一步中基本上做的是从图像中移除大对象(在已经移除带有高斯模糊的非常小的对象之后) 由于卷积运算符是关联的: conv( a, conv(b,c) ) == conv( conv(a,b), c ) 您应该能够通过将两个内核彼此卷积,将它们组合成一个内核 在您的情况下,类似这样的方法应该有效: new_kernel

有没有办法在下面的代码中使用低通和高通过滤器,并将它们组合到一个内核中,然后应用一个conv2()函数

注意:长度(lfilter)=21,长度(hfilter)=81

我们在最后一步中基本上做的是从图像中移除大对象(在已经移除带有高斯模糊的非常小的对象之后)



由于卷积运算符是关联的:

conv( a, conv(b,c) ) == conv( conv(a,b), c )
您应该能够通过将两个内核彼此卷积,将它们组合成一个内核


在您的情况下,类似这样的方法应该有效:

new_kernel = conv2(lfilter',lfilter, conv2(hfilter',hfilter), 'same');
卷积也是可交换的,所以执行卷积的顺序应该无关紧要


编辑:正如我在下面的评论中所解释的,询问者执行四个1D卷积的方法最终比单个2D卷积快。

因为卷积运算符是关联的:

conv( a, conv(b,c) ) == conv( conv(a,b), c )
您应该能够通过将两个内核彼此卷积,将它们组合成一个内核


在您的情况下,类似这样的方法应该有效:

new_kernel = conv2(lfilter',lfilter, conv2(hfilter',hfilter), 'same');
卷积也是可交换的,所以执行卷积的顺序应该无关紧要


编辑:正如我在下面的评论中所解释的,提问者执行四个1D卷积的方法最终比单个2D卷积更快。

我刚刚在matlab论坛上得到了答案

要点是,你必须使用填充来填充较短过滤器的两侧,然后你可以组合向量

卷积是一种线性运算,因此可以将两种滤波运算合并为一种。只需将过滤器设置为相同的大小,并对其进行加/减即可。例如:

 lfilter = normalize(exp(-((-ceil(5*minStar):ceil(5*minmax))/(2*this.minStar)).^2));
 hfilter = normalize(exp(-((-ceil(5*maxStar):ceil(5*minmax))/(2*this.maxStar)).^2));
 padlength = (length(hfilter) - length(lfilter))/2;
 lfilter = padarray(lfilter, [0 padlength]);
 lhfilter = lfilter - hfilter;
 this.filtered = conv2(lhfilter',lhfilter,this.raw,'same');

我刚刚在matlab论坛上得到了答案

要点是,你必须使用填充来填充较短过滤器的两侧,然后你可以组合向量

卷积是一种线性运算,因此可以将两种滤波运算合并为一种。只需将过滤器设置为相同的大小,并对其进行加/减即可。例如:

 lfilter = normalize(exp(-((-ceil(5*minStar):ceil(5*minmax))/(2*this.minStar)).^2));
 hfilter = normalize(exp(-((-ceil(5*maxStar):ceil(5*minmax))/(2*this.maxStar)).^2));
 padlength = (length(hfilter) - length(lfilter))/2;
 lfilter = padarray(lfilter, [0 padlength]);
 lhfilter = lfilter - hfilter;
 this.filtered = conv2(lhfilter',lhfilter,this.raw,'same');

我希望将过滤器合并到一个内核中。为了减少卷积的数量(我最终需要将其移植到GPU),我看到了。使用多个1D过滤器而不是一个大的2D过滤器似乎是一个更好的主意。假设您拥有的所有1D过滤器都是具有
N
分量的向量,并且图像是
M
by
M
像素,则原始方法将需要
4*N*M*M
乘法。如果我们假设新内核是由
N
组合而成的,那么我的内核实际上需要
N*N*M*M
。刚刚发布了我得到的答案。我希望将过滤器组合到一个内核中。为了减少卷积的数量(我最终需要将其移植到GPU),我看到了。使用多个1D过滤器而不是一个大的2D过滤器似乎是一个更好的主意。假设您拥有的所有1D过滤器都是具有
N
分量的向量,并且图像是
M
by
M
像素,则原始方法将需要
4*N*M*M
乘法。如果我们假设新内核是由
N
组合而成的,那么我的内核实际上需要
N*N*M*M
。刚把我得到的答案贴出来。