Pillow图像处理笔记

Glider 十月 31, 2019

前言

自从有了博客,需要更新背景图片和添加新图,发现图片需要压缩,亮度调整等一系列操作才能更适合网页。于是捡起pillow,写了一个批处理py脚本。这里记录一下相关用法,以后可能补充。

官方手册

中文文档 这个好像不完整……大家还是看原版吧……

可用的压缩以及亮度调整代码

import os
from PIL import Image,ImageEnhance,ImageStat

origin_path = 'pic/origin/'
edited_path = 'pic/edited/'

def get_FileSize(filePath):
    fsize = os.path.getsize(filePath)
    fsize = fsize/float(1024*1024)
    return round(fsize,5)

def get_name_path(origin_path = origin_path):
    path_list = {}
    for pic in os.listdir(origin_path):
        pic_name =  os.path.splitext(pic)[0]
        path_list[pic_name] = origin_path+ str(pic)
    return path_list

def change_dark(pic_content): #传入待定
    bright_origin = ImageStat.Stat(pic_content.convert('L')).mean[0]
    print(bright_origin)
    brightness = 50 / bright_origin
    dark_pic = ImageEnhance.Brightness(pic_content).enhance(brightness)
    return dark_pic

def change_small(pic_content):#传入待定
    pass


path_list = get_name_path()
print(path_list)
for pic_name in path_list:
    print(pic_name,path_list[pic_name])
    pic = Image.open(path_list[pic_name]).convert('RGB')

    print(get_FileSize(path_list[pic_name]))
    # pic.show()
    pic = change_dark(pic)

    save_path = edited_path + pic_name +'.jpg'
    pic.save(save_path,quality=80)
    print(get_FileSize(save_path) )

    pic = Image.open(save_path)
    # pic.show()

用法笔记

PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。

通道

>>>from PIL import Image
>>> im= Image.open('1.jpg')
>>>im.getbands()
('R', 'G', 'B')

RGB到灰度图转换公式:Y = 0.299 R + 0.587 G + 0.114 B

模式

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。

>>> im.mode

'RGB'

>>> im = im.convert("I")

>>> im.mode

'I'

尺寸

>>>im.size

(800, 450)

坐标

PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

高阶操作

数据增强模块ImageEnhance

  1. 亮度
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.5 #这个是变亮,0.8就是变暗
image_brightened1 = enh_bri.enhance(brightness)
  1. 色彩饱和度:彩度除以明度,指色彩的鲜艳程度,也称色彩的纯度;
enh_col = ImageEnhance.Color(image)
color = 1.5 #增强,0.8减弱
image_colored1 = enh_col.enhance(color)
  1. 锐度:是反映图像平面清晰度和图像边缘锐利程度的一个指标。
enh_sha = ImageEnhance.Sharpness(image)
sharpness = 3.0
image_sharped1 = enh_sha.enhance(sharpness)
  1. 对比度
enh_con = ImageEnhance.Contrast(image)
contrast = 1.5
image_contrasted1 = enh_con.enhance(contrast)

数据统计模块ImageStat

ImageStat.Stat(image, mask)⇒ Stat instance

含义:计算给定图像的统计值。如果变量mask被赋值,将只针对变量mask所定义的区域进行统计。

>>> stat =ImageStat.Stat(im)
 
>>> stat.extrema #获取图像中每个通道的最大值和最小值。
 
[(2, 255), (0, 255), (0, 255)]

>>> stat.count #获取图像中每个通道的像素个数。
 
[786432, 786432,786432] 

>>> stat.sum #每个通道求和
 
[90912466.0,75765120.0, 59027727.0]

>>>stat.sum2 #每个通道求平方和
 
[14449895138.0,12289898764.0, 9141884969.0]

>>>stat.mean #求平均
 
[115.60117848714192,96.34033203125, 75.05763626098633]

>>>stat.median #中位数
 
[119, 80, 40]

>>>stat.rms #均方根值
 
[135.55069835243268,125.00965724006934, 107.81701101697355]

>>>stat.var #方差
 
[5010.359356216148,6345.954827388127, 5990.859103547667]

>>>stat.stddev #标准差
 
[70.78389192617306,79.66150153862358, 77.40064020114863]

结语

鉴于许多猛男不会ps~~审美猛男化~~,就不需要更高阶的操作了。以后如有需要就再更新,美滋滋。