【问题标题】:How to Split Images into parts using MATLAB如何使用 MATLAB 将图像分割成多个部分
【发布时间】:2013-12-11 08:35:53
【问题描述】:

我得到了一张大小为 [17935 10968] 像素的卫星图像,我想平均切割图像并在各个部分上处理我所需的算法(例如:我需要将像素范围以上切割成 4 个相等部分)。

如何在不丢失中间像素的情况下分割图像?我的要求是(1 到 5600 和 5601 到结束像素)。

有人知道如何在 MATLAB 中分割这么大的图像吗?

【问题讨论】:

  • 所以问题是处理大数据或剪切图像的方式出了问题?
  • @Ray 我两个都有。。有什么想法吗?

标签: matlab image-processing


【解决方案1】:

方法一

如果您有图像处理工具箱,这是首选且最有效的方法。它利用了非常有用的blockproc 功能,该功能专为处理大块图像而设计。例如,当您的图像没有平均分成相同大小的块并将块处理的结果连接到一个结果矩阵时,它会处理填充。

最好看一下official documentation,但您的情况如下:

vSize = [17935 10968];
imBig = rand([vSize 3]);
nParts = [2 2]; %means divide into 4 parts, 2 horizontal, 2 vertical

blockproc(imBig, ceil(vSize ./ nParts), @yourAlgorithm);


function res = yourAlgorithm(blockStruct)
   %do your processing of the block here and 
   %optionally return a result in 'res'

   %for example, just return the RGB vector of the first pixel
   res = blockStruct.data(1,1,:);
end

方法二

如果您没有图像处理工具箱,您可以改用mat2cell 函数。首先计算出所需的块大小,然后得到一个包含不同块的元胞数组。但是,对于如此大的图像,速度和内存可能会成为问题。代码借自this Matlab Central 答案。

vSize = [17935 10968];
imBig = rand([vSize 3]);
nParts = [2 2]; %means divide into 4 parts, 2 horizontal, 2 vertical

%figure out the size of "regular" block and the last block

vRegBlockSize = ceil(vSize ./ nParts);
vLastBlockSize = vSize - vRegBlockSize .* (nParts - 1);

%put the sizes into a vector
vSplitR = [vRegBlockSize(1)*ones(1,nParts(1)-1), vLastBlockSize(1)];
vSplitC = [vRegBlockSize(2)*ones(1,nParts(2)-1), vLastBlockSize(2)];

%split the image
C = mat2cell(imBig, vSplitR, vSplitC, 3);

%access RGB pixel (x,y) in top left {1,1} block
p = C{1,1}(x, y, :);

【讨论】:

    【解决方案2】:
    upperLeft = theImage(1:5600, 1:5600, :);
    upperRight = theImage(1:5600, 5601:end, :);
    lowerLeft = theImage(5601:end, 1:5600, :);
    lowerLeft = theImage(5601:end, 1:5601:end, :);
    

    【讨论】:

      【解决方案3】:

      您可以使用reshape 从图像中制作 4 个矩阵:

      A=reshape(Img, 17935 , 10968/4,[]);
      

      然后处理 A(:,:,1) 等...

      【讨论】:

      • 感谢回答,帮助满满;但是有什么方法可以在 RGB 组合图像中获得输出,因为我正在为输入 RGB 图像(17935x10968x3)获取 12 张图片
      【解决方案4】:

      使用以下代码将图像分成4个不同的图像:

      A=reshape(Img, 17935 , 10968/4, 3, []);
      

      那么 A(:,:,:,1) 是第一张图片。

      【讨论】:

        【解决方案5】:

        假设A 是你的17935x10968x3 矩阵,我认为你可以这样做:

        B = reshape(A, 17935, 10968 / 4, 4, 3);
        

        这样最后一个维度仍然代表RGB。唯一不同的是它变成了4-D数组。

        【讨论】:

        • 我需要将它切割成 X 和 y 尺寸,例如 4 个相等的正方形部分。感谢您的帮助...
        • @ravi 那么四个矩形即使17935 不能使它们相等?
        • 我的意思是如果图像像 A4 纸,我需要在中心切割成一半,然后再将一半切割成一半。所以我会得到 4 个部分。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2014-04-11
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 2023-03-06
        • 2017-04-20
        相关资源
        最近更新 更多