我从参考图像Ir
中采样一些像素,然后在次级图像In
上移动它们。我写的第一个函数如下:
[r,c,d] = size(Ir);
rSample = fix(r * 0.4); % sample 40 percent of pixels
cSample = fix(c * 0.4); % sample 40 percent of pixels
rIdx = randi(r,rSample,1); % uniformly sample indices for rows
cIdx = randi(c,cSample,1); % uniformly sample indices for columns
kk = 1;
for ii = 1:length(rIdx)
for jj=1:length(cIdx)
In(rIdx(ii),cIdx(jj),:) = Ir(rIdx(ii),cIdx(jj),:) * fcn(rIdx(ii),cIdx(jj));
kk = kk + 1;
end
end
另一种提高代码性能(速度)的方法,我想到的是:
nSample = fix(r*c*0.4);
Idx = randi(r*c,nSample,1);
for ii = 1:nSample
[I,J] = ind2sub([r,c],Idx(ii,1));
In(I,J,:) = Ir(I,J,:) * fcn(I,J);
end
在两个代码中,fcn(I,J)
是对[I,J]
处的像素执行某些计算的函数,并且该过程可以根据像素的索引而不同。
虽然我删除了一个for-loop
,但我想有更好的技术来提高代码的性能。
更新
正如@Daniel所建议的那样,以下代码行完成了这项工作。
In(rIdx,cIdx,:)=Ir(rIdx,cIdx,:);
但关键是,我更喜欢只有采样的像素才能更快地处理它们。例如,将矢量格式的样本设为3层RGB格式。
Io = Ir(rIdx,cIdx,:);
Io1 = Io(:,:,1);
Io1v = Io1(:);
答案 0 :(得分:1)
Ir=ones(30,30,3);
In=Ir*.5;
[r,c,d] = size(Ir);
rSamples = fix(r * 0.4); % sample 40 percent of pixels
cSamples = fix(c * 0.4); % sample 40 percent of pixels
rIdx = randi(r,rSamples,1); % uniformly sample indices for rows
cIdx = randi(c,cSamples,1); % uniformly sample indices for columns
In(rIdx,cIdx,:)=Ir(rIdx,cIdx,:);