【问题标题】:how to store block after block processing back to full image块处理后如何将块存储回完整图像
【发布时间】:2014-02-05 06:54:20
【问题描述】:

我必须执行逐块乘法并将逐块结果存储回与输入图像具有全(相同)维度的图像。我已经开发了一些代码,但它无法存储单个块。 输入图像的大小为 256*256。大小为 5*5 的块。输出图像应为 256*256。 (即Mul 的大小为 (256*256))。

clear all;
close all;
I = im2double(imread('cameraman.tif'));
[row,col] = size(I);

block = 5;
Var = zeros(1:block,1:block);
 for i = 1:block:row-block
     for j= 1:block:col-block
         Var = I(i:i+block-1,j:j+block-1);
         Dem = reshape(1:25,[5 5])';
         Mul = Var.*Dem;
     end;
 end;

【问题讨论】:

  • 你可以使用blockproc吗?
  • 是的,我可以使用 blockproc,但我必须避免在我的代码中使用 blockproc 函数。那么,如果没有 blockproc,是否有任何逻辑......谢谢回复。

标签: matlab image-processing block addition


【解决方案1】:

您可以使用mat2cell 将您的图像转换为包含 5 x 5 块的单元格。由于 256 不能除以 5,因此您必须进行一些调整。您可以使用已经进行调整的mat2tiles。如果您不想使用外部文件,只需检查它们如何调整即可。无论如何,您应该可以这样做:

% convert image to tiles
C = mat2tiles(I, [5 5]);

% apply some function to each block. In example just zero all elements in blocks
C2 = cellfun(@(block) block.* 0, C, 'UniformOutput', 0);

% concatenate the results into new image
I2 = cell2mat(C2);

【讨论】:

  • mat2tiles(或mat2cell)、cellfuncell2mat 的组合值得记住。当你有这些功能时,不要为循环而烦恼......只是愚蠢。 +1
【解决方案2】:
clear all;

close all;

I = im2double(imread('cameraman.tif'));

[row,col] = size(I);

block = 5;

Var = zeros(1:block,1:block);

% Initialize the output image

I2 = zeros(row,col);

Dem = reshape(1:25,[5 5])'; %'

 for i = 1:block:row-block

     for j= 1:block:col-block

         Var = I(i:i+block-1,j:j+block-1);

         Mul = Var.*Dem;

         % Remap the result to original size

         I2(i:i+block-1,j:j+block-1) = Mul;

     end;

 end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多