PIL Python包的安装:
sudo pip install Pillow
Image
模块是 PIL 图像处理的一个类,其提供了很多函数,包括图片加载,创建新图片等.
例如:
图片旋转 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_RIGHT,Image.FLIP_TOP_BOTTOM,Image.ROTATE_90,Image.ROTATE_180,Image.ROTATE_270,Image.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".
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)