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

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

在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()

输出:

84b825b9e8a3

灰度小猫

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()

输出为:

84b825b9e8a3

标签小猫

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值