1 概述
安装
pip install pillow
概念
图像又RGB三个通道叠加得到
图形可看作像素阵列,可通过矩阵运算实现复杂操作
第一行程序
#encoding=utf-8
from PIL import Image
# 打开图片
img = Image.open('img/1.png')
# 显示图片
# img.show()
print('图片格式:', img.format)
print('图片大小:', img.size)
print('图片高度:', img.height, '图片宽度:', img.width)
print('图片(100,100)处像素值:', img.getpixel((100,100)))
2 图像混合
透明度混合
#encoding=utf-8
from PIL import Image
# 打开图片
img1 = Image.open('img/1.png').convert(mode='RGB')
# 创建与img1相同大小的红色图像
img2 = Image.new('RGB', img1.size, 'red')
# alpha表示透明度, alpha为0只显示img1,alpha为1只显示img2
Image.blend(img1, img2, alpha=0.5).show()
遮罩混合
#encoding=utf-8
from PIL import Image
img1 = Image.open('img/1.jpg')
img2 = Image.open('img/2.jpg')
# 调整大小
img2 = img2.resize(img1.size)
r,g,b = img2.split()
# img2的b通道对img1遮罩
Image.composite(img2, img1, b).show()
3 图像缩放 | 剪切粘贴
按像素缩放
#encoding=utf-8
from PIL import Image
img1 = Image.open('img/1.jpg')
img1.show()
# 按像素缩放,将每个像素扩大2倍
Image.eval(img1, lambda x:x*2).show()
会变亮
按尺寸缩放
#encoding=utf-8
from PIL import Image
img1 = Image.open('img/1.jpg')
# 复制图片
img2 = img1.copy()
print(img2.size)
# 按尺寸缩放到指定大小
img2.thumbnail((100,100))
img2.show()
剪切粘贴
#encoding=utf-8
from PIL import Image
img1 = Image.open('img/1.jpg')
img2 = img1.copy()
img3 = img1.copy()
# 剪切
img_crop = img2.crop((30, 30, 800, 800))
img3.paste(img_crop, (500, 500))
img3.show()
4 图像旋转镜像 | 分离合并
旋转 | 镜像
#encoding=utf-8
from PIL import Image
# 打开图片
img = Image.open('img/1.jpg')
# 旋转90度
# img.rotate(90).show()
# 上下镜像
# img.transpose(Image.FLIP_TOP_BOTTOM).show()
# 左右镜像
# img.transpose(Image.FLIP_LEFT_RIGHT).show()
# 90度镜像
# img.transpose(Image.ROTATE_90).show()
# 180度镜像
# img.transpose(Image.ROTATE_180).show()
# 颠倒
# img.transpose(Image.TRANSPOSE).show()
分离 | 合并
将图片1的通道与图片2的通道合并
#encoding=utf-8
from PIL import Image
img1 = Image.open('img/1.jpg')
img2 = Image.open('img/2.jpg')
img2 = img2.resize(img1.size)
# 分割
r1,g1,b1 = img1.split()
r2,g2,b2 = img2.split()
temp = [r1, g2, b1]
img = Image.merge('RGB', temp)
img.show()
5 图像滤镜
高斯模糊
#encoding=utf-8
from PIL import Image, ImageFilter
img = Image.open('img/1.jpg')
w, h = img.size
# 创建一个新图像,宽度为原图2倍
img_output = Image.new('RGB', (2*w, h))
# 原图粘贴至左侧
img_output.paste(img, (0, 0))
# 高斯模糊
img_filter = img.filter(ImageFilter.GaussianBlur)
# 滤镜粘贴至右侧
img_output.paste(img_filter, (w, 0))
img_output.show()
其他滤镜
# 边缘增强
img_filter2 = img.filter(ImageFilter.EDGE_ENHANCE)
# 寻找边缘
img_filter3 = img.filter(ImageFilter.FIND_EDGES)
详见文档
6 图片合成
ImageChops模块,通过计算像素值实现
加法,减法,变暗,变量,叠加
屏幕函数,先反色再叠加
反色(底片)
比较图像差异
#encoding=utf-8
from PIL import Image, ImageChops
img1 = Image.open('img/1.jpg')
img2 = Image.open('img/2.jpg')
# 加法
# ImageChops.add(img1, img2).show()
# 减法
# ImageChops.subtract(img1, img2).show()
# 变暗
# ImageChops.darker(img1, img2).show()
# 变亮
# ImageChops.lighter(img1, img2).show()
# 叠加
# ImageChops.multiply(img1, img2).show()
# 屏幕
# ImageChops.screen(img1, img2).show()
# 反色
# ImageChops.invert(img1).show()
# 比较
ImageChops.difference(img1, img2).show()
7 调整图片色彩亮度
ImageEnhance模块,色彩\对比度\亮度\清晰度
色彩调整器
#encoding=utf-8
from PIL import Image, ImageEnhance
img = Image.open('img/1.jpg')
w,h = img.size
img_output = Image.new('RGB', (3*w, h))
img_output.paste(img, (0, 0))
# 获取色彩调整期
image_color = ImageEnhance.Color(img)
# 色彩增强, 参数大于1增强
imgb = image_color.enhance(1.5)
img_output.paste(imgb, (w, 0))
# 色彩减弱
imgc = image_color.enhance(0.3)
img_output.paste(imgc, (2*w, 0))
img_output.show()
image.png
亮度调整器
# 获取亮度调整期
image_bright = ImageEnhance.Brightness(img)
# 亮度增强, 参数大于1增强
imgb = image_bright.enhance(1.5)
...
# 亮度减弱
imgc = image_bright.enhance(0.3)
image.png
像素点运算调整亮度
#encoding=utf-8
from PIL import Image
img = Image.open('img/1.jpg')
w, h = img.size
img_output = Image.new('RGB', (3*w, h))
img_output.paste(img, (0, 0))
# 对像素点进行运算
# 图像整体变亮
imgb = img.point(lambda i:i*1.4)
# 图像整体变暗
imgc = img.point(lambda i:i*0.3)
img_output.paste(imgb, (w, 0))
img_output.paste(imgc, (2*w, 0))
img_output.show()
image.png
8 ImageDraw绘制二维图像
ImageDraw对原图操作,达到修饰或注释的目的
可绘制直线\矩形\椭圆\点\文字等
#coding=utf-8
from PIL import Image, ImageDraw, ImageFont
# 创建白背景图像
img = Image.new('RGB', (300, 200), 'white')
# 绘制矩形
draw_obj = ImageDraw.Draw(img)
# 颜色 填充
draw_obj.rectangle((50, 50, 150, 150), outline='red', fill='blue')
# 字体
font = ImageFont.truetype('arial.ttf', 20)
draw_obj.text((50, 50), 'Vincent', fill='green',font=font)
img.show()
window字体位置:
C:\Windows\Fonts
9 ImageFont的使用
在原图片绘制
#coding=utf-8
from PIL import Image, ImageDraw
img = Image.open('img/1.jpg')
width, height = img.size
# 创建绘图对象
draw_obj = ImageDraw.Draw(img)
draw_obj.arc((0,0, width-1, height-1), 0, 360, fill='blue')
img.save('circle.jpg')
ImageFont的使用
#coding=utf-8
from PIL import Image, ImageDraw, ImageFont
img = Image.open('img/1.jpg')
draw_obj = ImageDraw.Draw(img)
# 加载默认字体
# font = ImageFont.load_default()
font = ImageFont.truetype('simhei.ttf', 80)
draw_obj.text((30, 10), '朵梵', font=font, fill='white')
img.show()
10 练习 - 绘制十字
#coding=utf-8
from PIL import Image, ImageDraw
img = Image.open('img/1.jpg')
draw_obj = ImageDraw.Draw(img)
w, h = img.size
draw_obj.line((0,0, w, h), fill=(255, 0, 0), width=20)
draw_obj.line((0,h, w, 0), fill=(255, 0, 0), width=20)
img.show()
11 练习 - 绘制验证码
验证码#coding=utf-8
from PIL import Image, ImageDraw, ImageFont
import random
width, height = 100, 100
# 白色背景
img = Image.new('RGB', (width, height), (255, 255, 255))
draw_obj = ImageDraw.Draw(img)
def get_color():
return (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
def get_char():
return chr(random.randint(65, 97))
# 绘制背景
for x in range(width):
for y in range(width):
draw_obj.point((x, y), fill=get_color())
font = ImageFont.truetype('simhei.ttf', 36)
# 绘制字母
for i in range(4):
draw_obj.text((10+i*20, 40), get_char(), fill=(255, 0, 0), font=font)
# 绘制干扰线
draw_obj.line((0, 0, 100, 100), fill='green', width=5)
img.show()
12 练习 - 绘制九宫格
TODO
网友评论