将图像类型int16转换为uint8

时间:2017-10-21 18:27:03

标签: python matlab numpy opencv image-processing

我的数据类型为int16的图片。 因此,当我必须将其范围转换为0-255时,我有两种方法可以在Python中执行此操作。

1)直接使用numpy.uint8功能

2)使用范围为0-255的OpenCV cv2.normalize函数,然后使用numpy.uint8

在Matlab中,我们使用uint8函数直接获得转换。 在

同样在第二种情况下,我使用NORM_MINMAX,强度值范围变为0-4

进行转换的正确方法是什么?

2 个答案:

答案 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