2015-12-19 2 views
0

Я стараюсь весь день комбинировать три ndarrays с одним jpeg-изображением. Я извлекаю три полосы, используя библиотеку gdal. Экспортированные значения в массиве выглядят следующим образом:Объединить массивы с растром (jpeg)

[[ 6355. 6586. 6646. ..., 704. 671. 725.] 
[ 5853. 6031. 6107. ..., 782. 813. 897.] 
[ 4632. 4748. 4305. ..., 837. 869. 802.] 
..., 
[ 1032. 1090. 1018. ..., 1500. 1441. 1387.] 
[ 958. 980. 913. ..., 1522. 1455. 1391.] 
[ 883. 932. 966. ..., 1489. 1369. 1378.]] 

Это одна извлеченная полоса из файла pix. У меня три группы. Здесь я пытаюсь объединить эти группы:

rgbArray = np.zeros((rows,cols,3), dtype=np.uint8) 
band1 = dataset.GetRasterBand(closest_channel(dict_channel, 640)-1) 
band2 = dataset.GetRasterBand(closest_channel(dict_channel, 550)-1) 
band3 = dataset.GetRasterBand(closest_channel(dict_channel, 460)-1) 
data1 = band1.ReadAsArray (0, 0, cols, rows).astype(np.float) 
data2 = band2.ReadAsArray (0, 0, cols, rows).astype(np.float) 
data3 = band3.ReadAsArray (0, 0, cols, rows).astype(np.float) 
rgbArray[..., 0] = data1 
rgbArray[..., 1] = data2 
rgbArray[..., 2] = data3 
img = Image.fromarray(rgbArray, 'RGB') 

и картина выглядит следующим образом: enter image description here

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

Я буду очень рад любой, любая помощь Большое спасибо

+0

'data1',' data2' и 'data3' являются массивами с плавающей запятой, но' rgbArray' является 'uint8'. Вы должны преобразовать массивы с плавающей запятой в диапазон (0, 255), прежде чем назначать их в 'rbgArray'. –

+0

Большое спасибо, то же самое, что и memoselyk. Спасибо за помощь. – Bulva

ответ

1

Основываясь на области данных, масштабировать его, чтобы быть в диапазоне [0, 255].

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

[...] 

data1 = band1.ReadAsArray (0, 0, cols, rows).astype(np.float) 

[...] 

# Normalize data range 
max1 = np.nanmax(data1) 
min1 = np.nanmax(data1) 

data1 = ((data1 - min1)/(max1 - min1)) * 255 

[...] 

rgbArray[..., 0] = data1.astype(int) 
+0

Большое спасибо, это работает! Я пытался умножить data1 на 255, но я не пытался сочетать минимальные значения. Картина выглядит хорошо, но она немного темная. Должен ли я использовать альфа-канал для облегчения изображения? – Bulva

+0

Нет ... альфа-канал имеет другую цель. Правильный подход будет заключаться в [увеличении яркости] (http://stackoverflow.com/a/11163652/5509239) изображения. – memoselyk

+0

Спасибо, это не выглядит легким, но я попробую это. – Bulva

Смежные вопросы