Python skimage图像数据类型与颜色空间转换详解

顾言
顾言
发布时间:2026-10-16 | 4人浏览过
原创

本文详解Python skimage库中图像的数据类型(如uint8、float)及其相互转换方法,重点讲解RGB、灰度、HSV等常见颜色空间的转换函数与用法,包含代码示例及注意事项。

一、图像数据类型及转换

在skimage库中,图像被表示为NumPy数组,其数据类型多样且支持相互转换。不同数据类型对应的取值范围各不相同,具体对应关系可参考下表。

Data typeRange
uint80 to 255
uint160 to 65535
uint320 to 232
float-1 to 1 or 0 to 1
int8-128 to 127
int16-32768 to 32767
int32-231 to 231 - 1

图像像素值的默认范围通常为[0, 255],因此默认数据类型为uint8。可以通过以下代码查看图像的数据类型:

from skimage import io,data
img=data.chelsea()
print(img.dtype.name)

在上述类型表中,需特别注意float类型,其取值范围通常为[-1, 1]或[0, 1]。当彩色图像转换为灰度图像时,其数据类型会从uint8自动转换为float类型。

1、uint8转float

from skimage import data,img_as_float
img=data.chelsea()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)

输出结果如下:

uint8 float64

2、float转uint8

from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
dst=img_as_ubyte(img)
print(dst.dtype.name)

输出结果如下:

float64 uint8

将float类型转换为uint8时,可能会因数值截断导致数据丢失,系统会发出警告提示。

除了上述两种常用转换外,skimage还提供其他类型转换函数,具体见下表:

Function nameDescription
img_as_floatConvert to 64-bit floating point.
img_as_ubyteConvert to 8-bit uint.
img_as_uintConvert to 16-bit uint.
img_as_intConvert to 16-bit int.

二、颜色空间及其转换

如前所述,除了直接的数据类型转换外,还可以通过改变图像的颜色空间来间接改变数据类型。

常用的颜色空间包括灰度空间、RGB空间、HSV空间和CMYK空间。进行颜色空间转换后,图像的数据类型通常会变为float型。

所有颜色空间转换函数均封装在skimage的color模块中。

示例:RGB转灰度图

from skimage import io,data,color
img=data.lena()
gray=color.rgb2gray(img)
io.imshow(gray)

其他转换方式

用法类似,以下列举常用函数:

skimage.color.rgb2grey(rgb)

skimage.color.rgb2hsv(rgb)

skimage.color.rgb2lab(rgb)

skimage.color.gray2rgb(image)

skimage.color.hsv2rgb(hsv)

skimage.color.lab2rgb(lab)

实际上,上述所有转换函数均可由一个通用函数替代实现。

skimage.color.convert_colorspace(arr, fromspace, tospace)

该函数表示将数组arr从fromspace颜色空间转换到tospace颜色空间。

示例:RGB转HSV

from skimage import io,data,color
img=data.lena()
hsv=color.convert_colorspace(img,'RGB','HSV')
io.imshow(hsv)

在color模块的颜色空间转换函数中,还有一个较为实用的函数是

skimage.color.label2rgb(arr),该函数可根据标签值对图像进行着色,适用于图像分类后的可视化着色。

示例:将lena图像分为三类,并使用默认颜色对这三类进行着色

from skimage import io,data,color
import numpy as np
img=data.lena()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
    for j in range(cols):
        if(gray[i,j]<0.4):
            labels[i,j]=0
        elif(gray[i,j]<0.75):
            labels[i,j]=1
        else:
            labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)

以上即为Python数字图像处理中数据类型及颜色空间转换的详细内容,更多相关Python图像数据类型与颜色空间的资料,请关注本站其他相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表