Почему преобразование 16 бит в 8 бит дает полосатое изображение?

1

Я тестирую алгоритм сегментации на нескольких спутниковых изображениях VHSR, который первоначально поставляется в 16-битном формате, но когда я конвертирую их в 8-битные изображения, полученные изображения показывают полосатый вид. Я пытаюсь использовать разные библиотеки python (skimage, cv2, scipy), получая аналогичные результаты.

1) Исходное 16-битное изображение - это 4-полосное изображение (NIR, B, G, R), поэтому вам нужно выбрать правильные полосы, чтобы создать истинное цветное изображение, RGB-изображение (4,3,2 полосы). заранее спасибо. Его можно скачать по этой ссылке: 16-битное изображение

2) Я использую этот код для преобразования каждого значения пикселя из 16-разрядного целого числа, которое теперь устанавливается в пределах 8-битного диапазона:

  from scipy.misc import bytescale
  SS = io.imread('Imag16bit.tif')
  SS = bytescale(SS)
  SS = np.asarray(SS) 
  plt.imshow(SS)

Это мой результат выше кода:

Изображение 174551

Любое предложение будет оценено, Хайме

  • 4
    Мое предложение было бы поделиться изображением, вашим кодом и результатом.
  • 0
    Привет @Mark_Setchell, я делюсь своим кодом, но я не знаю, как поделиться изображениями здесь, не могли бы вы объяснить мне, как загружать изображения здесь. Заранее спасибо, Хайме
Показать ещё 7 комментариев
Теги:
image-processing
image

2 ответа

1

bytescale работает для меня. Я думаю, что asarray шаг что-то asarray.

import cv2
from skimage import io
from scipy.misc import bytescale

image = io.imread('SkySat_16bit.tif')
cv2.imshow('Original', image)
print(image.dtype)

image = bytescale(image)
print(image.dtype)

cv2.imshow('Converted', image)
cv2.waitKey(0)

Изображение 174551

  • 1
    Извините, раньше я проголосовал слишком рано. Нет смысла тестировать с r4DQe.jpg . Нам нужна ссылка на исходный 16-битный файл TIF, поскольку JPG является 24-битным (8 бит на канал цвета), что дает неверные результаты.
  • 1
    У вас есть точка. @ Джейме, предоставьте ссылку на 16-битный файл TIF.
Показать ещё 3 комментария
0

Я думаю, что это способ сделать это:

#!/usr/local/bin/python3

from PIL import Image
from tifffile import imsave, imread

# Load image
im = imread('SkySat_16bit.tif')

# Extract Red, Green and Blue bands into separate 8-bit arrays
R = (im[:,:,3]/256).astype(np.uint8)
G = (im[:,:,2]/256).astype(np.uint8)
B = (im[:,:,1]/256).astype(np.uint8)

# Combine bands into RGB array
RGB = np.dstack((R,G,B))

# Save to disk
Image.fromarray(RGB).save('result.png')

Изображение 174551

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

  • 0
    Привет @Mark_Setchell, извините за задержку, следуя вашим шагам, я получил то же изображение, что и вы, немного темное изображение, но без полос. Спасибо хайме

Ещё вопросы

Сообщество Overcoder
Наверх
Меню