我在这个论坛上看到了一些类似的问题,但我找不到解决这个问题的真正方法。
我有以下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都会返回错误:超出程序允许的最大变量大小。
我在我的colllege集群中运行带有48GB RAM的代码。该问题仅在43号及以下地区开始。其他地区运行正常。
我是否有一种聪明的方式来运行此代码?
答案 0 :(得分:3)
我认为问题在于您使用
image(x_region,y_region,1)
我怀疑你认为访问该地区的N个元素;但事实上,你访问NxN元素!对于一个大的地区,这很容易炸毁你。通常,A(vec1,vec2)通过numel(vec2)创建一个数字(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可能更快。