本代码的改进范围

Che*_* S. 5 parallel-processing performance matlab

我在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
Run Code Online (Sandbox Code Playgroud)

输入滞后距离通常为1.

Jon*_*nas 1

首先,我强烈建议您遵循@Egon的建议:编写一个单独的函数来收集文件列表(FEX 中优秀的UIPICKFILES是您的朋友),然后在每个图像的循环中运行您的过滤代码。请注意,您绝对应该在过滤代码中保留对以下内容的调用imwrite:以防分析在图像 48 处崩溃(例如由于电源故障),您不想丢失之前的所有工作。

以批处理模式运行有两大优点:(1) 您可以开始运行代码并回家过周末,(2) 您可以使用PARFOR轻松并行化此外部循环。然而,仅使用双核机器,您不太可能从并行化中获得任何显着的改进 - 您的操作系统有时也想运行一些东西,并且并行化的开销可能超过运行两个工作线程的收益。此外,2.5GB RAM 也受到严重限制。

至于您的具体代码:根据我的经验,使用IM2COL通常比NLFILTER更快。im2col从图像中创建一个nElementsInMask-by-nMasks数组,以便您可以在一次操作中应用过滤。对于 7x7 窗口,输出im2col将是 3000*2500*49 字节,接近 400MB。因此,它应该可以工作。您需要做的就是重写,ewvar以便它可以在构成您的蒙版像素的 49x1 像素数组上工作,如果我正确理解您的代码,这将需要一些索引处理。