PIL (Python Image Library) 为 python 提供图像处理功能,以及基本图像操作(图像缩放、剪裁、旋转、颜色转换等)
在PIL中,最重要的模块为 Image
在 python 中通过 Image 模块读取指定地址图片并转化为二维数组:
from PIL import Image
import numpy as np
# 图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
# 读取图片
try:
img = Image.open(img_path)
except IOError:
print("Cannot open the img from the path",img_path)
# 将图片转化为数组格式
img_matrix = np.asarray(img)
print(img_matrix) # 打印数组
print(img_matrix.shape) # 打印数组的维度信息
img_matrix.shape 打印结果:
由打印结果我们可以知道这个图像的分辨率为 1920 ∗ 1080 1920*1080 1920∗1080 且为彩色图(3代表RGB三个Channels)。
而从数组的角度来说,该图像被转化成为了三维数组,数组大小为 1080 ∗ 1920 ∗ 3 1080*1920*3 1080∗1920∗3。
事实上,数组中的每个元素代表着图像某通道指定位置的颜色信息, e . g . e.g. e.g.
img_matrix[0,0,0]
代表着通道0(Red通道)的左上角第一个元素的颜色信息。这里假设读者已知图像的颜色信息的取值范围为 [ 0 : 255 ] [0:255] [0:255]。由打印可知R通道值为157。同样可以打印G通道以及B通道,将三个通道的颜色信息融合在一起,即为左上角第一个元素的综合颜色信息。
通过 .save() 方法,我们可以将图片保存为指定格式的图片。
from PIL import Image
# 输入&输出图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
out_img_name = img_path.split(".")[0] + ".png"
# 转化图片格式为png
Image.open(img_path).save(out_img_name)
通过 thumbnail 函数,可以将图片保存为指定大小的缩率图;缩小为 thumbnail 接受的元组参数中指定最长边大小等比例缩放。
from PIL import Image
# 输入&输出图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
out_img_name = "thumb_img.png"
# 创建图片缩率图
img = Image.open(img_path)
img.thumbnail((960,960))
img.save(out_img_name)
通过 crop() 函数可以从一幅图像中裁剪指定区域,crop() 函数的输入为一个四元组 (a, b, c, d),其中元素的含义可以理解为:(a,b) 为区域左上角坐标,(c,d) 为区域右下角坐标。
from PIL import Image
# 输入&输出图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
out_img_name = "crop_img.png"
# 读取图片
img = Image.open(img_path)
# 指定选择区域
box = (500,500,1000,1000) # 顺序为 (左,上,右,下)
region = img.crop(box)
# 将选择部分旋转90度然后放回
region = region.transpose(Image.ROTATE_90)
img.paste(region, box)
# 输出图片
img.save(out_img_name)
调整尺寸
调整尺寸的大小与缩率不同的在于,缩略会保存图片的宽高比并进行缩放;而调整则不会保留宽高比缩放到新设定尺寸。
对于调整尺寸 (不保存宽高比) ,我们可以用 resize() 函数,resize() 函数的输入为一个二元组 (a,b),其中元素a代表新尺寸的宽,而b代表高。
from PIL import Image
# 输入&输出图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
out_img_name = "resize_img.png"
# 打开图片并更改图片尺寸
img = Image.open(img_path).resize((1920,960))
img.save(out_img_name)
旋转
旋转通过函数 rotate(α),其中 α 代表旋转的角度,旋转角度为逆时针,旋转后的图像分辨率不发生改变:
from PIL import Image
# 输入&输出图片路径
img_path = r"D:\csdn相关内容\计算机视觉知识储备\PIL\volvo_xc90.jpg"
out_img_name = "rotate_img.png"
# 打开图片并更改图片尺寸
img = Image.open(img_path).rotate(45)
img.save(out_img_name)
分辨率未发生改变:
所以旋转后势必会丢失一些数据信息,上述案例中即左上角与右下角的部分像素信息:
# # # 接上
import numpy as np
img_array = np.asarray(img)
print(img_array[0][0][0], img_array[0][0][1], img_array[0][0][2])
e . g . e.g. e.g. 左上角元素的 RGB (0, 0, 0) 为黑色,图片旋转后将该部分信息将丢失,我们再将其旋转回:
# # # 接上
# 重新旋转回
img_back = Image.open(out_img_name).rotate(-45)
img_back.save("rotate_back_img.png")
图片链接(免费下载):https://download.csdn.net/download/weixin_43098506/86835234
更多相关问题以及可补充内容,留言或联系!感谢好评!