Как преобразовать данные dtype (uint16) в 16-битное изображение PNG? - PullRequest
4 голосов
/ 23 марта 2019

Я пытаюсь зашифровать и расшифровать изображение с помощью алгоритма RSA. Для этого мне нужно прочитать изображение в оттенках серого, а затем применить ключи и сохранить массив типов uint16 в png или любой другой формат изображения, который поддерживает 16-битные данные. Затем мне нужно прочитать эти 16-битные данные, преобразовать их в массив и выполнить расшифровку. Теперь ранее я пытался сохранить изображение как .tif, и когда я читал его с

img = sk.imread('image.tiff', plugin = 'tifffile')

это обрабатывает изображение как RGB, а это не то, что я хочу. Теперь я хочу сохранить массив типов uint16 в 16-битное изображение PNG, которое будет принимать значения от 0 до 65536, а затем снова считывать его как данные типа uint16. Я пытался сохранить значения в 16-битном PNG-файле, используя

img16 = img.astype(np.uint16)
imgOut = Image.fromarray(img16)
imgOut.save('en.png')

Это дает мне эту ошибку: OSError: cannot write mode I;16 as PNG

Я также пытался imgOut = Image.fromarray(img16, 'I'), но это приводит к not enough image data

Пожалуйста, помогите мне сохранить 16-битные данные в формате .png. Спасибо.

1 Ответ

5 голосов
/ 23 марта 2019

Есть несколько возможностей ...

Сначала используйте imageio для записи 16-битного PNG:

import imageio
import numpy as np

# Construct 16-bit gradient greyscale image
im = np.arange(65536,dtype=np.uint16).reshape(256,256)

# Save as PNG with imageio
imageio.imwrite('result.png',im) 

Затем вы можете прочитать изображение обратно с диска и изменить первый пиксель на средне-серый (32768) следующим образом:

# Now read image back from disk into Numpy array
im2 = imageio.imread('result.png') 

# Change first pixel to mid-grey
im2[0][0] = 32768

Или, если вам не нравится imageio, вы можете использовать PIL/Pillow и сохранить 16-битный TIFF:

from PIL import Image
import numpy as np

# Construct 16-bit gradient greyscale image
im = np.arange(65536,dtype=np.uint16).reshape(256,256)

# Save as TIFF with PIL/Pillow
Image.fromarray(im).save('result.tif')

Затем можно прочитать изображение с диска и изменить первый пиксель на средне-серый, например:

# Read image back from disk into PIL Image
im2 = Image.open('result.tif')                                                                                             

# Convert PIL Image to Numpy array
im2 = np.array(im2)

# Make first pixel mid-grey
im2[0][0] = 32768

enter image description here


Ключевые слова : Изображение, обработка изображений, Python, Numpy, PIL, Pillow, imageio, TIF, TIFF, PNG, 16 бит, 16 бит, короткий, без знака, сохранить, записать.

...