Scikit Image - 图像数据类型

在计算机编程中,数据类型是指根据数据的属性以及可对其执行的操作对数据进行分类或归类。它决定了计算机如何解释、存储和操作数据。

不同的编程语言有自己的一组数据类型,每种数据类型都有其属性。常见的数据类型包括整数、浮点数、字符、字符串、布尔值和数组。

Python Scikit Image 中的数据类型

在 scikit-image 中,图像表示为 numpy 数组,并支持各种数据类型,也称为"dtypes"。该库为 dtype 设置了一定的范围,以避免扭曲图像强度。以下是 scikit-image 中常用的 dtype 及其对应的范围 −

  • uint8 − 无符号 8 位整数,范围从 0 到 255。
  • uint16 − 无符号 16 位整数,范围从 0 到 65535。
  • uint32 − 无符号 32 位整数,范围从 0 到 2^32 - 1。
  • float − 浮点值,通常范围从 -1 到 1 或 0 到 1。
  • int8 −有符号 8 位整数,范围从 -128 到 127。
  • int16 − 有符号 16 位整数,范围从 -32768 到 32767。
  • int32 − 有符号 32 位整数,范围从 -2^31 到 2^31 - 1。

请注意,浮点图像通常应限制在 -1 到 1 的范围内,即使浮点数据类型本身可以超出此范围。另一方面,整数数据类型可以跨越其各自数据类型的整个范围。坚持这些范围很重要,以避免数据丢失或对像素强度的错误解释。

图像数据类型转换函数

在 scikit-image 中,skimage.util 模块中提供了一些函数来转换图像数据类型并确保正确重新缩放图像强度。这些函数旨在处理转换和重新缩放,同时保留图像的数据范围。以下是 scikit-image 中的图像数据类型转换函数 −

  • Img_as_float
  • Img_as_ubyte
  • Img_as_uint
  • Img_as_int

这些函数提供了一种便捷的方法,可以将图像转换为所需的数据类型,同时保持正确的强度范围。此外,重要的是避免直接在图像上使用 astype 函数,因为它可能会违反有关 dtype 范围的假设。相反,您可以使用上述转换函数来确保正确的 dtype 转换和强度重新缩放。

示例 1

以下示例演示了使用 astype() 方法和 img_as_float() 函数在 scikit-image 中转换图像数组的数据类型之间的区别。

from skimage import util
import numpy as np

# 使用 8 位无符号整数创建图像
image = np.random.randint(0, 256, size=(1, 4), dtype=np.uint8)

print("图像数组:", image)

# 使用 astype() 将图像转换为浮点数
print('使用 astype 转换为浮点数:',image.astype(float)) # 这些浮点数值超出范围。

# 使用 img_as_float() 将图像转换为浮点数
print("使用 img_as_float 转换为浮点数:",util.img_as_float(image))

输出

图像数组:[[173 104 167 25]]
使用 astype 转换为浮点数:[[173. 104. 167. 25.]]
使用 img_as_float 转换为浮点数:[[0.67843137 0.40784314 0.65490196 0.09803922]]

通过使用 img_as_float() 函数,图像数组被正确转换为浮点数据类型,强度值在有效范围内正确缩放。

这确保了正确的数据类型转换和强度重新缩放。

示例 2

以下示例演示了使用 skimage.util 模块中的 img_as_ubyte() 函数将浮点图像数组转换为 8 位无符号整数表示。

from skimage import util
import numpy as np

# 用浮点数创建图像
image = np.array([0, 0.1, 0, 0.8, 0.3, 1], dtype=float)

print("图像数组:", image)

# 将图像数据转换为 8 位无符号整数
print("使用 img_as_ubyte 转换为 8 位 uint:",util.img_as_ubyte(image))

输出

图像数组: [0. 0.1 0. 0.8 0.3 1.]
使用 img_as_ubyte 转换为 8 位 uint: [0 26 0 204 76 255]