【问题标题】:Conversion of image type int16 to uint8图像类型 int16 到 uint8 的转换
【发布时间】:2018-04-02 15:46:36
【问题描述】:

我有一张数据类型为int16 的图像。 因此,当我必须将其范围转换为 0-255 时,我有两种方法可以在 Python 中做到这一点。

1) 直接使用numpy.uint8函数

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

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

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

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

【问题讨论】:

    标签: python matlab numpy opencv image-processing


    【解决方案1】:

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

    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 就是答案。

    【讨论】:

    • 感谢您清理...我想缩放强度。所以首先我必须使用 cv2.normalize 然后是 np.uint8。对吗?
    • @user3515225 是的,不过如果您在cv2.normalize 中传递参数dtype=cv2.CV_8U,您可以一步完成。
    • np.clip() 执行您提到的 Matlab 饱和行为。同样值得一试的是uint8cv2.convertScaleAbs()
    【解决方案2】:

    转换数据格式的简单方法是使用以下公式。在这种情况下,可以将任何数组转换为新的自定义格式。

    # 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2021-01-22
      • 2016-07-25
      • 2019-11-14
      • 2014-04-30
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多