如何使用Pillow

PIL库

PIL(Python Imaging Library)库是 Python 中用于处理图像的库,提供了广泛的功能,包括打开、操作和保存多种图像文件格式。PIL 库已经停止维护,取而代之的是 Pillow 库,它是 PIL 库的一个分支,提供了对更多图像格式的支持和一些改进。

pip install Pillow    #安装pillow库

Pillow中文官方文档

一.PIL库的常用函数

(i)open()函数,打开图片

from PIL import Image
a=Image.open("F:\\Pictures\\wallhaven-3klw69.jpg")   #记住是双括号
a.show()  #将图片进行输出展示

(ii)format 函数,定义了图像的信息

from PIL import Image
a=Image.open("F:\Pictures\wallhaven-3klw69.jpg")
print(a.format)    #显示为JPEG
a.show()

(iii)save() 函数,将目标图片保存在一个路径上

from PIL import Image
a=Image.open(ImgFile)
a.save("D:\\1.jpg")
#save函数的参数 文件名,拓展后缀
'''
format:指定保存图像的格式,如 JPEG、PNG、GIF 等。如果未指定格式,则根据文件扩展名自动推断。
quality:用于指定 JPEG 格式的图像质量,取值范围为 1-95。实际调用时都是些100
optimize:对于某些格式(如 GIF),通过将此参数设置为True来优化保存的图像文件大小。
progressive:对于 JPEG 格式,通过将此参数设置为True来生成渐进式的 JPEG 图像。
compress_level:用于某些格式(如 PNG),指定压缩级别。取值范围为 0-9,其中 0 表示无压缩,9 表示最高压缩。
subsampling:对于 JPEG 格式,用于指定色度子采样的方法。可以是0(4:4:4,无子采样)、1(4:2:2,水平子采样)或2(4:2:0,水平和垂直子采样)。
dpi:用于设置图像的 DPI(每英寸点数),可以传递一个整数值或表示水平和垂直 DPI 的元组。
icc_profile:用于指定图像的 ICC(International Color Consortium)配置文件的路径。
append_images:用于 GIF 格式,指定要附加到原始图像之后的图像序列。传递一个图像列表作为参数。
save_all:用于 GIF 格式,指定是否保存所有图像帧,默认为False。
loop:用于 GIF 格式,指定循环播放的次数。可以传递一个整数值,表示循环次数;或者传递0表示无限循环。
duration:用于 GIF 格式,指定每个帧之间的显示时间(以毫秒为单位)。
其他特定格式的参数:不同的图像格式可能具有特定的保存选项,可以根据格式的要求传递额外的参数。
'''

(iv)convert(),指定一种色彩模式

image.convert('1')  #一位像素,黑白
image.convert('L')  #8位像素,黑白
image.convert('P')  #32为像素,使用了调色板
image.convert('RGB') #3*8位像素,真彩色
image.convert('RGBA') #4*8位像素,带透明度掩膜的真彩色
image.convert('YCbCr') #3*8位像素,彩色视频格式
image.convert('I') #32位有符号的整数像素
image.convert('F') #32位浮点像素

(v)filter() ,对照片进行滤镜

from PIL import Image,ImageFilter
im = Image.open("F:\Pictures\wallhaven-3klw69.jpg")
im=im.filter(ImageFilter.GaussianBlur)  #高斯模糊
im=im.filter(ImageFilter.BLUR)  #普通模糊
im=im.filter(ImageFilter.EDGE_ENHANCE)  #边缘增强
im=im.filter(ImageFilter.FIND_EDGES)  #找到边缘
im=im.filter(ImageFilter.CONTOUR)  #轮廓
im=im.filter(ImageFilter.DETAIL) #细节

(vi)查看图像的直方图

print(im.histogram())

#返回像素点[0, 0, 0, 2, 0, 0, 3, 5, 6, 4, 5, 18, 24, 47, 46, 73, 98, 144, 237, 343, 439, 548, 646, 737, 875, 1001, 1164, 1168, 1240, 1294, 1301, 1329, 1343, 1449, 1419, 1589, 1876, 1752, 1847, 1955, 2393, 4017, 3712, 3848, 5346, 6367, 7782, 10960, 13371, 12173, 13156, 12734, 11110, 10277, 11624, 12831, 12536, 10936, 9063, 7592, 7588, 7205, 5954, 5668, 5185, 4589, 4377, 4420, 3979, 4065, 3821, 3702, 3573, 3337, 3179, 3096, 2979, 2988, 3209, 4362, 5109, 3783, 4471, 3910, 4246, 3729, 4024, 3873, 3477, 3362, 3238, 3749, 4235, 4182, 4086, 4663, 5242, 5575, 5679, 5183, 5555, 6381, 6987, 6949, 9722, 10596, 8322, 7772, 7429, 6081, 6430, 6635, 6189, 6408, 5723, 5079, 4657, 4180, 4525, 4591, 5052, 5203, 5707, 5633, 5674, 5299, 5983, 6809, 8267, 6729, 6475, 6339, 7039, 7476, 6243, 5160, 5148, 4613, 3810, 4213, 4171, 3695, 3750, 3954, 4027, 4041, 4107, 4323, 4545, 4802, 5669, 6999, 7247, 7142, 7911, 9562, 9433, 9818, 11726, 10535, 10742, 11743, 10621, 10004, 6464, 8835, 10098, 10091, 10320, 10057, 8021, 8271, 10683, 10263, 10653, 10252, 9652, 8347, 10402, 10566, 11128, 9318, 7662, 7278, 6221, 6206, 6305, 5985, 5833, 5828, 6004, 6405, 6835, 6842, 6673, 8024, 8899, 9265, 9584, 10176, 10041, 10200, 10143, 11433, 13606, 13215, 14392, 15421, 14405, 12828, 13269, 14292, 16107, 18431, 20195, 19930, 19800, 28792, 21789, 20137, 19045, 19241, 16253, 14095, 12149, 13944, 13208, 13792, 14741, 15204, 11713, 11372, 12367, 12680, 12810, 12268, 12605, 11662, 12256, 12312, 12069, 12027, 14499, 16648, 15962, 17870, 20147, 28185, 32875, 40050, 46437, 42132, 34800, 23096, 10913, 11704, 0, 1, 7, 1, 5, 11, 18, 21, 31, 41, 55, 124, 192, 230, 280, 339, 462, 521, 594, 734, 845, 1057, 1197, 1322, 1383, 1480, 1571, 1733, 1665, 1699, 1870, 2292, 2155, 2177, 2368, 2281, 2121, 2207, 2242, 2368, 2320, 2405, 2595, 2903, 3718, 5869, 6594, 7191, 9410, 10359, 9845, 10768, 9879, 7207, 9825, 11492, 11234, 10675, 10080, 10476, 11713, 10537, 11681, 10485, 10823, 10202, 9899, 8496, 7209, 6201, 5642, 5394, 5092, 4794, 4881, 4898, 4425, 4347, 4016, 4009, 3570, 3506, 3395, 3456, 3689, 3887, 4091, 4537, 4170, 4343, 4917, 5336, 5440, 5933, 5567, 5653, 6951, 6929, 6840, 7920, 7159, 6766, 7144, 7590, 6468, 6007, 5915, 5746, 5448, 6357, 5612, 5284, 5454, 5840, 5318, 4861, 4862, 5555, 6722, 6407, 5703, 5653, 6077, 6384, 6136, 6167, 6304, 5867, 4302, 5073, 4387, 3669, 3291, 3620, 3845, 3478, 2967, 2645, 2534, 2482, 2518, 2670, 2914, 3381, 5041, 5414, 5500, 6069, 4770, 6238, 7857, 7895, 8661, 7621, 6019, 7793, 8448, 9205, 9563, 10933, 8994, 8552, 8470, 8244, 8386, 8751, 9287, 11511, 10402, 10027, 17217, 9340, 7495, 6839, 6601, 6290, 5910, 6430, 7486, 8001, 7462, 8795, 8324, 6859, 6431, 8010, 7610, 6944, 7258, 6769, 6804, 6314, 7430, 8416, 9571, 10220, 11273, 10599, 9865, 9886, 12416, 14242, 16024, 16294, 15585, 16226, 14212, 16890, 18258, 17985, 18974, 18175, 18314, 17576, 18613, 20378, 20797, 20868, 23672, 26736, 31993, 42104, 43621, 50870, 51018, 33487, 32402, 28210, 24104, 23389, 16406, 17809, 20132, 14923, 20211, 16465, 14673, 12752, 11682, 11591, 13335, 15413, 13203, 11223, 7390, 6482, 3341, 1955, 1410, 652, 414, 242, 137, 90, 72, 63, 968, 201, 232, 258, 289, 359, 384, 448, 501, 550, 633, 671, 806, 824, 861, 1067, 1083, 1285, 1396, 1531, 1642, 1913, 2088, 2265, 2344, 2581, 2647, 2952, 2909, 3130, 3041, 2946, 2952, 3003, 3089, 3365, 3237, 3097, 3112, 3028, 2954, 2988, 2861, 2934, 2855, 3128, 3195, 3583, 5468, 6560, 7668, 10547, 13225, 15255, 13399, 10970, 13792, 14245, 12391, 10952, 12168, 13995, 12381, 12218, 11968, 11514, 11979, 11856, 11668, 9856, 7561, 7018, 6224, 5633, 5462, 5034, 5109, 5054, 4916, 5277, 5636, 5853, 6795, 6910, 6380, 7200, 8747, 11142, 11162, 12856, 14856, 13474, 21173, 14721, 12616, 14078, 17199, 16127, 15975, 15699, 13830, 11290, 10260, 9202, 8640, 8437, 7092, 6362, 6337, 6533, 6596, 5434, 4529, 4514, 5130, 4684, 4589, 4427, 4979, 3380, 3642, 3279, 2993, 2813, 2690, 2777, 2734, 2614, 2684, 2568, 2479, 2443, 2594, 2755, 3377, 3649, 2917, 4024, 5828, 5073, 5637, 5786, 5185, 4220, 4700, 4847, 4845, 5328, 5571, 5964, 5721, 6314, 6989, 9220, 11095, 15992, 11395, 12866, 11260, 8644, 10338, 13858, 10053, 9578, 10826, 12613, 10707, 10745, 12201, 11630, 9873, 12688, 10834, 11592, 10732, 11313, 8900, 9774, 11646, 8867, 9715, 11321, 9948, 10679, 10046, 9409, 8902, 8795, 9257, 9579, 9859, 10253, 10393, 10322, 10916, 11445, 14633, 17156, 22801, 27145, 24312, 23305, 21986, 17820, 19766, 19453, 18111, 15924, 14606, 17052, 16355, 14792, 17217, 18272, 17191, 16248, 16339, 17836, 15203, 18729, 18555, 17202, 17820, 15302, 14528, 13832, 17090, 16501, 14434, 13148, 9711, 9098, 7896, 7296, 5674, 6766, 7415, 7100, 5957, 6102, 5048, 4110, 3532, 3956, 2243, 1847, 1066, 805, 542, 370, 247, 181, 120, 104, 80, 158]

