Python图像处理库PIL中图像格式转换的实现


Posted in Python onFebruary 26, 2020

在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用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中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。

这里,我想详细介绍一下Image模块的convert()函数,用于不同模式图像之间的转换。

Convert()函数有三种形式的定义,它们定义形式如下:

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

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

本文我们采样的图片是lena的照片:

模式“1”:

>>> from PIL import Image
>>> lena = Image.open("lena.bmp")
>>> lena.mode
'RGB'
>>> lena.getpixel((0,0))
(226, 137, 125)
>>> lena_1 = lena.convert("1")
>>> lena_1.mode
'1'
>>> lena_1.size
(512, 512)
>>> lena_1.getpixel((0,0))
>>> lena_1.getpixel((10,10))
>>> lena_1.getpixel((10,120))
>>> lena_1.getpixel((130,120))
>>> lena_1.show()

结果:

Python图像处理库PIL中图像格式转换的实现

模式“L”:

模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

下面我们将lena图像转换为“L”图像。

>>> lena_L = lena.convert("L")
>>> lena_L.mode
'L'
>>> lena_L.size
(512, 512)
>>> lena_L.getpixel((0,0))
>>> lena.getpixel((0,0))
(226, 137, 125)
>>> lena_L.show()
>>> lena_L.save("lena_l.bmp")
>>>

对于第一个像素点,原始图像lena为(197, 111, 78),其转换为灰色值为:

197 *299/1000 + 111 * 587/1000 + 78 * 114/1000= 132.952,PIL中只取了整数部分,即为132。

转换后的图像lena_L如下:

Python图像处理库PIL中图像格式转换的实现

模式P:

模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。

下面我们使用默认的调色板将lena图像转换为“P”图像。

example:

>>> lena_P = lena.convert("P")
>>> lena_P.mode
'P'
>>> lena_P.getpixel((0,0))

结果:

Python图像处理库PIL中图像格式转换的实现

模式“RGBA”:

模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

下面我们将模式为“RGB”的lena图像转换为“RGBA”图像。

>>> lena_rgba = lena.convert("RGBA")
>>> 
>>> 
>>> 
>>> lena_rgba.mode
'RGBA'
>>> lena_rgba.getpixel((0,0))
(226, 137, 125, 255)
>>> lena_rgba.getpixel((0,1))
(226, 137, 125, 255)
>>> lena_rgba.show()

Python图像处理库PIL中图像格式转换的实现

模式“CMYK”:

模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。

四种标准颜色是:C:Cyan =青色,又称为‘天蓝色'或是‘湛蓝'M:Magenta =品红色,又称为‘洋红色';Y:Yellow =黄色;K:Key Plate(blacK) =定位套版色(黑色)。

下面我们将模式为“RGB”的lena图像转换为“CMYK”图像。

>>> lena_cmyk = lena.convert("CMYK")
>>> lena_cmyk.mode
'CMYK'
>>> lena_cmyk.getpixel((0,0))
(29, 118, 130, 0)
>>> lena_cmyk.getpixel((0,1))
(29, 118, 130, 0)
>>> lena_cmyk.show()

从实例中可以得知PIL中“RGB”转换为“CMYK”的公式如下:

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

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

转换后的图像lena_cmyk如下:

Python图像处理库PIL中图像格式转换的实现

模式“YCbCr”:

模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

模式“RGB”转换为“YCbCr”的公式如下:

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

下面我们将模式为“RGB”的lena图像转换为“YCbCr”图像。

>>> lena_ycbcr = lena.convert("YCbCr")
>>> lena_ycbcr.mode
'YCbCr'
>>> lena_ycbcr.getpixel((0,0))
(162, 107, 173)
>>> lena.getpixel((0,0))
(226, 137, 125)
>>>

按照公式,Y =0.257*197+0.564*111+0.098*78+16= 136.877

Cb=-0.148*197-0.291*111+0.439*78+128= 100.785
Cr = 0.439*197-0.368*111-0.071*78+128 = 168.097

由此可见,PIL中并非按照这个公式进行“RGB”到“YCbCr”的转换。

转换后的图像lena_ycbcr如下:

Python图像处理库PIL中图像格式转换的实现

模式“I”

模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:

I = R * 299/1000 + G * 587/1000 + B * 114/1000

下面我们将模式为“RGB”的lena图像转换为“I”图像。

>>> lena_I = lena.convert("I")
>>> lena_I.mode
'I'
>>> lena_I.getpixel((0,0))
>>> lena_I.getpixel((0,1))
>>> lena_L = lena.convert("L")
>>> lena_L.getpixel((0,0))
>>> lena_L.getpixel((0,1))

从实验的结果看,模式“I”与模式“L”的结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit。 

模式“F”

模式“F”为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:

F = R * 299/1000+ G * 587/1000 + B * 114/1000

下面我们将模式为“RGB”的lena图像转换为“F”图像。

>>> lena_F = lena.convert("F")
>>> lena_F.mode
'F'
>>> lena_F.getpixel((0,0))
162.2429962158203
>>> lena_F.getpixel((0,1))
162.2429962158203
>>>

Python图像处理库PIL中图像格式转换的实现

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

以上就是Python图像处理库PIL中图像格式转换的实现的详细内容,更多关于PIL 图像格式转换的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
实例讲解Python中的私有属性
Aug 21 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
Python中的列表知识点汇总
Apr 14 Python
简单谈谈Python流程控制语句
Dec 04 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
Python concurrent.futures模块使用实例
Dec 24 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
什么是Python包的循环导入
Sep 08 Python
利用python进行文件操作
Dec 04 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
Python基础之字典常见操作经典实例详解
Feb 26 #Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 #Python
python解释器pycharm安装及环境变量配置教程图文详解
Feb 26 #Python
Python如何使用turtle库绘制图形
Feb 26 #Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 #Python
Python定时器线程池原理详解
Feb 26 #Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 #Python
You might like
PHP中对数据库操作的封装
2006/10/09 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
图片自动更新(说明)
2006/10/02 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python 控制语句
2011/11/03 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
优秀企业获奖感言
2014/02/01 职场文书
运动会演讲稿
2014/05/07 职场文书
维稳工作情况汇报
2014/10/27 职场文书
助学感谢信范文
2015/01/21 职场文书
村官个人总结范文
2015/03/03 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers