【Python 实战】---- 批量剪切图片并将剪切后的图片设置为规定尺寸
1. 需求分析
- 获取所有需要剪切的图片名称列表;
- 获取图片的尺寸,取短边尺寸为基础进行剪切;
- 将剪切的图片修改未统一的尺寸大小;
- 将统一处理后的图片进行保存输出。
2. 场景
2.1 转换前的图片
使用手机截图获取的图片,需要批量处理,仅需要中间内容部分,进行正方形裁剪,最终转换为 800*800 的标准图片!!!
2.2 转换后的图片
3. 获取图片名称列表
3.1 实现分析
- 使用 os 获取文件夹下的所有文件名称;
- 使用 filter 函数过滤出其中的图片文件; 2.1 使用 split 和 pop 方法获取图片的后缀; 2.2 判断后缀是否存在于需要处理的图片格式中; 2.3 将过滤后的数据使用 list 转换为列表返回。
3.2 代码实现
import os
# 获取文件夹下的所有图片文件名
def get_image_names(path):
names = os.listdir(path)
filters = list(filter(lambda x : x.split('.').pop() in ['jpg', 'png', 'jpeg', 'bmp'], names))
return filters
if __name__ == "__main__":
images = get_image_names("./images")
print('images',images)
3.3 输出结果
4. 循环处理图片
4.1 读取图片和保存图片
- 使用 cv.imread 读取当前图片;
- 使用 handle_current_image 处理图片的剪切和缩放; 2.1 使用 src.shape 获取图片的宽高尺寸; 2.2 判断宽高,对图片按照短边进行截取; 2.3 使用 cv.resize 将截取后的图片调整到标准尺寸; 2.4 返回处理完成后的图片;
- 使用 cv.imwrite 保存图片到输出文件夹。
4.2 代码实现
import cv2 as cv
import os
# 图像剪切和缩放
def handle_current_image(src):
# 获取图片尺寸
h,w,c = src.shape
# 判断宽高的短边
if h > w:
# 计算开始点
start = int((h - w) / 2)
# 剪切图片
img = src[start:w + start,0:w]
else:
# 计算开始点
start = int((w - h) / 2)
# 剪切图片
img = src[0:h,start:h + start]
# 修改图片的尺寸为标准尺寸
zoom_size_img = cv.resize(img,(int(800),int(800)))
return zoom_size_img
# 获取文件夹下的所有图片文件名
def get_image_names(path):
names = os.listdir(path)
filters = list(filter(lambda x : x.split('.').pop() in ['jpg', 'png', 'jpeg', 'bmp'], names))
return filters
def handle_image(base,path):
# 读取图片
img = cv.imread(f"{base}/{path}")
# 处理图片
current_img = handle_current_image(img)
# 保存图片
cv.imwrite(f"./images_out/{path}", current_img)
if __name__ == "__main__":
base = "./images"
# 获取所有图片
images = get_image_names(base)
# 循环获取每一个图片文件名
for path in images:
handle_image(base,path)
5. 处理后的最终结果
6. 注意
- 对图片的要求,比如现在处理的图片,黑色中间的图片的高度必须大于等于宽度,否则切出来的图片上下会出现部分黑色;
- 图片名称注意中文或者中文空格会出现报错,因此尽量使用英文或数字作为图片名称;
- 图片尺寸尽量大于规定的标准尺寸,否修改图片后,会导致图片模糊或者拉伸;
- 如果涉及入库,还可以将图片和对应的名称进行 excel 导出,这样有利于后期批量操作。
转载自:https://juejin.cn/post/7387305065802285066