У меня есть полутоновые изображения, и я хочу портировать их в 4 диапазона значений (0,035, 0,7, 0,75), отображаемых четырьмя различными цветами. Мне нужен результат, сохраненный как изображения в формате UINT8. Информация об оттенках серого выглядит следующим образом:
print(type(grads))
print(grads.shape)
print(grads.min())
print(grads.max())
cv2.imshow('1_grads', grads)
cv2.waitKey()
### OUTPUT
<class 'numpy.ndarray'>
(512, 512)
0.0
1.0
Я пробовал следующее:
thresh_map = Image.new('RGB', grads.shape, color='white')
thresh_map = np.where(grads < 0.035, (0, 0, 0), (0, 0, 0))
thresh_map = np.where(0.035 < grads < 0.7, (0, 0, 255), (0, 0, 0))
thresh_map = np.where(0.7 < grads < 0.75, (0, 255, 0), (0, 0, 0))
thresh_map = np.where(0.75 < grads, (0, 255, 0), (0, 0, 0))
Этовозвращает эту ошибку: ValueError: operands could not be broadcast together with shapes (512,512) (3,) (3,)
Я как-то решил проблему, используя циклы for и вставляя значения пикселей по одному. Но это нехорошо и требует вечности, учитывая тот факт, что я собираюсь применить это к ~ 4000 изображений.
thresh_map = Image.new('RGB', grads.shape, color='white')
blac = Image.new('RGB', (1, 1), color='black')
blue = Image.new('RGB', (1, 1), color='blue')
redd = Image.new('RGB', (1, 1), color='red')
gree = Image.new('RGB', (1, 1), color='green')
for i in range(grads.shape[0]):
for j in range(grads.shape[1]):
print(i, j)
if grads[i, j] < 0.035:
thresh_map.paste(blac, (i, j))
elif .035 < grads[i, j] < 0.7:
thresh_map.paste(redd, (i, j))
elif 0.7 < grads[i, j] < 0.75:
thresh_map.paste(gree, (i, j))
elif 0.75 < grads[i, j]:
thresh_map.paste(blue, (i, j))
np_thresh_map = np.asarray(thresh_map)
cv2.imshow('1_thresh', np_thresh_map)
cv2.waitKey()
Есть либолее сложный и эффективный способ сделать это?