(vii)转换图像文件格式

from PIL import Image,ImageFilter

imgFile="test.gif"
if type(imgFile)==str and imgFile.endswith(('.bmp','.gif','.png')):    #判断图片的路径是不是一个字符串,以及后缀名
    im=Image.open(imgFile)    #打开图片
    im.convert('YCbCr').save(imgFile[0:-4]+'00.jpg')  #切片添加图片

(viii)屏幕截图

from PIL import ImageGrab
im=ImageGrab.grab((0,0,800,200))    #截取屏幕大小,四个点组合成横竖两条线段,分别
																		为横(0800),竖(0200)
tm=ImageGrab.grab()    #截取全屏
im.show()
tm.show()

(ix)图像缩放

a=a.resize((2560,1440)

(x)对比度增强

from PIL import Image,ImageEnhance
image = Image.open("F:\Pictures\won.jpg")
image.show()
#增强亮度
enh=ImageEnhance.Brightness(image)
brightness=2         #设置亮度的提高
image1=enh.enhance(brightness)
image1.show()
#色度增强
enh=ImageEnhance.Color(image)
col=2         #设置亮度的提高
image1=enh.enhance(col)
image1.show()
#对比度增强
enh=ImageEnhance.Contrast(image)
con=2         #设置亮度的提高
image1=enh.enhance(con)
image1.show()
#锐度增强
enh=ImageEnhance.Sharpness(image)
sha=2         #设置亮度的提高
image1=enh.enhance(sha)
image1.show()

二.PIL的应用

(i)对图片进行轮廓处理

from PIL import Image,ImageFilter
image=Image.open("F:\\Pictures\won.jpg")
image=image.filter(ImageFilter.CONTOUR)
image.show()

(ii)生成一张固定尺寸,固定颜色的照片

from PIL import Image
import random
#获取一个随机图片的r,g,b
def GetColo():
    a=random.randint(0,255)
    b=random.randint(0,255)
    c=random.randint(0,255)
    return (a,b,c)
#利用Image库的new()函数,新建一个图片,参数位RGB模式,宽高,随机颜色
image=Image.new('RGB',(150,50),GetColo())
#保存图片
image=image.save(open("test.png",'wb'),'png')

(iii)生成一张随机字符串随机颜色的图片

from PIL import Image,ImageDraw,ImageFont
import random
#获取一个随机图片的r,g,b
def GetColor():
    a=random.randint(0,255)
    b=random.randint(0,255)
    c=random.randint(0,255)
    return (a,b,c)
#获取随机字符,包括数字,大写字母,小写字母
def GetRandom():
    random_num=str(random.randint(0,9))
    random_low=chr(random.randint(97,122))  #chr函数将ascll码数字转换为字符
    random_upp=chr(random.randint(65,90))
    random_chr=random.choice([random_upp,random_low,random_num])   #choice函数从列表中随机选一个
    return random_chr

#利用Image库的new()函数,新建一个图片,参数位RGB模式,宽高,随机颜色
image=Image.new('RGB',(150,30),GetColor())
#获得一个画笔对象,将参数传递过去
draw=ImageDraw.Draw(image)
#获取一个font字体,参数是kumo.ttf以及字体的大小size
font = ImageFont.truetype('Sophia Script Free Demo.ttf', 26)  #ttf文件是本地的字体文件
#画出五个字符
for i in range(5):
    random_char=GetRandom()  #获取随机的字符
    draw.text((10+i*30,0),random_char,GetColor(),font)  #把内容画进image里面,参数是定位,字符,颜色,字体
#保存图片
image=image.save(open("test.png",'wb'),'png')
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以,Pillow 和 OpenCV 都提供了将 YUV 转换为 JPEG 的功能。 使用 Pillow: ```python from PIL import Image # 定义输入输出路径 input_path = '/path/to/yuv/files/' output_path = '/path/to/jpeg/files/' # 定义参数 width = 1920 height = 1080 # 批量转换 for i in range(1, 101): # 假设有100个yuv文件,文件名为1.yuv, 2.yuv, ..., 100.yuv # 读取yuv文件 yuv_file = open(input_path + str(i) + '.yuv', 'rb') yuv_data = yuv_file.read() yuv_file.close() # 将yuv数据转换为RGB像素数据 pixels = [] for j in range(0, width * height * 3, 3): Y = yuv_data[j] U = yuv_data[j + 1] V = yuv_data[j + 2] R = Y + 1.13983 * (V - 128) G = Y - 0.39465 * (U - 128) - 0.58060 * (V - 128) B = Y + 2.03211 * (U - 128) pixels.append((int(R), int(G), int(B))) # 创建Image对象并保存为JPEG格式 img = Image.new('RGB', (width, height)) img.putdata(pixels) img.save(output_path + str(i) + '.jpg') ``` 使用 OpenCV: ```python import cv2 # 定义输入输出路径 input_path = '/path/to/yuv/files/' output_path = '/path/to/jpeg/files/' # 定义参数 width = 1920 height = 1080 # 批量转换 for i in range(1, 101): # 假设有100个yuv文件,文件名为1.yuv, 2.yuv, ..., 100.yuv # 读取yuv文件 yuv_file = open(input_path + str(i) + '.yuv', 'rb') yuv_data = yuv_file.read() yuv_file.close() # 将yuv数据转换为BGR像素数据 img = np.zeros((height, width, 3), np.uint8) img[:, :, 0] = np.reshape(yuv_data[0:width*height], (height, width)) img[:, :, 1] = np.reshape(yuv_data[width*height:width*height*5//4], (height//2, width//2)) img[:, :, 2] = np.reshape(yuv_data[width*height*5//4:width*height*3//2], (height//2, width//2)) img = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_I420) # 保存为JPEG格式 cv2.imwrite(output_path + str(i) + '.jpg', img) ``` 需要注意的是,OpenCV 中的 YUV 格式为 I420,而不是 YUV420。在将 BGR 数据转换为 JPEG 格式时,Pillow 和 OpenCV 的实现方式略有不同,需要注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且一笑作春温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值