在多维矩阵上用逻辑索引替换八度值

问题描述 投票:2回答:3

我有一个名为IMG的矩阵,它是n * m * 3形状的矩阵(HSV图像)。我想要实现的是

IF IMG(x,y,1)<1/2THEN IMG(X,Y,2)= 0。

逻辑索引看起来像一个解决方案,但通过这种方式,我们只能访问条件索引(IMG(x,y,1))。使用下面的代码,我正在更改像素的第一个索引,但是我想更改第二个索引。

IMG( IMG(:, :, 1) > 1/2 ) = 0;

感谢您的帮助。

octave
3个回答
2
投票

您可以将图像乘以蒙版:

IMG(:, :, 2) = IMG(:, :, 2) .* (IMG(:, :, 1) <= (1/2)) ;

或使用复合作业:

IMG(:, :, 2) .*= IMG(:, :, 1) <= (1/2);

另一个快速选择是重塑数组:

sz =size(IMG) ;
IMG = reshape(IMG, [], 3);
IMG(IMG(:,1)>1/2, 1), 2) = 0;
IMG = reshape(IMG, sz) ;

其他,可能效率较低的选项正在使用ifelse

IMG(:, :, 2) = ifelse(IMG(:, :, 1) > 1/2, 0, IMG(:, :, 2) ) ;

3
投票

一个简单的解决方案是提取整个平面,对其进行修改,然后放回原处:

s = IMG(:, :, 2);
s(IMG(:, :, 1) > 1/2) = 0;
IMG(:, :, 2) = s;

也可以使用线性索引,它更通用,但也更复杂:

index = find(IMG(:, :, 1) > 1/2);
offset = size(IMG, 1) * size(IMG, 2);
IMG(index + offset) = 0;

0
投票

寻找另一种没有任何中间保持变量的单线解决方案,针对Octave Help list上的多维数组提出了以下建议:

a( (a(:,:,3)<.5) & shiftdim(1:size(a,3)==2,-1) ) = 0

例如:

>> a = rand(2,3,3)
a =

ans(:,:,1) =

   0.63416   0.28912   0.33463
   0.76642   0.51474   0.28130

ans(:,:,2) =

   0.99748   0.26000   0.45671
   0.73153   0.44499   0.24099

ans(:,:,3) =

   0.94726   0.77252   0.12698
   0.27069   0.46458   0.55833

>> a((a(:,:,3)<.5)&shiftdim(1:size(a,3)==2,-1))=0
a =

ans(:,:,1) =

   0.63416   0.28912   0.33463
   0.76642   0.51474   0.28130

ans(:,:,2) =

   0.99748   0.26000   0.00000
   0.00000   0.00000   0.24099

ans(:,:,3) =

   0.94726   0.77252   0.12698
   0.27069   0.46458   0.55833
© www.soinside.com 2019 - 2024. All rights reserved.