美文网首页Python数字图像处理Opencv-Python
Python数字图像处理(4):图像数据类型以及颜色空间转换

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

作者: 自律小生 | 来源:发表于2017-02-26 19:43 被阅读1917次

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

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

    输出为:

    标签小猫

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/aigowttx.html