图像类型int16到uint8的转换

Gun*_*aik 2 python matlab opencv numpy image-processing

我有一个数据类型的图像int16。因此,当我不得不将其范围转换为0-255时,我有两种方法可以在Python中实现。

1)numpy.uint8直接使用功能

2)cv2.normalize在0-255范围内使用OpenCV 功能,然后使用numpy.uint8

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

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

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

Ret*_*i43 5

所有这些都做不同的事情。

np.uint8仅考虑数字的最低字节。就像在做value & 0xff

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

cv2.normalizecv2.NORM_MINMAX标准型根据正常化你的价值观正常化功能

img_new = (img - img.min()) * ((max_new - min_new) / (img.max() - img.min())) + min_new
Run Code Online (Sandbox Code Playgroud)

它可以有效地将一个范围更改为另一个范围,并且之间的所有值都会相应缩放。根据定义,原始的最小/最大值成为目标的最小/最大值。

>>> cv2.normalize(img, out, 0, 255, cv2.NORM_MINMAX)
array([255,   0,  19], dtype=int16)
Run Code Online (Sandbox Code Playgroud)

uint8在Matlab中只是使您的价值饱和。高于255的所有内容都变为255,低于0的所有内容都变为0。

>> uint8([2000 -150 11])

ans =

  255    0   11
Run Code Online (Sandbox Code Playgroud)

如果您想复制Matlab的功能,则可以

>>> img[img > 255] = 255
>>> img[img < 0] = 0
Run Code Online (Sandbox Code Playgroud)

您要使用哪一个取决于您要执行的操作。如果您的int16涵盖了像素值的范围,并且您想将它们重新缩放为uint8,那么cv2.normalize答案就来了。