python pil image,PIL图像处理
在数字图像处理中,不同的图像格式都有其固有的处理算法。所以在图像处理之前,你需要考虑你是基于哪种格式的图像来设计和实现算法。基于这一需求,本文利用python的图像处理库PIL来实现不同图像格式的转换。
对于彩色图像,无论图像格式是PNG、BMP还是JPG(在PIL是图像模块的打开),返回的图像对象模式都是“RGB”。对于灰度图像,无论图像格式是PNG、BMP还是JPG,打开后模式都是“L”。
正如在以前的博客中提到的,图像模块可以通过图像模块的打开(和保存)(函数)在PNG、BMP和JPG彩色图像格式之间转换。具体来说,当你打开这些图像时,PIL会将它们解码成三个通道的“RGB”图像。用户可以根据它来处理这个“RGB”图像。处理后,您可以使用save()函数将处理结果保存为PNG、BMP或JPG格式。现在已经完成了几种格式之间的转换。同样,其他格式的彩色图像也可以通过这种方式进行转换。当然,不同格式的灰度图像也可以以相同的方式执行,但是PIL解码图像是具有模式“L”的图像。
在这里,我想详细解释一下用于转换不同模式图像的图像模块的convert(函数)。
Convert))函数以三种格式定义,它们的定义格式如下:
im.convert(模式)图像
im . convert(1230“p”,* *选项)图像
im.convert(模式,矩阵)图像
将当前图像转换为具有不同参数的新模式,并生成新图像作为返回值。
在博客《Python图像处理库PIL基本概念介绍》中,发现PIL有9种不同的模式。它们是1、l、p、RGB、RGBA、CMYK、YCbCr、I和F.
我使用的样本图像是图像处理中经典的lena照片。分辨率为512x512的Lena图像如下。
另一方面,模式“RGB”被转换成其他不同的模式。
1.模式“1”
模式“1”是二进制图像,要么是黑色,要么是白色。但是,每个像素由8位表示,0表示黑色,255表示白色。尝试将lena图像转换为“1”图像。
例如:
from pilimportimagelena=image . open(d:\ code \ python \ test \ img \ \ Lena.jpg )Lena . mode 78)Lena _ 1
图像lena_1的模式为“1”,分辨率为512x512,如下图所示。
2.模式“L”
图案“L”是一个灰色图像。每个像素用8位表示,0代表黑色,255代表白色,其他数字代表不同的灰度。在PIL,从“RGB”模式到“L”模式的转换根据以下公式进行:
l=r * 299/1000g * 587/1000 b * 114/1000
尝试将lena图像转换为“L”图像。
例如:
from pilimportimagelena=image . open(d:\ code \ python \ test \ img \ \ Lena.jpg )Lena . mode 78)Lena _ ll
197 * 299/1000111 * 587/100078 * 114/1000=132.952,PIL只有整数部分是132。
转换后的图像lena_L如下。
3.模式“P”
模式“P”是每个像素的8位彩色图像。
八位表示根据调色板查询相应的颜色值。
让我们使用默认的调色板将lena图像转换为“P”图像。
示例:
来自PIL import image Lena=image . open( D:\ \ Code \ \ Python \ \ test \ \ img \ \ Lena . jpg )Lena . mode RGB Lena . get pixel((0,0))(197,111,78)Lena _ P=Lena . convert( P )Lena _ P . mode P Lena _ P . get pixel((0,0))62
转换后的图像lena_P如下:
4.模式“RGBA”
“RGBA”模式是一幅32-8位的彩色图像,它的每个像素由32位表示,其中24位表示红色、绿色和蓝色通道,另外8位表示alpha通道,即透明通道。
让我们把“RGB”模式的莉娜图像转换成“RGBA”图像。
示例:
从PIL导入Imagelena=image . open( D:\ \ Code \ \ Python \ \ test \ \ img \ \ Lena . jpg )Lena . mode RGB Lena . get pixel((0,0))(197,111,78)Lena _ rgba=Lena . convert( RGBA )Lena _ rgba . mode rgba Lena _ rgba . get pixel((0,0))(197,111,78,255)lena_rgba.getpixel((0,1))(196,
从示例中可以看出,当以当前方式将“RGB”图像转换为“RGBA”图像时,所有alpha通道都设置为255,这意味着它们是完全不透明的。
转换后的图像lena_rgba如下:
5.模式“CMYK”
模式“CMYK”是32位彩色图像,其每个像素由32位表示。模式“CMYK”是印刷的四色分色模式,是彩色印刷中使用的一种色彩套准模式。利用三原色和黑色油墨的混色原理,将总共四种颜色混合叠加,形成所谓的“全彩印刷”。
四种标准色分别是:C:青色=青色,又称‘天蓝’或‘蓝蓝’M:品红=洋红,又称‘洋红’;y:黄色=黄色;K: K:钥匙牌(黑色)=牌照颜色(黑色)。
让我们把RGB模式的lena图像转换成CMYK图像。
示例:
从PIL导入图片Lena=Image . open( D:\ \ Code \ \ Python \ \ test \ \ img \ \ Lena . jpg )Lena _ CMYK=Lena . convert( CMYK )Lena _ CMYK . mode CMYK Lena _ CMYK . get pixel((0,0))(58,144,177,0) lena_cmyk.getpixel((0,1))(59,145,178,0)lena.getpixel((0,0))(197
从例子中,我们可以知道在PIL将“RGB”转换为“CMYK”的公式如下:
C=255 - R
M=255克
Y=255 - B
K=0
因为转换公式比较简单,所以转换出来的图像颜色有些失真。
转换后的图像lena_cmyk如下:
6.模式“YCbCr”
模式“YCbCr”是24位彩色图像,并且它的每个像素由24位表示。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”模式的莉娜图像转换成“YCbCr”图像。
示例:
从PIL导入图片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位整数灰度图像,每个像素用32位表示,0代表黑色,255代表白色,(0,255)之间的数字代表不同的灰度。在PIL,从“RGB”模式到“I”模式的转换根据以下公式:
I=R * 299/1000G * 587/1000 B * 114/1000
让我们将“RGB”模式的lena图像转换为“I”图像。
示例:
从PIL导入Imagelena=image . open( D:\ \ Code \ \ Python \ \ test \ \ img \ \ Lena . jpg )Lena . get pixel((0,0))(197,111,78)lena.getpixel((0,1))(196,110,77)Lena _ I=Lena . convert( I )Lena _ I . mode I Lena _ I . get pixel((0,0))132lena_I.getpixel((0,1))131 lena_L=lena
从实验结果来看,模式“I”和模式“L”的结果完全相同,只是模式“L”的像素是8bit,而模式“I”的像素是32bit。
8.模式“F”
模式“F”是32位浮点灰度图像。它的每个像素由32位表示,0表示黑色,255表示白色。(0,255)之间的数字代表不同的灰度。在PIL,从“RGB”模式到“F”模式的转换根据以下公式:
f=R * 299/1000G * 587/1000 B * 114/1000
让我们将“RGB”模式的lena图像转换为“F”图像。
示例:
从PIL导入图片Lena=Image . open( D:\ \ Code \ \ Python \ \ test \ \ img \ \ Lena . jpg )Lena . get pixel((0,0))(197,111,78)lena.getpixel((0,1))(196,110,77)Lena _ F=Lena . convert( F )Lena _ F . mode F Lena _ F . get pixel((0,0))132.95199584960938 Lena _ F . get pixel
模式“F”的转换公式与模式“L”的转换公式相同,都是将RGB转换为灰度值的公式,但模式“F”会保留小数部分,比如实验中的数据。
(未完待续)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。