Как замаскировать градацию серого с помощью нарезки массива - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно заменить 8-битные значения (от 0 до 255) индексированного набора изображения (конечного изображения), следуя «значениям карты» из другого изображения (второго изображения) серой шкалы, связанные индексы карты которого были выбраны из основного изображения .

На самом деле это то же самое, что MATLAB делает с

 indexS =  find(image1 == integer ('could be a integer from 1 to 255')) 
 imagfinal(indexS) = imagsecondary(indexS).

Я пробовал следующие примеры для python / matlab find () в стеке, например: Функция find () в стиле MATLAB в Python . И связанные с ними ...

Я пробовал n.nonzero, np.argwhere и np.where, но я действительно запутался.

У меня есть три исходных изображения, скажем, A, B, C, одинаковой формы, например. (100x100) с различными значениями от 0 до 255, я имею в виду, что они абсолютно серые шкалы, отличающиеся друг от друга.

Итак, 1-й шаг - Мне нужно получить все индексы со значениями = 1 (но может быть, 10, 196, до 255) от A, поэтому я сделал:

Aboolean = np.equal(A,1)

результат

       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],...

Затем я попытался использовать результаты массива логических индексов для получения значений из B:

Bnew = B[Aboolean]

Но это не сработало для дальнейших шагов, потому что в результате получается карта значений и индексы теряются ...

Предполагается, что значения из Bnew заменяют соответствующие значения 8-разрядными на изображении C, я имею в виду эти 8-разрядные значения в одну и ту же позицию (или одинаковые индексы), помня, что B и C (также A) имеют одинаковые массив формы / размера (100x100).

Итак, я попробовал еще раз:


D = np.where(Aboolean,B,C)

при построении изображения, конечным результатом будет точно такое же изображение C !! Никаких изменений, вообще.


fig, ax = plt.subplots(nrows=1, figsize=(16,20))
ax.imshow(D, cmap='gray',interpolation='nearest')

Результаты того же изображения 'C'

Моя цель - это заменить набор значений из B на C (управляемый теми же позициями индекса), которые были разрезаны по карте индексов условий на A.

1 Ответ

1 голос
/ 21 июня 2019

Вы можете сделать это, используя логическое индексирование из A, чтобы напрямую скопировать значения из C в B (если вы не хотите изменять исходный B, сначала создайте копию, используя B.copy()).

>>> import numpy as np
>>> A = np.array([0,0,1,0,0])
>>> B = np.array([1,2,3,4,5])
>>> C = np.array([10,9,8,7,6])
>>> B[A==1] = C[A==1]

>>> B
array([1, 2, 8, 4, 5])

РЕДАКТИРОВАТЬ:

C [A == 1] = B [A == 1]

...