1

我在这个论坛上看到了一些类似的问题,但我没有找到解决这个问题的真正方法。

我有以下 matlab 代码,其中我使用非常大的图像(182MP):

%step 1: read the image
image=single(imread('image.tif'));

%step 2: read the image segmentation
regions=imread('image_segmentation.ppm');

%step 3: count the number of segments
number_of_regions=numel(unique(regions));

%step 4: regions label
regions_label=unique(regions);

for i=1:number_of_regions

    %pick the pixel indexes of the i'th region
    [x_region,y_region]=find(regions==label_regions(i));

    %the problem starts here

   ndvi_region=(image(x_region,y_region,1)-image(x_region,y_region,3))./(imagem(x_region,y_region,1)+image(x_region,y_region,3));

每次我使用特定区域运行代码时,matlab 都会返回错误:超出了程序允许的最大变量大小。

我在我学院的集群中运行具有 48GB RAM 的代码。问题仅在区域编号 43 及以下开始。其他地区运行正常。

我有一个聪明的方法来运行这段代码吗?

4

1 回答 1

3

我相信问题出在你的使用

image(x_region,y_region,1)

我怀疑您认为访问该区域的 N 个元素;但实际上,您访问了 NxN 个元素!对于一个大区域,这很容易对你造成影响。一般来说,A(vec1, vec2) 通过 numel(vec2) 创建 numel(vec1) 的一部分。要解决这个问题,您需要使用 sub2ind 函数来查找您需要的索引(或在find命令中使用单个参数,并相应地调整矩阵):

% option 1
[x_region, y_region]=find(regions==label_regions(i));
indx1 = sub2ind(size(image), x_region, y_region, 1*ones(size(x_region)));
indx3 = sub2ind(size(image), x_region, y_region, 3*ones(size(x_region)));
ndvi_region = (image(indx1) - image(indx3))./(image(indx1) + image(indx3));

% option 2
indx = find(regions==label_regions(i));
r_image = reshape(image, [], 3); % assuming you have XxYx3 image
ndvi_region = (r_image(indx, 1) - r_image(indx, 3))./(r_image(indx,1) + r_image(indx, 3));

第二个选项确实制作了图像的完整副本,因此选项 1 可能更快。

于 2013-06-12T12:41:27.817 回答