我的数据类型为int16
的图片。
因此,当我必须将其范围转换为0-255时,我有两种方法可以在Python中执行此操作。
1)直接使用numpy.uint8
功能
2)使用范围为0-255的OpenCV cv2.normalize
函数,然后使用numpy.uint8
。
在Matlab中,我们使用uint8
函数直接获得转换。
在
同样在第二种情况下,我使用NORM_MINMAX
,强度值范围变为0-4
。
进行转换的正确方法是什么?
答案 0 :(得分:4)
所有这些都做不同的事情。
np.uint8
仅考虑您号码的最低字节。这就像做value & 0xff
。
>>> img = np.array([2000, -150, 11], dtype=np.int16)
>>> np.uint8(img)
array([208, 106, 11], dtype=uint8)
带有cv2.normalize
规范类型的 cv2.NORM_MINMAX
根据normalisation function
img_new = (img - img.min()) * ((max_new - min_new) / (img.max() - img.min())) + min_new
它有效地将一个范围更改为另一个范围,并且相应地缩放中间的所有值。根据定义,原始的最小/最大值将成为目标最小/最大值。
>>> cv2.normalize(img, out, 0, 255, cv2.NORM_MINMAX)
array([255, 0, 19], dtype=int16)
Matlab中的 uint8
只是让你的价值饱和。高于255的所有内容都变为255,低于0的所有内容都变为0。
>> uint8([2000 -150 11])
ans =
255 0 11
如果您想复制Matlab的功能,可以
>>> img[img > 255] = 255
>>> img[img < 0] = 0
您要使用哪一个取决于您要做的事情。如果您的int16涵盖了像素值的范围,并且您希望将它们重新缩放到uint8,那么cv2.normalize
就是答案。
答案 1 :(得分:1)
转换数据格式的简单方法是使用以下公式。在这种情况下,可以将任何数组转换为新的自定义格式。
# In the case of image, or matrix/array conversion to the uint8 [0, 255]
# range
Import numpy as np
new_data = (newd_ata - np.min(new_data)) * ((255 - 0) / (np.max(new_data) -
np.new_data))) + 0