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根据出生年份简单计算生肖的方法
Mar 27 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python标准库sched模块使用指南
Jul 06 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
python实现接口并发测试脚本
Jun 25 Python
python+logging+yaml实现日志分割
Jul 22 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
Python传递参数的多种方式(小结)
Sep 18 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
PHP中cookie知识点学习
2018/05/06 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
利用python画出AUC曲线的实例
2020/02/28 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
Shell编程面试题
2012/05/30 面试题
编辑找工作求职信分享
2014/01/03 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书