我有一个用于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中的元素数量必须
是一样的。
有关优化此功能的任何提示都会受到极大的学徒谴责!
答案 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);
您可能需要将数据类型转换回用于图像的无符号整数格式。