如何在MATLAB中优化两个for循环

如何在MATLAB中优化两个for循环,matlab,optimization,loops,Matlab,Optimization,Loops,我有两个图像,我想比较,并根据具体像素的值进行不同的操作。问题是它真的很慢,我需要把操作速度提高很多,用代码可以做什么 currentFrame = rgbimage; %rgbimage is an 800x450x3 matrix for i = 1:size(currentFrame, 1) for j = 1 : size(currentFrame,2) if currentFrame(i,j) > backgroundImage(i,j) %backg

我有两个图像,我想比较,并根据具体像素的值进行不同的操作。问题是它真的很慢,我需要把操作速度提高很多,用代码可以做什么

currentFrame = rgbimage; %rgbimage is an 800x450x3 matrix

for i = 1:size(currentFrame, 1)

   for j = 1 : size(currentFrame,2) 

       if currentFrame(i,j) > backgroundImage(i,j) %backgroundimage is an equally sized image which i would like to compare with
          backgroundImage(i,j, :) = double(backgroundImage(i,j, :) +1); 

       elseif currentFrame(i,j) < backgroundImage(i,j)
          backgroundImage(i,j, :) = double(backgroundImage(i,j, :) -1);          
       end


   end

end

diff = abs(double(currentFrame) - double(backgroundImage)); %difference between my backgroundimage and my current frame
fusion = zeros(size(currentFrame)); % A fusion image

for i=1:size(backgroundImage,1)
    for j = 1:size(backgroundImage,2)

           if diff(i,j) > 20

            fusion(i,j, :) = double(currentFrame(i,j, :));

           else
             fusion(i,j, :) = 0;  

           end
    end 
end
currentFrame=rgbimage;%rgbimage是一个800x450x3矩阵
对于i=1:大小(当前帧,1)
对于j=1:大小(当前帧,2)
如果currentFrame(i,j)>backgroundImage(i,j)%backgroundImage是一个大小相等的图像,我想与之进行比较
背景图像(i,j,:)=double(背景图像(i,j,:)+1);
elseif currentFrame(i,j)<背景图像(i,j)
背景图像(i,j,:)=double(背景图像(i,j,:)-1);
结束
结束
结束
diff=abs(双精度(当前帧)-双精度(背景图像));%我的背景图像和当前帧之间的差异
融合=零(大小(当前帧));%融合图像
对于i=1:大小(背景图像,1)
对于j=1:大小(背景图像,2)
如果差值(i,j)>20
融合(i,j,:)=double(当前帧(i,j,:);
其他的
融合(i,j,:)=0;
结束
结束
结束

谢谢你的帮助

您可以在一次操作中比较矩阵。比如说,

D = diff > 20;
矩阵D将包含D(i,j)=1,其中差(i,j)>20,否则为零

然后可以使用它设置其他矩阵:

fusion = zeros(size(currentFrame));
fusion(diff > 20) = double(currentFrame(diff > 20));

第一个循环也是如此。

您不需要循环-您可以执行以下操作:

indexes = currentFrame > backgroundImage;
backgroundImage(indexes) = backgroundImage(indexes) + 1;


顺便说一句,在使用
currentFrame(i,j)>backgroundImage(i,j)
的代码中,您只是比较了三个颜色维度中的第一个。这是故意的吗?

不,这不是故意的,我能做
currentFrame(I,j,:)>backgroundImage(I,j,:)
吗?这很有效,但给你一个1x1x3维的逻辑向量。然后,您需要澄清if。(当只有一种颜色更大时就足够了吗?)是的,它可以工作,但是当我在计算融合图像时做同样的事情时,我遇到了一个问题。一些区域的颜色变得非常混乱(从一开始这是一张非常暗的图像,但现在我得到了清晰的蓝色/绿色/粉色。下面是代码:
fusion=zero(size(currentFrame));index=diff>20;fusion(index)=double(rgbimage(index))
只能在这里猜测-但我相信Matlab使用的RGB值在0-1范围内,听起来你的RGB值在0-255之间。非常感谢,速度快了很多,我使用的是你的代码和'bdecaf',但他先发布了,所以他得到了“正确答案”