Визуализация полос RGB изображения RGBN - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть спутниковое изображение в полосе RGBN. PlanetScope, которое я хотел бы обработать для нейронной сети.Когда я просматриваю изображение в QGIS, я получаю хорошее изображение RGB, однако при импорте в виде массива изображение очень светлое.Некоторая информация на изображении:

Type of the image :  <class 'numpy.ndarray'>

Shape of the image : (7327, 7327, 5)
Image Height 7327
Image Width 7327
Image Shape (7327, 7327, 5)
Dimension of Image 3
Image size 268424645
Maximum RGB value in this image 65535
Minimum RGB value in this image 1

Изображение имеет тип uint16.Последняя полоса (pic [:,:, 5]) показывает только единственное значение (65535) во всех случаях.Следовательно, я думаю, что эту полосу следует удалить, оставляя полосы RGBN, информация о которых выглядит следующим образом:

Type of the image :  <class 'numpy.ndarray'>

Shape of the image : (7327, 7327, 4)
Image Height 7327
Image Width 7327
Image Shape (7327, 7327, 4)
Dimension of Image 3
Image size 214739716
Maximum RGB value in this image 19382
Minimum RGB value in this image 1

Максимальное значение (19382) изображения RGBN кажется довольно низким, зная, что диапазон uint16изображения 0-65535.Впоследствии функция 'skimage.io.imshow (image)' показывает почти белое изображение.Я не понимаю, почему QGIS может правильно отображать изображение в реальном цвете, а python - нет.

Изображение загружается с помощью pic = skimage.io.imread("planetscope_20180502_43.tif")

Я пытался масштабировать изображение с помощьюimg_scaled = pic / pic.max() и преобразование его в uint8 перед просмотром изображения с img_as_ubyte(pic) безуспешно.Я просматриваю изображение с помощью skimage.io.imshow(pic).

При необходимости изображение можно загрузить здесь .Я включил изображение, потому что почему-то кажется невозможным импортировать изображение с использованием определенных пакетов (например, Tifffile не работает с этим файлом TIF).

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

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

for i in range(0,4):
    min_ = int(np.percentile(image[:,:,i],2))
    max_ = int(np.percentile(image[:,:,i],98))

    np.maximum(image[:,:,i])
    np.minimum(image[:,:,i])

    image[:,:,i] = np.interp(image[:,:,i], image[:,:,i].min(), image[:,:,i].max(), (0,255))

image_8bit_scaled = skimage.img_as_ubyte(image)
0 голосов
/ 27 ноября 2018

Максимальные значения каналов RGB ниже, чем у канала N:

>>> pic.max(axis=(0,1))
array([10300,  7776, 11530, 19382, 65535], dtype=uint16)

Но посмотрите на средние значения каналов RGB: они намного меньше, чем max / 2:

>>> pic.mean(axis=(0,1))
array([  439.14001492,   593.17588875,   542.4638124 ,  3604.6826063 ,
   65535.        ])

У вас есть изображение с высоким динамическим диапазоном (HDR), и вы хотите сжать его до 8 бит для отображения.Линейное масштабирование с максимальным значением не подходит, поскольку максимальные пики на порядок выше средних значений изображения.Построение гистограммы значений RGB:

Histogram of RGB data

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

rgb = pic[..., :3].astype(np.float32) / 2000
rgb = np.clip(rgb, 0.0, 1.0)

Но чтобы получить правильное изображение, вам нужно будет посмотреть, как камера реагирует на ваши данные, и как ониИзображения HDR обычно сжимаются в 8 бит для отображения (я не знаком со спутниковыми изображениями).

...