在MATLAB中加速像素处理的最佳方法

时间:2018-07-11 15:27:00

标签: matlab performance image-processing

我有几个大的3维矩阵(例如维:16330,1300,16)。对于每个单元格,我需要开发一个简单的线性回归模型并提取一些信息,例如拟合模型的斜率和截距。我创建了一个循环并逐个像素运行处理过程,但这将永远持续下去。有什么建议可以改善以下代码吗?

% read the multiband image (16330,1300,16)
[A,R] = geotiffread('16Bands_image.tif'); 

% this is a vector (1*16) that i fit it against the third dimension of each 
%pixel throughout the image
Load external.m 

intercept = zeros(size(A,1),size(A,2));
slope = zeros(size(A,1),size(A,2));

for i=1:size(A,1)
   for j=1:size(A,2)
     REF=squeeze(A(i,j,:));
     p=fitlm(REF,external);
     intercept(i,j)=p.Coefficients.Estimate(1);
     slope(i,j) = p.Coefficients.Estimate(2);
   end
end

谢谢

1 个答案:

答案 0 :(得分:1)

如果您需要p = fitlm(external,REF),则有一个快速的解决方案:通过(16330 * 1300)将图像重塑为16,然后应用没有循环的模型。

A = reshape(A, [], 16)'; % reshape and transpose to 16 by N

X = external(:);
X = X - mean(X);
b = [ones(16,1) X] \ A; % solve all once

b的行1和2分别是截距和斜率。

我不知道您的数据,但这假设A是测量数据。

如果确实希望采用其他方法,则可能仍需要在像素上循环:

external = external(:); % make sure it is column
b = zeros(2, size(A,2)); % A in 16 by N
for i = 1:size(A,2)
    X = A(:,i);
    X = X - mean(X);
    b(:,i) = [ones(16,1) X] \ external; 
end

但这仍然很慢,尽管它比fitlm快。