IndexError: массивы, используемые в качестве индексов, должны иметь целочисленный (или логический) тип при использовании np.where () - PullRequest
0 голосов
/ 12 февраля 2019

Когда я пытался смешать два изображения с маской, я использовал np.where ():

a, b и mask - списки ndarraysи dtype это float64. tempImg - это ndarray с тем же dtype.

```
a = [[179.52181224 196.11236657 199.25513578 200.81821174 198.7369237
  188.63429662 192.30241342 207.88677914 222.15657045 229.51498031
  231.98006343 231.87414046 230.46600773 218.49685369 162.22483198
  100.36016141 121.1080895  135.74811817 130.99244378 110.68895168
  118.30273168 126.86982489 129.77672984 124.48464581 113.252353  ]
 [196.82448164 214.76750918 217.8666702  220.43924199 218.29167364
  206.96139307 210.62221148 226.93273178 242.81860388 250.77400119
  252.75942764 252.58055613 251.7060296  244.7889392  205.30175274
  140.06253874 130.66796303 134.60075016 144.20452322 134.04340699
  134.67761061 134.7536771  134.06737521 132.02019221 125.54434286]
 [199.35308577 217.40897714 220.85336669 223.59548903 221.36787333
  210.40169753 213.24258599 228.92592981 244.90159636 252.59280128
  252.9813501  248.71485061 237.89496352 225.45499552 211.15977205
  167.02392375 125.05120764 110.35189406 137.84965955 135.69712767
  133.58192482 132.36280398 132.31858306 134.45862906 132.1907518 ]]

//b is quite similar to a, same size but different value.
//mask is also the same size but has float values between 0 and 1:
[[0, 0, 0...1, 1, 0.56, 0.94, 1]...]
```
    for i in range (0, len(a)):
        tempImg = tempImg[np.where(mask[i] == 1, a[i], b[i])]
        tempImg = tempImg[np.where(mask[i] > 0 and mask[i] < 1,
                          a[i] * mask[i] + b[i] * (1 - mask[i]), tempImg)]
        img.append(tempImg)

Ожидаемые результаты - новый список ndarray (img), но я получил следующую ошибку:

in blend
    tempImg = tempImg(np.where(mask[i] == 1, a[i], b[i]))
IndexError: arrays used as indices must be of integer (or boolean) type

Canкто-нибудь помочь мне разобраться в проблеме?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Спасибо за обновление вашего вопроса.Исходя из ваших примеров данных, вот мои настройки:

a = np.array([[179.52181224, 196.11236657, 199.25513578, 200.81821174, 198.7369237,
  188.63429662, 192.30241342, 207.88677914, 222.15657045, 229.51498031,
  231.98006343, 231.87414046, 230.46600773, 218.49685369, 162.22483198,
  100.36016141, 121.1080895 , 135.74811817, 130.99244378, 110.68895168,
  118.30273168, 126.86982489, 129.77672984, 124.48464581, 113.252353  ],
 [196.82448164, 214.76750918, 217.8666702 , 220.43924199, 218.29167364,
  206.96139307, 210.62221148, 226.93273178, 242.81860388, 250.77400119,
  252.75942764, 252.58055613, 251.7060296 , 244.7889392 , 205.30175274,
  140.06253874, 130.66796303, 134.60075016, 144.20452322, 134.04340699,
  134.67761061, 134.7536771 , 134.06737521, 132.02019221, 125.54434286],
 [199.35308577, 217.40897714, 220.85336669, 223.59548903, 221.36787333,
  210.40169753, 213.24258599, 228.92592981, 244.90159636, 252.59280128,
  252.9813501 , 248.71485061, 237.89496352, 225.45499552, 211.15977205,
  167.02392375, 125.05120764, 110.35189406, 137.84965955, 135.69712767,
  133.58192482, 132.36280398, 132.31858306, 134.45862906, 132.1907518]])

b =a**2
mask=np.array([[0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 1, 1, 0.56],
              [0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 1, 1, 0.56],
              [0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 0, 1, 1, 0.56, 0.94, 1,0.7,1,0, 0, 1, 1, 0.56]])
tempImg=np.zeros_like(a)

Проблема, с которой вы столкнулись, была двоякой.Сначала вы пытались индексировать в tempImg индексы с плавающей точкой из других ваших массивов (tempImg=tempImg[]).

Решение для этого:

for i in range (0, len(a)):
    tempImg[i] = np.where(mask[i] == 1, a[i], b[i])

Второе и самое важное , вы проходили цикл, когда вам совсем не нужно было делать это!

Векторизованное решение с использованием numpy:

tempImg = np.where(mask == 1, a, b)
0 голосов
/ 12 февраля 2019

Вместо использования списков массивов, которые, как я полагаю, представляют строки вашего изображения, используйте 2D-массив, так как изображения обычно интерпретируются.Если ваше изображение уже определено как список массивов, вы можете просто сделать следующее, чтобы сделать его двумерным массивом:

import numpy as np
list_of_arrays = [np.asarray([0.1, 0.2]), np.asarray([0.1, 0.2])]
my_image = np.asarray(list_of_arrays)

Если ваша маска уже определена, вы можете использовать OpenCV bitwise_and: посмотритев документации для получения подробных сведений об использовании, но этот ответ выглядит очень полезным для вас.

...