如何有效地循环遍历矩阵元素

时间:2014-05-15 09:19:54

标签: matlab if-statement matrix

我有一个用于8位图像分析的matlab脚本,我试图通过减去没有物体存在的背景来增强图像中的对象。我想在像素级别做的是:

if B-I>50 then E=I
else E=255-B-I

其中,B是背景,I是图片,E是我的增强图片。我知道我可以通过循环遍历图像矩阵的每个元素来做到这一点:

diff=imsubtract(B,I);
nrows=1024;
ncols=1360;
for r=1:nrows
     for c=1:ncols
         if diff(r,c)>50
             E=I(r,c);
         else
             E=255-diff(r,c);
         end
     end
 end

但是当拍摄多张照片时,这是相当慢的。我也尝试了以下内容:

 E=255-diff;
 E(diff>50)=I;

但收到以下错误:

在作业A(I) = B中, B和I中的元素数量必须 是一样的。

有关优化此功能的任何提示都会受到极大的学徒谴责!

3 个答案:

答案 0 :(得分:4)

  

在赋值A(I)= B中,B和I中的元素数必须为   同样的。

出现此错误的原因是您尝试将I的所有内容分配到E的子集(diff>50的那些像素)。您必须明确告诉MATLAB您希望将这些像素设置为I中的匹配像素。

E(diff>50)=I(diff>50);

顺便说一下,您应该谨慎使用imsubtract。对于I的值高于B的像素,这将导致零(如果您的值为uint8)。它可能没问题(如果您正在寻找绝对差异,或者只是B大于I的地方,则不是100%清楚)

答案 1 :(得分:1)

如果您使用find()

,该怎么办?
ind = find(B-I>50)
E(ind) = I(ind)

% And then the ones that are not `B-I>50`
E(~ind) = 255-B(~ind)-I(~ind)

答案 2 :(得分:0)

尝试使用逻辑索引的这种矢量化方法。我无法在图像上测试它,如果这样做会很好。

<强>代码

diff1=double(imsubtract(B,I));
E = double(I).*(diff1>50) + (255-diff1).*(diff1<=50);

您可能需要将数据类型转换回用于图像的无符号整数格式。