您的位置:首页 > 编程语言 > Python开发

Python数字图像处理(4):图像数据类型以及颜色空间转换

2018-03-05 13:13 375 查看
附转载链接:https://www.jianshu.com/p/84b825b9e8a3

一、数字图像类型以及转换

在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间也可以转换。这些数据类型及取值范围如下表所示:
Data TypeRange
unit80 - 255
unit160 - 65535
unit320 - 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_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空间和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
9810
= 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()
输出为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: