我有一个名为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;
感谢您的帮助。
您可以将图像乘以蒙版:
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) ) ;
一个简单的解决方案是提取整个平面,对其进行修改,然后放回原处:
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;
寻找另一种没有任何中间保持变量的单线解决方案,针对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