python3-处理不同文件格式的图像类型

发布时间:2021-07-27 15:23:03编辑:run阅读(324)

    文件格式:

      图像文件可以有不同的格式,其中流行的格式包括BMP(8位,24位,32位),PNG,JPG,JPEG,GIF,PPM,PNM,TIFF等。

      python图像处理将读取图像,并提取数据和一些有用的信息(图像尺寸,类型/模式和数据类型)


    从一种文件格式转换为另一种文件格式,将PNG格式转换为JPG格式,

    例:

    from PIL import Image
    
    im = Image.open(r'D:\image_processing\111.png')
    print(im.mode)  
    # RGB 模式
    im.save(r'D:\image_processing\111.jpg')


    但如果PNG文件是在RGBA模式下,则需要将其保存为JPG格式之前将其转换为RGB模式后,才能转换,否则报错

    from PIL import Image
    
    im = Image.open(r'D:\image_processing\222.png')
    print(im.mode)
    im.convert('RGB').save(r'D:\image_processing\222.jpg')


    图像类型(模式)

    单通道模式。每个元素由单个值表示。包括二值(单色)图像(每个像素由一个0~1表示)和灰度图像(每个像素由8位表示,其值通常在0~255内)都是单通道图像

    多通道图像。每个元素由一组值表示。多通道图像包括三通道图像和四通道图像。

    2.1 三通道图像。RGB图像和HSV图像都是三通道图像。RGB图像的每个像素由三元组(r,g,b)值表示,这三个值分别表示每个像素的红色,绿色和蓝色的通道颜色值。HSV图像的每个像素由三元组(h,s,v)值表示,这三个值分别表示每个像素的色调(颜色),饱和度(色彩,即颜色与白色的混合程度)和值(亮度,即颜色与黑色的混合程度)的通道颜色值。HSV模型描述颜色的方式与人眼感知的方式是相似的。

    2.2 四通道图像。RGBA图像的每个元素由四元组(r,g,b,a)值表示,其中最后一个通道表示透明度。

    一种图像模式转换为另一种图像模式,例可以将RGB图像转换为灰度图像:


    1. from skimage.io import imread, imsave, imshow, show, imread_collection, imshow_collection
      
      im = imread(r'D:\image_processing\image_material\111.jpg', as_gray=True)
      print(im.shape)
      imshow(im)
      show()

      image.png


    将某些图像转换为灰度图像时,可能会丢失一些信息(失真).

    使用color模块中的rgb2gray函数,彩色图像和灰度图像并排显示

    例:

    from skimage.io import imread
    from skimage import color
    import matplotlib.pylab as plt
    
    im = imread(r'D:\image_processing\image_material\555.jpg')
    im_g = color.rgb2grey(im)
    plt.subplot(121),plt.imshow(im, cmap='gray'),plt.axis('off')
    plt.subplot(122),plt.imshow(im_g, cmap='gray'),plt.axis('off')
    plt.show()

    image.png

    数字很明显几乎看不清楚了。


    颜色空间-通道

    图像的几个常用通道/颜色空间包括RGB,HSV,XYZ,YUV,YIQ,YPBPR,YCBCR和YDBDR,使用仿射映射将图像从一个颜色空间转换到另一个颜色空间。

    例:将图像从RGB颜色空间转换为HSV颜色空间

    from skimage.io import imread
    from skimage import color
    import matplotlib.pylab as plt
    
    # 指定默认字体
    plt.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    plt.rcParams['axes.unicode_minus'] = False
    im = imread(r'D:\image_processing\image_material\666.jpg')
    im_hsv = color.rgb2hsv(im)
    plt.gray()
    plt.figure(figsize=(10,8))
    plt.subplot(221), plt.imshow(im_hsv[...,0]), plt.title('H通道', size=20),
    plt.axis('off')
    plt.subplot(222), plt.imshow(im_hsv[...,1]), plt.title('s通道', size=20),
    plt.axis('off')
    plt.subplot(223), plt.imshow(im_hsv[...,2]), plt.title('v通道', size=20),
    plt.axis('off')
    plt.subplot(224), plt.imshow(im), plt.title('原图', size=20),
    plt.axis('off')
    plt.show()

    image.png


    存储图像的数据结构

    PIL使用Image对象存储图像,而scikit-image使用numpy ndarray数据结构存储图像数据,如何在这两种数据结构之间进行转换。

    转换图像数据结构.

    import matplotlib.pylab as plt
    import numpy as np
    from PIL import Image
    
    im = Image.open(r'D:\image_processing\image_material\a.jpg')
    im = np.array(im)
    imshow(im)
    plt.axis('off')
    show()

    image.png


    将numpy ndarray转换为PIL的image对象

    from skimage.io import imread
    from PIL import Image
    
    im = imread(r'D:\image_processing\image_material\a.jpg')
    am = Image.fromarray(im)
    am.show()

    image.png

关键字