[英]Preventing auto scale for 16-bit image data
当我尝试在python中保存16位图像数据时,像素值会自动缩放为65536。例如,16位数据中的最大值为1536。如果我保存并读取此数据,则最大值变为65k。 如何防止这种缩放? 我尝试了不同的映像库,包括opencv,PIL,misc,imageio,但是所有这些库都使用了这种缩放。
例如:
img_arr # let it contains 16-bit gray-scale image data
print np.amax(img_arr) # it prints 1536
cv2.imwrite(img_arr, "asd.png")
img_arr = cv2.imread("asd.png")
print np.amax(img_arr) # it prints 65k value
使用OpenCV ,这可以满足您的需求。
import cv2
import numpy as np
# Synthesize 200x200 uint16 image with 39,999 as max value
im = np.arange(0,40000,dtype=np.uint16).reshape((200,200))
# Write to disk
cv2.imwrite('result.png',im)
# Re-read from disk
rr = cv2.imread('result.png',cv2.IMREAD_UNCHANGED)
# Check maximum value
print(rr.max()) # prints 39999
PIL / Pillow不支持16位灰度,因此您需要提升为32位带符号,如下所示:
from PIL import Image
import numpy as np
# Synthesize 32-bit signed image
im = np.arange(0,40000,dtype=np.int32).reshape((200,200))
# Make into PIL Image
pim = Image.fromarray(im,'I')
# Save as 16-bit PNG, or 16-bit NetPBM PGM
pim.save('result.png')
pim.save('result.pgm')
# Re-read either file for same result, namely 39999
rr = np.array(Image.open('result.pgm')).max()
rr = np.array(Image.open('result.png')).max()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.