Python数字图像处理教程之图像数据类型以及颜色空间转换
一、数字图像类型以及转换
在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间也可以转换。这些数据类型及取值范围如下表所示:
Data Type | Range |
---|---|
unit8 | 0 - 255 |
unit16 | 0 - 65535 |
unit32 | 0 - 2^32 |
float | -1 - 1 or 0 - 1 |
int8 | -128 to 127 |
int16 | -32768 to 32767 |
int32 | -2^32 - 2^32-1 |
一张图片的像素范围是[0, 255],所以类型是unit8,可以通过以下代码查看图像的数据类型:
from skimage import io, data img = data.chelsea() print(img.dtype.name)
输出为unit8。
关于上表,需要注意的是float类型,它的范围是[0, 1] 或者[-1, 1]。一张彩色图转换成灰度图之后就有unit8变成了float了。
1、unit8转换成float
from skimage import io, data, img_as_float img = data.chelsea() print(img.dtype.name) img_grey = cimg_as_float(img) print(img_grey.dtype.name)
输出为:
uint8 float64
2、float转换成unit8
from skimage import img_as_ubyte import numpy as np img = np.array([[0.2], [0.5], [0.1]], dtype=float) print(img.dtype.name) img_unit8 = img_as_ubyte(img) print(img_unit8.dtype.name)
输出为:
float64 uint8
float转为unit8,有可能会造成数据的损失,因此会有警告提醒。
除了这两种最常用的转换以外,其实有一些其它的类型转换,如下表:
函数名 | 功能 |
---|---|
img_as_float | Convert to 64-bit floating point. |
img_as_ubyte | Convert to 8-bit uint. |
img_as_uint | Convert to 16-bit uint. |
img_as_int | Convert to 16-bit int. |
二、颜色空间及其转换
要想改变图像的数据类型,除了前文直接改变数据类型,我们还可以通过转换颜色空间来实现。
常用的颜色空间有灰度空间、RGB空间、HSV空间和CMKY空间,颜色空间转换以后,数据类型都变成了float类型,所有的颜色空间转换函数都在skimage的color模块中。
例一:RGB图转换成灰度图
from skimage import io, data, color image = data.chelsea() image_grey = color.rgb2gray(image) io.imshow(image_grey) io.show()
输出:
灰度小猫
print(image.dtype.name, image_grey.dtype.name)
('uint8', 'float64')
其它的转换,用法都是一样的,列举常用的如下:
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 image = data.chelsea() image_hsv = color.convert_colorspace(image, 'RGB', 'HSV') io.imshow(image_hsv) io.show()
输出我就不贴了,图片太吓人。。
在color模块中还有一个特别有用的函数:
skimage.color.label2rgb(arr),可以根据标签值对图片进行着色。
例二、将小猫图片分三类并着色
from skimage import io, data, color
import numpy as np
image = data.chelsea() image_grey = color.rgb2gray(image) rows, cols = image_grey.shape labels = np.zeros([rows, cols]) for i in range(rows): for j in range(cols): if image_grey[i, j] >0.66: labels[i, j] = 0 elif image_grey[i, j] > 0.33: labels[i, j] = 1 else: labels[i, j] = 2 label_image = color.label2rgb(labels) io.imshow(label_image) io.show()
输出为: