图像处理基本操作走一波(pillow实现)
Crossin的编程教室
共 5311字,需浏览 11分钟
·
2021-03-31 13:32
大家好,欢迎来到 Crossin的编程教室 !
上一篇文章(接到一个紧急需求:去除镜头中的特定品牌logo)中提及了图像处理相关的内容。于是就有小伙伴在后台留言问,有没有这方面的教程。那么今天我们就来分享一篇关于 python 中非常实用的一个图像处理库:pillow 的16种基础用法。
PIL:Python Imaging Library,是Python环境下最受欢迎的图像处理库,木有之一。然而,在Python2.7之后不再支持。
好在又有了pillow!它派生于PIL,支持Python3,简单优雅而功能强大,是图像相关机器学习任务中算法工程师的亲密合作伙伴。
下面我们将介绍pillow的16个图片处理功能:
1, 图片读写
2, 图片与array互转
3, 图片与string互转
4, 图片由彩色转灰度
5, 图片通道分离与合并
6, 调整图片尺寸
7, 截取图片部分区域
8, 图片旋转
9, 图片翻转
10, 提取图片边缘
11, 图片高斯模糊
12, 在图片上绘制文字
13, 在图片上绘制直线
14, 在图片上绘制矩形
15, 在图片上绘制椭圆
16, 在图片上粘贴其他图片
〇,安装
安装pillow非常简单。
pip install pillow
一,图片读写
import numpy as np
from PIL import Image,ImageFilter,ImageDraw,ImageFont
# 读取图片
img = Image.open("./data/猫咪图片.jpg")
print(img.format, img.size, img.mode)
print(img.info)
img
JPEG (641, 641) RGB
{'jfif': 257, 'jfif_version': (1, 1), 'dpi': (72, 72), 'jfif_unit': 1, 'jfif_density': (72, 72)}
# 保存图片
img.save("./data/猫咪图片.png")
二,图片与array互转
# Image转np.array
img = Image.open("./data/猫咪图片.jpg")
arr = np.array(img)
print(arr.shape)
print(arr.dtype)
(641, 641, 3)
uint8
# np.array转Image
arr = (np.ones((256,256))*np.arange(0,256)).astype(np.uint8)
img = Image.fromarray(arr)
img
三,图片与string互转
# Image转string
import base64
from io import BytesIO
img = Image.open("./data/猫咪图片.jpg")
buffer = BytesIO()
img.save(buffer, 'PNG')
b = buffer.getvalue()
s = base64.b64encode(b).decode("utf-8")
print(s[0:1000])
iVBORw0KGgoAAAANSUhEUgAAAoEAAAKBCAIAAACnMebvAAEAAElEQVR4nOz96bMtSXIfiLl7ROR2lru+raqrqxsEQBAkRuKMRHI0kj6OSTLJ9M+KRumTTJwxyWZGJm6DIQguAHqp7lree3c5S2ZGhLs+eIbfOOe+V13dKGxjCHt27b5z82RGRnj4z3fHT69fJB3CiEhEDCIi5H1KKQt775umEYRpmsZx/PGnn3Vd94tf/OLu7u7y8lJExnG8uro6Ho/ee+ccMwNA13UXFxebzeZnP/uZcw4R53k+Ho/TNIkIIiIiMxMREaWUcs6bzebm5mae5/1+H2NsmiaEkHOe55mZvfcAkFKa5xkA9OL1er3ebv/oj/7IOSciOUbv/cPDAwr0fb/uh5ubmxDCeDgi4vF4/NnPfjYHBAAsQ38HgJxzSklEiAgARKRt22EYmqaZpul4PM7zbDMXEfgbMnSqurP2EwDGcaz/axf/DXq1aZq6rgMAEfmd3/mdm5ubn/3sZz//+c9TSgCgJCEiIYS+7+d5nqYp5+y9R8Scs4g45z5287NdtrUaOdknKICIZNfI8tOWlABczuv1uuu6lNI0TXo6mFkncHZ/AEhxdM7ps5TenHPOuZTSarXquo6Z7eAw80wZAHJMMUZP5L3PMY2Ho3Nuu1oPfS8iHJOIcMoxRiYnIjlnvQ8UCsk5O+dCCCEEXRb9PMWdnt+cc4wx50xEeuXxeBSRYRj6vnfO6XmJhwcqQ99UxzAMIqK/1y8ukpUVzPOsR7tt26ZphmGwZdEn6jQaDHoHRBTCnPM4juM89X2/Px6dcxcXF74JMcYQwna7TeCULyknSSkhovfezoWus1F+hFnXvGmapml0bjlnKIxCr0TEEIL3fjelpml0xexk7ff74/GoX1TmZqv9W3/3d66vr5l5HMfNsOr7npkJMMYoOSsnzjEpt5znOca42+2Ucg6HwzzPV1dXn3766YsXL0IIXdc1TQMA8zyP4xhj
# string转Image
b = base64.b64decode(s.encode("utf-8"))
buffer = BytesIO(b)
img = Image.open(buffer)
img
四,图片由彩色转灰度
# 转成灰度
img = Image.open("./data/猫咪图片.jpg")
img.convert("L")
五,图片通道分离与合并
# 分离通道
img = Image.open("./data/猫咪图片.jpg")
r,g,b = img.split()
b
# 合并通道
Image.merge(mode = "RGBA", bands = [r,g,b,r])
六, 调整图片尺寸
# 调整大小
img = Image.open("./data/猫咪图片.jpg")
print(img.size)
img_resized = img.resize((300,300))
print(img_resized.size)
img_resized
(641, 641)
(300, 300)
七, 截取图片部分区域
img = Image.open("./data/猫咪图片.jpg")
img_croped = img.crop(box = [78,24,455,320])
print(img_croped.size)
img_croped
(377, 296)
八, 图片旋转
img = Image.open("./data/猫咪图片.jpg")
img_rotated = img.rotate(15,center = (0,0)) #以center为中心逆时针旋转
img_rotated
九, 图片翻转
img = Image.open("./data/猫咪图片.jpg")
# 左右翻转
img_left_right = img.transpose(Image.FLIP_LEFT_RIGHT)
img_left_right
# 上下翻转
img_top_bottom = img.transpose(Image.FLIP_TOP_BOTTOM)
img_top_bottom
十, 提取图片边缘
img = Image.open("./data/猫咪图片.jpg")
img_edges = img.filter(ImageFilter.FIND_EDGES)
img_edges
十一, 图片高斯模糊
img = Image.open("./data/猫咪图片.jpg")
img_blur = img.filter(ImageFilter.GaussianBlur(radius=3))
img_blur
十二, 在图片上绘制文字
img = Image.open("./data/猫咪图片.jpg")
draw = ImageDraw.Draw(img)
arial = ImageFont.truetype('./data/simsun.ttc', 46)
draw.text((250,450),"敢梭哈吗?",font =arial, fill="white")
img
十三, 在图片上绘制直线
img = Image.open("./data/猫咪图片.jpg")
draw = ImageDraw.Draw(img)
draw.line([0,0,641,641],fill = "red",width = 5)
img
十四, 在图片上绘制矩形
img = Image.open("./data/猫咪图片.jpg")
draw = ImageDraw.Draw(img)
draw.rectangle([78,24,455,320], fill=None, outline ='lawngreen',width = 5)
img
十五, 在图片上绘制椭圆
img = Image.open("./data/猫咪图片.jpg")
draw = ImageDraw.Draw(img)
draw.arc(xy = [78,24,455,320],start = 0,end = 360,fill="red",width=5)
img
十六, 在图片上粘贴其他图片
img = Image.open("./data/猫咪图片.jpg")
img_resized = img.resize((150,150))
img.paste(img_resized,box = [460,50])
img
以上就是 pillow 的一些基本操作。对pillow和图像处理方面有其他疑问或想法,可以在留言区中讨论交流,具体代码问题可发在我们的论坛上(附上必要的代码和输出)。
如果文章对你有帮助,欢迎转发/点赞/收藏~
作者:梁云1991
_往期文章推荐_
评论