从图像增强性能中采样像素



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

最新更新