Присвойте arr с индексом - PullRequest
0 голосов
/ 14 мая 2019

Я действительно надеюсь, что это не дубликат, и это, вероятно, очень глупый вопрос.Извините;)

Проблема: у меня есть изображение в оттенках серого со значениями / классами 1 и 2, и я хочу преобразовать / отобразить его в цветное изображение, где 1 равно желтому, а 2 - синему.

import numpy as np
import cv2

result=cv2.imread("image.png", cv2.IMREAD_GRAYSCALE)

result[result==2]=[15,100,100]

result[result==1]=[130,255,255]

Но это не с ошибкой ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 1995594 output values where the mask is true

Я думаю, что я очень близок к решению, но я не понимаю его.Заранее спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 14 мая 2019

result является массивом Numpy и набирается , его тип является целым числом, и вы пытаетесь назначить целочисленный слот тройку целых чисел ... ничего хорошего.

Вам нужно создать пустое цветное изображение с такими же размерами result и присвоить последней оси запрошенные тройки.

Я не установил cv2, но вы можете посмотреть на следующий код, чтобы иметь представление о том, как действовать.

Эквивалент тому, что вы сделали, та же ошибка

In [36]: import numpy as np                                                               
In [37]: a = np.random.randint(0,2,(2,4))                                                 
In [38]: a                                                                                
Out[38]: 
array([[1, 0, 0, 0],
       [0, 1, 0, 1]])
In [39]: a[a==1] = (1,2,3)                                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-24af4c8dbf5a> in <module>
----> 1 a[a==1] = (1,1)

ValueError: NumPy boolean array indexing assignment cannot assign 2 input values to the 3 output values where the mask is true

Теперь выделите трехмерный массив и примените к нему индексацию, назначив по умолчанию последнюю ось

In [40]: b = np.zeros((2,4,3))                                                            
In [41]: b[a==1] = (1,2,3)                                                                
In [42]: b                                                                                
Out[42]: 
array([[[1., 2., 3.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [1., 2., 3.],
        [0., 0., 0.],
        [1., 2., 3.]]])

У нас есть две внутренние матрицы (соответствующие двум строкам a), в каждой матрице четыре строки (соответствующие четырем столбцам a), и, наконец, столбцы - это нужные вам RGB-тройки.

Я не знаю точно, как располагаются данные на изображении cv2, но я думаю, что вам нужно внести незначительные корректировки, если таковые вообще имеются.

0 голосов
/ 14 мая 2019

Благодаря @gboffi я получил ответ.Наверное, я надеялся, что есть более питонский способ сделать это, но хорошо.

# Load in Image File
img=cv2.imread("imgfile", cv2.IMREAD_GRAYSCALE)
# Create new array with the shape of the original image
color=np.zeros((img.shape[0],result.shape[1],3))
# Note that opencv needs BGR and values from 0..1
color[result==1]=(0.84,117/225,2/225)
color[result==2]=(78/225,173/225,240/225)
...