从图像中采样像素 - 提高性能

时间:2015-07-20 22:42:39

标签: performance matlab

我从参考图像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(:);

1 个答案:

答案 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,:);