我已经在MATLAB中编写了以下代码来处理3000x2500像素数量级的大图像。目前,该操作需要半个多小时才能完成。是否有任何可以改进代码以减少时间的范围?我听说并行处理可以使事情变得更快,但是我不知道如何实现它。给定以下代码,我该怎么做?
function dirvar(subfn)
[fn,pn] = uigetfile({'*.TIF; *.tiff; *.tif; *.TIFF; *.jpg; *.bmp; *.JPG; *.png'}, ...
'Select an image', '~/');
I = double(imread(fullfile(pn,fn)));
ld = input('Enter the lag distance = '); % prompt for lag distance
fh = eval(['@' subfn]); % Function handles
I2 = uint8(nlfilter(I, [7 7], fh));
imshow(I2); % Texture Layer Image
imwrite(I2,'result_mat.tif');
% Zero Degree Variogram
function [gamma] = ewvar(I)
c = (size(I)+1)/2; % Finds the central pixel of moving window
EW = I(c(1),c(2):end); % Determines the values from central pixel to margin of window
h = length(EW) - ld; % Number of lags
gamma = 1/(2 * h) * sum((EW(1:ld:end-1) - EW(2:ld:end)).^2);
end
输入滞后距离通常为1。
最佳答案
首先,我强烈建议您遵循@Egon的建议:编写一个单独的函数来收集文件列表(来自FEX的出色UIPICKFILES是您的 friend ),然后针对每个图像循环运行过滤代码。请注意,您绝对应该在过滤代码中保留对imwrite
的调用:万一分析在图像48上崩溃(例如由于电源故障),您不想丢失所有先前的工作。
因此,以批处理方式运行有两个很大的优点:(1)您可以开始运行代码并在周末结束,并且(2)您可以使用PARFOR轻松并行化此外部循环。但是,只有一台双核计算机,并行化不太可能带来任何重大改进-您的OS也希望有时运行某些东西,并且并行化的开销可能大于运行两个工作线程所带来的 yield 。此外,2.5GB的RAM受到严重限制。
关于您的特定代码:以我的经验,IM2COL通常比NLFILTER快。 im2col
从图像中创建一个nElementsInMask-by-nMasks
数组,以便您可以在一个操作中应用过滤。在7x7的窗口中,im2col
的输出将为3000 * 2500 * 49字节,接近400MB。因此,它应该可以正常工作。您需要做的就是重写ewvar
,以便它可以在构成蒙版像素的49x1像素数组上工作,如果我正确理解您的代码,则需要进行一些索引处理。