zoukankan      html  css  js  c++  java
  • Python图像处理库PIL中图像格式转换

    转载自:Python图像处理库PIL中图像格式转换

    对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。
    而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。
    对Image模块的介绍,对于PNG、BMP和JPG彩色图像格式之间的互相转换都可以通过Image模块的open()和save()函数来完成。
    具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。
    处理完毕,使用函数save(),可以将处理结果保存成PNG、BMP和JPG中任何格式。这样也就完成了几种格式之间的转换。

    对于不同的格式的图像之间转换,我们需要使用convert函数

    im.convert(mode) ⇒ image
    im.convert(“P”, **options) ⇒ image
    im.convert(mode, matrix) ⇒ image

    使用不同的参数,将当前的图像转换为新的模式,并产生新的图像作为返回值。

    PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F

    原图像:

    1、 模式“1”---二值图像

    模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。
    from PIL import Image
    
    im = Image.open("./g.png")
    print(im.mode)  
    print(im.size)
    print(im.getpixel((0,0)))   #获取指定点处的像素值
    
    im_1 = im.convert("1")
    print(im_1.mode)
    print(im_1.size)
    print(im_1.getpixel((0,0)))
    print(im_1.getpixel((140,140)))
    im_1.show()
    RGB
    (286, 289)
    (156, 169, 193)
    1
    (286, 289)
    255
    0

     

    2、 模式“L”---灰度图像

    模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
    
    L = R * 299/1000 + G * 587/1000+ B * 114/1000
    im_L = im.convert("L")
    RGB
    (286, 289)
    (156, 169, 193)
    L
    (286, 289)
    167
    86   #156*299/1000+169*587/1000+193*114/1000 ---> 46.644+99.203+22.002 ---> 167.849  PIL中只取了整数部分

    3、 模式“P”---八位彩色图像,色彩值由调色板查询

    模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。
    im_P = im.convert("P")
    RGB
    (286, 289)
    (156, 169, 193)
    P
    (286, 289)
    175
    96 

    4、 模式“RGBA”---4通道RGB和alpha透明道

    模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。
    im_RGBA = im.convert("RGBA")
    RGB
    (286, 289)
    (156, 169, 193)
    RGBA
    (286, 289)
    (156, 169, 193, 255)  #4通道,默认将RGB图像转RGBA时,alpha通道为255
    (91, 85, 83, 255

    5、 模式“CMYK”---印刷四分色模式(C青色M品红Y黄色K黑色)

    模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。
    
    四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。
    im_CMYK = im.convert("CMYK")
    RGB
    (286, 289)
    (156, 169, 193)
    CMYK
    (286, 289)
    (99, 86, 62, 0)
    (164, 170, 172, 0)

    转换公式

    C = 255 - R
    M = 255 - G
    Y = 255 - B
    K = 0 

    由于该转换公式比较简单,转换后的图像颜色有些失真。

     6、 模式“YCbCr”---24位(Y亮度Cb蓝色色度Cr红色色度)

    模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。
    Y= 0.257*R+0.504*G+0.098*B+16
    Cb = -0.148*R-0.291*G+0.439*B+128
    Cr = 0.439*R-0.368*G-0.071*B+128
    im_YCbCr = im.convert("YCbCr")
    RGB
    (286, 289)
    (156, 169, 193)
    YCbCr
    (286, 289)
    (167, 142, 119)
    (86, 126, 131)

    7、 模式“I”---与上面灰度模式L一致

    模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:
    im_I = im.convert("I")
    I = R * 299/1000 + G * 587/1000 + B * 114/1000
    RGB
    (286, 289)
    (156, 169, 193)
    I
    (286, 289)
    167
    86
    模式“I”与模式“L”的结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit。

     

    8、 模式“F”---32位浮点灰色图像

    模式“F”为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:
    F = R * 299/1000+ G * 587/1000 + B * 114/1000
    im_F = im.convert("F")
    RGB
    (286, 289)
    (156, 169, 193)
    F
    (286, 289)
    167.8489990234375
    86.56600189208984

     

    模式“F”与模式“L”的转换公式是一样的,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分,如实验中的数据。

     另外:其他模式转RGB类似使用convert方法

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9292062.html
Copyright © 2011-2022 走看看