首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对每个图像使用新的向量执行卷积的最佳方法?

对每个图像使用新的向量执行卷积的最佳方法?
EN

Stack Overflow用户
提问于 2017-10-20 18:54:34
回答 1查看 91关注 0票数 3

我试着找出执行卷积的最好方法。

我有一个3D矩阵I=N x M x P和一个2D矩阵S=1 x 1 x K x P。对于我的3D矩阵的每个第p帧(第三维),我想返回I(:,:,p-K/2:p+K/2)和S(1,1,:,p)之间的有效卷积。你有办法做到这一点吗?

事实上,在计算非常接近于标准卷积的运算次数方面,不同之处在于我需要为每一帧更改第二个矩阵……

这是我目前使用的方法:

代码语言:javascript
复制
% I = 3D matrix [N x M x P]
% S = Filter [1 x 1 x K x P] (K is an odd number)
% OUT = Result

[N, M, P] = size(I); % Data size
K = size(S, 3); % Filter length
win = (K-1)/2 ; % Window
OUT = zeros(size(I)); % Pre-allocation

for p = win+1:P-win
     OUT(:, :, p) = convn(I(:, :, p-win:p+win), S(1, 1, :, p), 'valid'); % Perform convolution
end

最后,我们有与标准卷积相同的运算次数,唯一的区别是每帧的滤波器是不同的……

有什么想法吗?

谢谢;)

EN

回答 1

Stack Overflow用户

发布于 2017-10-21 10:01:29

因此,您希望将NxMxK子映像与1x1xKx1内核进行卷积,然后只提取有效部分,即NxM映像。

让我们看一下针对单个(x,y)位置的操作。这个一维卷积,你只保留1个值,等同于子图像和你的内核的点积:

代码语言:javascript
复制
OUT(x,y,p) = squeeze(I(x,y,p-win:p+win))' * squeeze(S(1,1,:,p))

这可以通过将I的子图重塑为(N*M)xK矩阵(K是水平的,S是列向量)来向量化所有(x,y)。

在所有p中重复此操作最容易使用循环实现,就像您现在所做的那样。另一种方法是创建一个更大的S,其中每列都移位1,这样您就可以在两个矩阵之间进行单个点积。但是创建S也很费钱,大概也需要一个循环。我不认为在MATLAB中避免循环是很重要的(多年来它变得更快了),而且产品本身可能是算法中最昂贵的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46847659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档