Python图像处理库PIL中图像格式转换(一)

探索PILPython图像处理的强大工具 在这个视觉至上的时代,图像已成为我们日常生活中不可或缺的部分。无论是社交媒体上的分享,还是专业领域的图像分析,图像处理技术都扮演着至关重要的角色。但你是否曾想过,如何将这些静态的图像转化为动态的故事,或者从海量的图像数据中提取出有价值的信息?这正是Python图像处理——PILPython Imaging Library)的神奇之处。欢迎进入PIL的世界,这里是创意与技术的交汇点。PIL不仅仅是个工具集,它是个强大的盟友,帮助你解锁图像处理的无限可能。 阅读详情

在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。

对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

通过之前的博客对Image模块的介绍,对于PNGBMPJPG彩色图像格式之间的互相转换都可以通过Image模块的open()save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNGBMPJPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。

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

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

im.convert(mode) image

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

im.convert(mode, matrix) image

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

通过博客“Python图像处理库PIL的基本概念介绍”,我们知道PIL中有九种不同模式。分别为1LPRGBRGBACMYKYCbCrIF

本文我采用的示例图像是图像处理中经典的lena照片。分辨率为512x512lena图片如下:

一、模式“RGB”转换为其他不同模式

1、 模式“1

模式“1”为二值图像,非黑即白。但是它每个像素用8bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。

例子:

>>>from PIL import Image

>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_1 = lena.convert("1")

>>> lena_1.mode

'1'

>>> lena_1.size

(512, 512)

>>>lena_1.getpixel((0,0))

255

>>> lena_1.getpixel((10,10))

255

>>>lena_1.getpixel((10,120))

0

>>>lena_1.getpixel((130,120))

255

 

图像lena_1的模式为“1”,分辨率为512x512,如下:

2、 模式“L

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

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

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

例子:

>>> from PIL importImage

>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_L =lena.convert("L")

>>> lena_L.mode

'L'

>>> lena_L.size

(512, 512)

>>>lena.getpixel((0,0))

(197, 111, 78)

>>>lena_L.getpixel((0,0))

132

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

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

转换后的图像lena_L如下:

3、 模式“P

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

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

例子:

>>> from PIL importImage

>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_P =lena.convert("P")

>>> lena_P.mode

'P'

>>>lena_P.getpixel((0,0))

62

 

转换后的图像lena_P如下:

4、 模式“RGBA

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

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

例子: 

                                                                                                                              

>>> from PIL import Image

>>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>>lena.mode

'RGB'

>>>lena.getpixel((0,0))

(197,111, 78)

>>>lena_rgba = lena.convert("RGBA")

>>>lena_rgba.mode

'RGBA'

>>>lena_rgba.getpixel((0,0))

(197,111, 78, 255)

>>>lena_rgba.getpixel((0,1))

(196,110, 77, 255)

>>>lena.getpixel((0,0))

(197,111, 78)

>>>lena.getpixel((0,1))

(196,110, 77)

 

从实例中可以看到,使用当前这个方式将“RGB”图像转为“RGBA”图像时,alpha通道全部设置为255,即完全不透明。

转换后的图像lena_rgba如下:

5、 模式“CMYK

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

四种标准颜色是:CCyan = 青色,又称为‘天蓝色’或是‘湛蓝’MMagenta = 品红色,又称为‘洋红色’;YYellow = 黄色;KKey Plate(blacK) = 定位套版色(黑色)。

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

例子:

>>>from PIL import Image

>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena_cmyk =lena.convert("CMYK")

>>> lena_cmyk.mode

'CMYK'

>>>lena_cmyk.getpixel((0,0))

(58, 144, 177, 0)

>>> lena_cmyk.getpixel((0,1))

(59, 145, 178, 0)

>>>lena.getpixel((0,0))

(197, 111, 78)

>>>lena.getpixel((0,1))

(196, 110, 77)

 

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

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

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

转换后的图像lena_cmyk如下:

6、 模式“YCbCr

模式“YCbCr”为24位彩色图像,它的每个像素用24bit表示。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”图像。

例子:

>>>from PIL import Image

>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena_ycbcr =lena.convert("YCbCr")

>>>lena_ycbcr.mode

'YCbCr'

>>>lena_ycbcr.getpixel((0,0))

(132, 97, 173)

>>>lena.getpixel((0,0))

(197, 111, 78)

 

按照公式,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如下:

7、 模式“I

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

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

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

例子:

>>> from PIL import Image

>>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>>lena.getpixel((0,0))

(197,111, 78)

>>>lena.getpixel((0,1))

(196,110, 77)

>>> lena_I =lena.convert("I")

>>> lena_I.mode

'I'

>>>lena_I.getpixel((0,0))

132

>>>lena_I.getpixel((0,1))

131

>>> lena_L =lena.convert("L")

>>>lena_L.getpixel((0,0))

132

>>>lena_L.getpixel((0,1))

