Я тестирую алгоритм сегментации на нескольких спутниковых изображениях 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)
Это мой результат выше кода:
Любое предложение будет оценено, Хайме
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)
r4DQe.jpg
. Нам нужна ссылка на исходный 16-битный файл TIF, поскольку JPG является 24-битным (8 бит на канал цвета), что дает неверные результаты.
Я думаю, что это способ сделать это:
#!/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')
Вы можете немного настроить контраст и проверить, что я выбрал правильные диапазоны.