Scikit-image 简明教程
Scikit Image - Image datatypes
datatype 在计算机编程的上下文中,是指根据数据的属性及其可以执行的操作对数据进行分类或分类。它决定了计算机如何解释、存储和处理数据。
不同的编程语言有自己的数据类型集合,并且每种数据类型都有自己的属性。常见的数据类型包括整数、浮点数、字符、字符串、布尔值和数组。
Datatypes in Python Scikit Image
在 scikit-image 中,图像表示为 numpy 数组,并支持各种数据类型,也称为“dtypes”。库为 dtype 设置特定范围以避免图像强度失真。以下是 scikit-image 中常用的 dtypes 及其相应范围 −
-
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 的范围内。另一方面,整数数据类型可以跨越各自数据类型的所有范围。坚持使用这些范围非常重要,以避免数据丢失或像素强度解释错误。
Image data type conversion functions
在 scikit-image 中, skimage.util 模块中提供了一些函数,用于转换图像数据类型并确保图像强度的适当重新缩放。这些函数旨在在保留图像数据范围的同时处理转换和重新缩放。以下是在 scikit-image 中的图像数据类型转换函数−
-
Img_as_float
-
Img_as_ubyte
-
Img_as_uint
-
Img_as_int
这些函数提供了一种便捷的方法,用于在保持正确强度范围的同时将图像转换为所需的数据类型。此外,请务必避免直接在图像上使用 astype 函数,因为它可能违反与数据类型范围有关的假设。相反,您可以使用上面的转换函数来确保适当的数据类型转换和强度重新缩放。
Example 1
以下示例演示了在 scikit-image 中使用 astype() 方法和 img_as_float() 函数转换图像数组的数据类型之间的差异。
from skimage import util
import numpy as np
# Create an image with 8-bit unsigned integers
image = np.random.randint(0, 256, size=(1, 4), dtype=np.uint8)
print("Image array:", image)
# Convert the image to float using astype()
print('Converted to float using astype :',image.astype(float)) # These float values are out of range.
# Convert the image to float using img_as_float()
print("Converted to float using img_as_float:",util.img_as_float(image))
Image array: [[173 104 167 25]]
Converted to float using astype : [[173. 104. 167. 25.]]
Converted to float using img_as_float: [[0.67843137 0.40784314 0.65490196 0.09803922]]
通过使用 img_as_float() 函数,可以将图像数组正确转换为浮点数据类型,并且强度值按有效范围正确缩放。
这可确保正确的数据类型转换和强度重新缩放。
Example 2
以下示例演示了使用 skimage.util 模块中的 img_as_ubyte() 函数将浮点图像数组转换为 8 位无符号整数表示。
from skimage import util
import numpy as np
# Create an image with floating point numbers
image = np.array([0, 0.1, 0, 0.8, 0.3, 1], dtype=float)
print("Image array:", image)
# Convert the image data to 8-bit Unsigned integers
print("Converted to 8-bit uint using img_as_ubyte:",util.img_as_ubyte(image))
Image array: [0. 0.1 0. 0.8 0.3 1.]
Converted to 8-bit uint using img_as_ubyte: [0 26 0 204 76 255]