图像数据类型及颜色空间转换
一 图像数据类型转换
在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间可以转换。这些数据类型及取值范围如下表所示:
一张图片的像素值范围是[0,255], 因此默认类型是unit8, 可用如下代码查看数据类型:
from skimage import io,data
img=data.astronaut()
print(img.dtype.name)
结果为:uint8
1.1 unit8转float
from skimage import data,img_as_float
img=data.astronaut()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)
结果如下所示:
uint8
float64
1.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
除了上述的两种转换,还有一些常见的转换,将他们一同整理到下表之下:
Function name | Description |
---|---|
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空间和cmyk空间。颜色空间转换以后,图片类型都变成了float型。所有的颜色空间转换函数,都放在skimage的color模块内。
2.1 rgb转灰度图
from skimage import io,data,color
img=data.astronaut()
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)
基于上述的转换,有几点需要说明:
- Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。
- HSV颜色空间指的是色调、饱和度和明度
2.2 rgb转hsv
实际上,上面的所有转换函数,都可以用一个函数来代替:skimage.color.convert_colorspace(arr, fromspace, tospace)表示将arr从fromspace颜色空间转换到tospace颜色空间。
from skimage import io,data,color
img=data.astronaut()
hsv=color.convert_colorspace(img,\'RGB\',\'HSV\')
io.imshow(hsv)
结果如下图所示:
2.3 颜色空间转换中其他重要的函数
在color模块的颜色空间转换函数中,还有一个比较有用的函数是
skimage.color.label2rgb(arr)
可以根据标签值对图片进行着色。以后的图片分类后着色就可以用这个函数。
例:将astronaut图片分成三类,然后用默认颜色对三类进行着色
from skimage import io,data,color
import numpy as np
img=data.astronaut()
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)
结果如下图所示: