Python库 - PIL 之 Image 模块

PIL Python包的安装:

sudo pip install Pillow

Image 模块是 PIL 图像处理的一个类,其提供了很多函数,包括图片加载,创建新图片等.

PIL Image 模块函数汇总

例如:
图片旋转 45 度:

from PIL import Image

img = Image.open("test.jpg")
img.rotate(45).show()  #旋转

创建缩略图(thumbnails):

from PIL import Image

img = Image.open("test.jpg")
img.thumbnail((128, 128))
img.save("test.thumbnail", "JPEG")

https://pillow.readthedocs.io/en/3.1.x/handbook/concepts.html#concept-modes

图像 Mode 属性:

  • 1 - 1-bit 像素,黑和白,每个字节保存一个像素(1-bit pixels, black and white, stored with one pixel per byte)
  • L - 8-bit 像素 (8-bit pixels, black and white)
  • P - 8-bit 像素 (8-bit pixels, mapped to any other mode using a color palette 颜色调色板)
  • RGB - 3x8-bit 像素,真实颜色(3x8-bit pixels, true color)
  • RGBA - 4x8-bit 像素,真实颜色加上透明图 (4x8-bit pixels, true color with transparency mask)
  • CMYK - 4x8-bit 像素 (4x8-bit pixels, color separation)
  • YCbCr - 3x8-bit 像素 (3x8-bit pixels, color video format)
  • LAB - 3x8-bit 像素 (3x8-bit pixels, the L_a_b color space)
  • HSV - 3x8-bit 像素 (3x8-bit pixels, Hue, Saturation, Value color space)
  • I - 32-bit 带符号整数像素(32-bit signed integer pixels)
  • F - 32-bit 浮点数像素 (32-bit floating point pixels)

图像 Filters 属性:
多个输入像素映射到单个输出像素的几何操作.
四种不同像素重采样 filters:

  • NEAREST - 选择输入图像的最近像素;忽略其它输入像素.
  • BILINEAR - 图片 resize 时,对所有对输出值相关的所有像素进行线性插值,以得到输出像素;线性插值时,采用对输入图像 2x2 的区域.
  • BICUBIC - 图片 resize 时,对所有对输出值相关的所有像素进行三次插值,以得到输出像素;线性插值时,采用对输入图像 4x4 的区域.
  • LANCZOS - 对所有对输出值相关的所有像素采用高质量的 Lanczos filter(截断正弦) 进行插值,以得到输出像素;当前 PIL 版本,其仅用于 resize 和 thumbnail 方法.

图像坐标系统:
笛卡尔(Cartesian) 像素坐标系统;
左上角像素坐标为 (0, 0);
像素位置的坐标形式为二元数组 (x, y);
图像块的表示为四元数组,例如,800x600 的图片可记为 (0, 0, 800, 600).

PIL Image 模块内的函数

  • Image.fromarray(obj, mode=None)
    可以用 numpy.array 创建一个 Image 对象.
  • Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)
    图片格式转换.
  • Image.crop(box=None)
    返回 box 中的图片区域. box 是四元组,(left, upper, right, lower) 坐标.
  • Image.filter(filter)
    图片滤波.
  • Image.histogram(mask=None, extrema=None)
    图像直方图. 以像素统计的列表的形式,每个值代表每个像素值的数量.
  • Image.paste(im, box=None, mask=None)
    粘贴另一张图片到给定图片. box 可以是二元数组,给定 box 的左上角位置;或者,四元数组( left, upper, right, lower) 像素坐标;或者,None,等价于 ((0, 0)).
  • Image.putalpha(alpha)
    添加或者替换图片的 alpha 通道(即透明图). 如果图片没有 alpha 层,则先将图片转换为 "LA" 或 "RGBA" 图像格式. 添加的 alpha 层,图像格式必须是 "L" 或 "1". 尺寸与图片一致.
  • Image.resize(size, resample=0)
    图片 resize. size - 目标图像的尺寸,二元数组 (widthm height); resample - 重采样算法;Image.NEAREST(最近邻采样),Image.BILINEAR(线性插值),Image.BICUBIC(三次样条插值),Image.LANCZOS(高质量下采样滤波器,high-quality downsampling filter). 当 resample=0,或者图片的 mode="1" 或 model="P" 时,默认采用 Image.NEAREST.
  • Image.rotate(angle, resample=0, expand=0)
    图片旋转.
  • Image.transpose(method)
    图片翻转,水平翻转,或者每次旋转 90 度. method 可选参数有: Image.FLIP_LEFT_RIGHTImage.FLIP_TOP_BOTTOMImage.ROTATE_90Image.ROTATE_180Image.ROTATE_270Image.TRANSPOSE.
  • Image.save(fp, format=None, params)**
    图片保存. fp 为文件名. 可以指定存储图片的质量(jpeg压缩率),不同的压缩率保存的文件大小不同. 如:img.save(fp, "JPEG", quality=95)quality 值越高,保存的文件越大.
  • Image.split()
    图片通道分离,如 r,g,b,alpha=img.split()
  • Image.merge(mode, bands)
    图片通道合并,如 img_merge=Image.merge("RGB", (r,g,b))

1. 图片格式转换函数 Image.convert()

图片格式转换.
如,mode="P",则通过调色板palette 进行像素转化. mode=None,则

对于 PNG,BMP,JPG 格式的彩色图像,Image.open() 返回的图像模式都是 "RGB".
对于 PNG,BMP,JPG 格式的灰度图像,Image.open() 返回的图像模式是 "L".

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

    from PIL import Image

    img = Image.open("test.jpg")
    # img.mode = "RGB"

    img_1 = img.convert("1")
    # 模式 "1" 为二值图像,非黑即白.
    # 其每个像素用8个bit表示,0表示黑,255表示白.
    # img.mode = "1"

    img_L = img.convert("L")
    # 模式“L”为灰色图像,
    # 其每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度.
    # 转换公式:
    #     L = R * 299/1000 + G * 587/1000+ B * 114/1000

    img_P = img.convert("P")
    # 模式“P”为8位彩色图像,
    # 其每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的.

    img_RGBA = img.convert("RGBA")
    # 模式“RGBA”为32位彩色图像,
    # 其每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,
    # 另外8bit 表示alpha通道,即透明通道.

    img_CMYK = img.convert("CMYK")
    # 模式“CMYK”为32位彩色图像,
    # 其每个像素用32个bit表示.
    # C:Cyan = 青色(天蓝色, 湛蓝)
    # M:Magenta = 品红色(洋红色)
    # Y:Yellow = 黄色
    # K:Key Plate(blacK) = 定位套版色(黑色)
    # RGB 到 CMYK 的转换公式:
    # C = 255 - R;M = 255 - G; Y = 255 - B; K = 0

    img_YCbCr = img.convert("YCbCr")
    # 模式“YCbCr”为24位彩色图像,
    # 其每个像素用24个bit表示
    # Y:亮度分量
    # Cb:蓝色色度分量
    # Cr:红色色度分量
    # 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

    img_I = img.convert("I")
    # 模式“I”为32位整型灰色图像,
    # 每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度.
    # RGB 到 I 的转换公式:
    # I = R * 299/1000 + G * 587/1000 + B * 114/1000
    # 模式“I”与模式“L” 结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit.

    img_F = img.convert("F")
    # 模式“F”为32位浮点灰色图像,
    # 每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度.
    # RGB 到 F 的转换公式:
    # F = R * 299/1000+ G * 587/1000 + B * 114/1000
    # 模式“F”与模式“L”的转换公式一样,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分.

2. 图片滤波函数 Image.filter(filter)

参考 【python图像处理】图像的滤波(ImageFilter类详解)
参考 Python图像处理之Pillow--ImageFilter

图像滤波主要包括平滑、锐化、边界增强等.

    from PIL import Image
    from PIL import ImageFilter

    img = Image.open("test.jpg")

    img_blur = img.filter(ImageFilter.BLUR)
    img_contour = img.filter(ImageFilter.CONTOUR)
    img_min = img.filter(ImageFilter.MinFilter(3))

    img.show()

Image 模块中filter 函数提供的滤波方法有:

  • BLUR - 模糊滤波
  • CONTOUR - 轮廓滤波
  • DETAIL - 细节滤波
  • EDGE_ENHANCE - 边界增强滤波
  • EDGE_ENHANCE_MORE - 边界增强滤波(程度更深)
  • EMBOSS - 浮雕滤波
  • FIND_EDGES - 寻找边界滤波
  • SMOOTH - 平滑滤波
  • SMOOTH_MORE - 平滑滤波(程度更深)
  • SHARPEN - 锐化滤波
  • GaussianBlur(radius=2) - 高斯模糊,其中,radius 是平滑半径.
  • UnsharpMask(radius=2, percent=150, threshold=3) - 反锐化掩码滤波,其中,radius 是模糊半径;percent是反锐化强度(百分比);threshold 是被锐化的最小亮度变化.
  • Kernel(size, kernel, scale=None, offset=0) - 核滤波,其中,当前版本只支持核大小为3x3和5x5的核大小,且图像格式为 “L” 和 “RGB” 的图片;size指定核大小(width, height);kernel 是核权值的序列;scale 是缩放因子;offset 是偏移量,如果使用,则将该值加到缩放后的结果上.
  • RankFilter(size, rank) - 排序滤波,其中,size 是滤波核的大小;rank 是选取排在第rank位的像素,若大小为0,则为最小值滤波;若大小为size x size / 2则为中值滤波;若大小为size x size - 1则为最大值滤波.
  • MedianFilter(size=3) - 中值滤波,其中,size 是核的大小.
  • MinFilter(size=3) - 最小值滤波器,其中,size 是核的大小.
  • MaxFilter(size=3):最大值滤波器,其中,size 是核的大小.
  • ModeFilter(size=3) - 波形滤波器. 选取核内出现频次最高的像素值作为该点像素值,仅出现一次或两次的像素将被忽略,若没有像素出现两次以上,则保留原像素值. size 是核的大小.
    from PIL import Image, ImageFilter

    im = Image.open(im_path)
    # 高斯模糊
    im.filter(ImageFilter.GaussianBlur)
    # 普通模糊
    im.filter(ImageFilter.BLUR)
    # 边缘增强
    im.filter(ImageFilter.EDGE_ENHANCE)
    # 找到边缘
    im.filter(ImageFilter.FIND_EDGES)
    # 浮雕
    im.filter(ImageFilter.EMBOSS)
    # 轮廓
    im.filter(ImageFilter.CONTOUR)
    # 锐化
    im.filter(ImageFilter.SHARPEN)
    # 平滑
    im.filter(ImageFilter.SMOOTH)
    # 细节
    im.filter(ImageFilter.DETAIL)

3. 图片尺寸调整函数 Image.resize(size, resample=0)

resample - 重采样算法;

  • Image.NEAREST(最近邻采样)
  • Image.BILINEAR(线性插值)
  • Image.BICUBIC(三次样条插值)
  • Image.LANCZOS(高质量下采样滤波器,high-quality downsampling filter). 当
  • resample=0,或者图片的 mode="1" 或 model="P" 时,默认采用 Image.NEAREST.
    from PIL import Image

    img = Image.open("test.jpg")

    img_resize1 = img.resize((400, 300))  # 默认 Image.NEAREST
    # img_resize1 = img.resize((400, 300), Image.NEAREST)  # 默认 Image.NEAREST

    img_resize2 = img.resize((400, 300), Image.ANTIALIAS)  # 高质量的尺寸调整,抗锯齿模式

    img_resize3 = img.resize((400, 300), Image.BILINEAR)

    img_resize4 = img.resize((400, 300), Image.BICUBIC)

Last modification:May 9th, 2019 at 06:18 pm

Leave a Comment