在Matlab中使用蒙太奇拼贴的滤镜数组后保存3通道图像的输出

时间:2017-09-18 16:03:57

标签: arrays image matlab montage

我们希望通过对银行中的每个过滤器进行卷积来在图像上运行我们的过滤器库 图像并将所有响应连接到每个像素的矢量中。使用imfilter命令 这样做的循环。由于彩色图像有3个通道,因此我们总共会有3F滤波器响应 如果滤波器组的大小为F,则为像素。 ñ 然后将结果输出为3F通道图像

final = [];
for i = 1: length(filterBank)
    x = imfilter(img, cell2mat(filterBank(i)));
    imshow(x);
    final(i)= [x]
end

其中:

  

filterBank是一个20X1的细胞; filterBank(i)是5X5 double

     

img是230X307X3 uint8

     

最终只是[]

这会产生错误 订阅的分配维度不匹配。

然后我尝试了:

final(1:1:1) = x

这会出错: 在作业A(:) = B中,A和B中的元素数必须为 相同。

我是一个matlab菜鸟,但基本上想要保存所有的3d矩阵结果将每个过滤器应用到单个数组然后应用蒙太奇命令

1 个答案:

答案 0 :(得分:1)

您尝试将单个元素(final(i))设置为矩阵的值。改为使用单元格数组。

% pre-allocate for memory friendliness
final = cell(size(filterBank));
% Loop using ii not i, as i=sqrt(-1) by default in MATLAB
% Also using numel, as length is only the size in the largest direction
for ii = 1:numel(filterBank)
    % You say filterBank is a cell, so use {}, then shouldn't need cell2mat()
    x = imfilter(img, filterBank{ii});
    imshow(x);
    % Curly braces because we're indexing a cell now
    final{ii} = x;
end

或者你可以使用4D矩阵(3D用于x,1D用于循环变量),

final = zeros([size(img), numel(filterBank)]); % pre-allocation instead of cell
for ii = 1:numel(filterBank)
    x = imfilter(img, filterBank{ii});
    imshow(x);
    % assign to ii-th layer of 3D matrix
    final(:,:,:,ii) = x;
end