Замена значения октавы с логическим индексированием на многомерных матрицах - PullRequest
2 голосов
/ 01 мая 2020

У меня есть матрица с именем IMG, это матрица в форме n * m * 3 (изображение hsv). Я пытаюсь достичь

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

Логическое индексирование выглядит как решение, но при этом мы можем получить доступ только к индексу условия (IMG (x, y, 1)). С помощью приведенного ниже кода я изменяю первые индексы пикселей, но хочу изменить второй.

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

Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 02 мая 2020

Одно простое решение состоит в том, чтобы извлечь всю плоскость, изменить ее и затем вернуть обратно:

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

Можно также поиграть с линейными индексами, что более обобщенно c, но также более сложный:

index = find(IMG(:, :, 1) > 1/2);
offset = size(IMG, 1) * size(IMG, 2);
IMG(index + offset) = 0;
2 голосов
/ 02 мая 2020

Вы можете умножить изображение по маске:

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) ) ;
0 голосов
/ 07 мая 2020

в поисках другого однострочного решения без какой-либо промежуточной переменной хранения было предложено следующее для многомерного массива в справочном списке Octave :

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
...