131

 

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

8、 模式“F

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

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

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

例子:

>>>from PIL import Image

>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>>lena.getpixel((0,0))

(197, 111, 78)

>>>lena.getpixel((0,1))

(196, 110, 77)

>>> lena_F =lena.convert("F")

>>> lena_F.mode

'F'

>>>lena_F.getpixel((0,0))

132.95199584960938

>>>lena_F.getpixel((0,1))

131.95199584960938

 

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

(未完待续)

Python PIL Image.save() PIL Image.save参数详解 阅读详情

相关推荐

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 382

PILPython Imaging Library)中保存图片时,save()函数使用详解

ICC配置文件是种描述颜色空间和颜色管理信息的文件,用于确保图像在不同设备和软件之间的致显示和输出。但是,对于大多数图像格式来说,水平和垂直方向上的 DPI 设置为相同的值是足够的。表示在保存图像时设置水平和垂直方向上的 DPI(每英寸点数)为相同的值。在上述示例中,我们将图像的 DPI 设置为 300,并使用。,同时将水平和垂直方向上的 DPI 设置为相同的值。参数,您可以将ICC配置文件嵌入到保存的图像中。以下是示例代码,展示了如何在保存图像时使用。的图像,并将ICC配置文件的路径设置为。

FurtherSkyQ的博客 3万+

Pillow(PIL)入门教程(非常详细)以及python实现jpg,png、ico、bmp格式互转大全

Pillow(PIL)入门教程(非常详细)以及python实现jpg,png、ico、bmp格式互转大全概述 Pillow的特点: python3安装pillow: ​Pillow是什么 Pillow创建Image对象: jpg,png: jpg与png格式互转代码:

拥抱具身智能,昇腾Ascend C 8145

python使用PIL实现图像的读取和保存

PIL支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。

L888666Q的博客 8126

python处理rgb_Python图像处理PIL图像格式转换

在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理PIL来实现不同图像格式转换。对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图...

weixin_39673742的博客 2303

Python图像处理PIL各模块详细介绍

Python图像处理PIL各模块详细介绍 Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file)image Image.open(file, mode)image 要从文件加载图像,使用 open() 函数, 在 Image 模块: ...

yohnyang的博客 8366

python语言PILImage.fromarray()实现多图片拼接

python语言PIL函数Image.fromarray()矩阵转图片用法示例。

feinifi的博客 2975

python进行基本的图像处理

转自 http://www.ituring.com.cn/tupubarticle/2024 第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像、图像转换和缩放、计算导数、画图和保存结果等的基本工具。这些工具的使用将贯穿本书的剩余章节。 1.1 PILPython图像处理

xiao_lxl的专栏 2万+

python PIL 图像处理

python PIL 图像处理

sinat_16423171的博客 2665

PIL save()报错ValueError: unknown file extension: debug日志

python图像处理,debug

eu_zero的博客 1万+

Python中使用PIL读取,显示,保存图片的方法

目录 、读取文件夹中的图片 二、打开指定文件夹图片 三、进行图片处理 四、进行显示图片 五、进行图片保存 六、利用PIL进行图片的读取、处理、保存的完整代码 、读取文件夹中的图片 for picture_name in os.listdir(directory_name): print(picture_name) # 读取图片名称及类型 file_name = directory_name + "/" + picture_name #...

m0_59821641的博客 4万+

18、改进的LSTM用于污染物浓度预测

本文探讨了改进的长短期记忆网络(MLSTM)在空气污染预测中的应用,重点分析了其对印度泰米尔纳德邦五个城市(金奈、塞勒姆、哥印拜陀、马杜赖和图蒂科林)的PM2.5、PM10、SO2和NO2四种污染物浓度的预测效果。通过与传统LSTM模型的对比实验,结果显示MLSTM在预测准确性和执行效率方面均优于LSTM。研究结果表明,MLSTM在空气质量预测领域具有较高的应用潜力,可为环境保护和空气质量管理提供有力支持。

j0k1l2m3n的博客 153

PCIe相关资料汇总.rar

PCI Express Base Specification Revision 1.0.pdfPCI Express Base Specification Revision 2.0.pdfPCI Express Base Specification Revision 3.0.pdfPCI Express Base Specification Revision 4.0, Version 1.0.pdfPCI Express Base Specification Revision 5.0, Version 1.0.pdfPCI Express CEM Revision 1.1.pdfPCI Express CEM Revision 2.0.pdfPCI Express CEM Revision 3.0.pdfPCI Express CEM Revision 4.0.pdfPCI Express M.2 Revision 0.7, Version 1.0.pdfPCI Express Mini Card Electromechanical Specification Revisi...PCI Express Mini Card Electromechanical Specification Revisi...

上一篇: Python图像处理库PIL的ImageStat模块介绍
下一篇: Python图像处理库PIL中图像格式转换(二)
icamera0
博客等级 码龄11年 597粉丝 61原创
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值