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 08 Python
python操作gmail实例
Jan 14 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
python实现用户管理系统
Jan 10 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python中使用.py配置文件的方法详解
Nov 23 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Python基于百度AI实现抓取表情包
Jun 27 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
python 实现简单的FTP程序
2019/12/27 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
建材业务员岗位职责
2013/12/08 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python