给大家分享一下 Python 的图像处理库 PIL(Pillow)使用频率较高的一些图像基本操作,主要有crop和resize。
本次分享的具体内容包括将图像按照自己的设定裁剪成不同尺寸的像素块,以达到数据增强的目的;或者自动设定像素区域来裁剪掉图像中不想要的上下左右边缘区域;或者根据自己的设定改变图像的原本的高分辨率大小,一文搞定,同时我们也可以来对比一下crop和resize的各自效果。
PIL(Pillow)— crop
在 Python 的图像处理库 PIL(Pillow)中,crop 方法用于裁剪图像。你可以指定裁剪区域的左上角坐标和右下角坐标,从而从原始图像中切出特定部分。
接触过神经网络或者深度学习的同学都知道,训练数据是可以影响实验结果的,而充足的训练数据可以让你的模型更好的学习映射特征,从而你可以得到更好的实验反馈。那么如果你训练过程中发现训练集数据过少,你可以通过图像裁剪成像素块来增强数据集,甚至也可以用旋转一定角度,水平翻转等数据增强操作来丰富数据集,那么今天主要介绍crop图像裁块。下面直接放代码和实验效果。
首先我们在桌面建立一个文件夹,我的文件夹中只有一张这样的正常png图片,此时他的像素是1080*1080。
crop图像裁剪像素块—w*w等长和宽像素块
import os
from PIL import Image
#用PIL库批量裁剪指定大小的图像(自动填充)
def img_crop(img_path, save_path):
files = os.listdir(img_path)
for file in files:
a, b = os.path.splitext(file)
img = Image.open(os.path.join(img_path + "/" + file))
width, hight = img.size
w = 100 # 需要切成图片块的大小,默认大小为w*w,可以自己设置
id = 1
i = 0
padw = padh = 0 # 当宽高除不尽切块大小时,对最后一块进行填充
if width % w != 0:
padw = 1 # 宽除不尽的情况
if hight % w != 0:
padh = 1 # 高除不尽的情况
# 默认从最左上角向右裁剪,再向下裁剪
while i + w <= hight:
j = 0
while j + w <= width:
new_img = img.crop((j, i, j + w, i + w))
new_img.save(save_path + a + "_" + str(id) + b)
id += 1
j += w
if padw == 1: # 宽有除不尽的情况
new_img = img.crop((width - w, i, width, i + w))
new_img.save(save_path + a + "_" + str(id) + b)
id += 1
i = i + w
if padh == 1: # 高除不尽的情况
j = 0
while j + w <= width:
new_img = img.crop((j, hight - w, j + w, hight))
new_img.save(save_path + a + "_" + str(id) + b)
id += 1
j += w
if padw == 1:
new_img = img.crop((width - w, hight - w, width, hight))
new_img.save(save_path + a + "_" + str(id) + b)
id += 1
if __name__ == '__main__':
# img_path:输入图像的路径
img_path = 'C:/Users/Desktop/image/'
# save_path:图像保存的位置
save_path = 'C:/Users/Desktop/cropimage1/'
img_crop(img_path, save_path)
在这段代码中,我们将10801080像素的图像裁剪成了100100的像素块,我们直接看实验结果,一共裁剪成了121张图像块,而且名字都是按照顺序改好的:
可以在以下代码这里修改尺寸:
w = 100 # 需要切成图片块的大小,默认大小为w*w,可以自己设置
crop图像裁剪像素块—w*h长和宽不等的像素块
上面是裁成等高等宽的像素块,也可以根据自己的设定修改成其他尺寸的像素块,代码如下:
import os
from PIL import Image
# 用PIL库批量裁剪指定大小的图像(自动填充)
def img_crop(img_path, save_path, crop_width, crop_height):
files = os.listdir(img_path)
for file in files:
a, b = os.path.splitext(file)
img = Image.open(os.path.join(img_path + "/" + file))
width, height = img.size
id = 1
i = 0
padw = 0 # 当宽度除不尽时,对最后一列进行填充
if width % crop_width != 0:
padw = 1
while i + crop_height <= height:
j = 0
while j + crop_width <= width:
new_img = img.crop((j, i, j + crop_width, i + crop_height))
new_img.save(os.path.join(save_path, a + "_" + str(id) + b))
id += 1
j += crop_width
if padw == 1:
new_img = img.crop((width - crop_width, i, width, i + crop_height))
new_img.save(os.path.join(save_path, a + "_" + str(id) + b))
id += 1
i += crop_height
# 如果高度除不尽,处理最后一行
if i < height:
j = 0
while j + crop_width <= width:
new_img = img.crop((j, height - crop_height, j + crop_width, height))
new_img.save(os.path.join(save_path, a + "_" + str(id) + b))
id += 1
j += crop_width
if padw == 1:
new_img = img.crop((width - crop_width, height - crop_height, width, height))
new_img.save(os.path.join(save_path, a + "_" + str(id) + b))
id += 1
if __name__ == '__main__':
# img_path: 输入图像的路径
img_path = 'C:/Users/Desktop/image/'
# save_path: 图像保存的位置
save_path = 'C:/Users/Desktop/cropimage2/'
# crop_width: 裁剪块的宽度
crop_width = 100
# crop_height: 裁剪块的高度
crop_height = 200
img_crop(img_path, save_path, crop_width, crop_height)
此时的实验结果:
在这段代码中,我们将10801080像素的图像裁剪成了100200的像素块,一共裁剪成了66张图像块,而且名字都是按照顺序改好的
可以在代码这里修改自己想要的尺寸:
#crop_width: 裁剪块的宽度 crop_width = 100 # crop_height: 裁剪块的高度 crop_height = 200
crop图像裁块—去除掉不想要的区域
import os
from PIL import Image
# 设置输入文件夹路径(原始图像所在的文件夹)
input_folder_path = 'C:/Users/shengli/Desktop/image1/'
# 设置输出文件夹路径(裁剪后的图像将保存在这里)
output_folder_path = 'C:/Users/shengli/Desktop/cropimage3/'
# 确保输出文件夹存在
if not os.path.exists(output_folder_path):
os.makedirs(output_folder_path)
# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder_path):
# 检查文件扩展名是否为图像
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
# 构建文件的完整路径
file_path = os.path.join(input_folder_path, filename)
# 打开图像
with Image.open(file_path) as img:
# 获取图像尺寸
width, height = img.size
# 裁剪图像,上下左右各裁剪20像素
cropped_img = img.crop((50, 50, width - 40, height - 40))
# 构建保存裁剪图像的路径
save_path = os.path.join(output_folder_path, filename)
# 保存裁剪后的图像
cropped_img.save(save_path)
# 显示信息
print(f"Cropped image saved as: {save_path}")
# 完成
print("All images have been processed.")
在这段代码中,我们将原本1080*1080像素的图像,分别裁剪掉了它上下左右各50,50,40,40的边缘像素,我们将实验结果和原始图像做一个对比:
可以看出原始图像边缘像素已经被裁掉
可以在代码里按照自己的需求修改:
# 裁剪图像,上下左右各裁剪20像素 cropped_img = img.crop((50, 50, width - 40, height - 40))
PIL(Pillow)— resize
在Python的PIL(Pillow)库中,resize 方法用于改变图像的尺寸。你可以指定新的宽度和高度,resize 方法会根据这些参数调整图像的大小。
resize改变图像分辨率
还是以最开始的1080*1080像素图像为例,代码如下:
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=720,height=420):#在这里调整需要的像素尺寸
img=Image.open(jpgfile)
new_img=img.resize((width,height),Image.BILINEAR)
new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
for jpgfile in glob.glob("C:/Users/shengli/Desktop/image/*png"): # 来源文件夹
convertjpg(jpgfile,"C:/Users/shengli/Desktop/resizeimage/") # 目标文件夹
来看实验结果:
左边为原图,右边为resize之后的,可见只是像素信息变换了,图像的整体内容没变。
可在代码处修改自己的需求:
def convertjpg(jpgfile,outdir,width=720,height=420):#在这里调整需要的像素尺寸
好了,以上就是关于 Python 的图像处理库 PIL(Pillow)中crop和resize的作用和区别,希望对你有帮助。