2017-10-21 768 views
0

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

1)使用numpy.uint8函数直接

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

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

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

转换的正确方法是什么?

回答

2

所有这些做不同的事情。

np.uint8只考虑你的号码的最低字节。这就像在做value & 0xff

>>> img = np.array([2000, -150, 11], dtype=np.int16) 
>>> np.uint8(img) 
array([208, 106, 11], dtype=uint8) 

cv2.normalizecv2.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) 

uint8在Matlab简单的饱和值。上述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就是答案。

+0

感谢您澄清了这个问题......我想调整强度。所以首先我必须使用cv2.normalize然后np.uint8。对? – user3515225

+0

@ user3515225是的,尽管如果您在'cv2.normalize'中传递参数'dtype = cv2.CV_8U',您可以一步完成。 – Reti43