21年9月21日——图片裁剪与等比缩小
做项目的时候需要太欧证图片大小,原图片是46082456,目标是要调整到224224。因为样本中图片的空白占了比较多的位置,所以我的思路是先裁剪再等比缩小。
单独图片的裁剪
import cv2
img = cv2.imread('E:/test_input.jpg')
print(img.shape)
cropped = img[485:2920, 818:3676]
cv2.imwrite('E:/test_output.jpg', cropped)
imread和imwrite的操作需要谨记。
批量图片的裁剪
import cv2
import numpy as np
import os
def img_cut(input_dir, ouput_dir):
img = cv2.imread(input_dir)
print(img.shape)
cropped = img[331:3068, 837:3574]
cv2.imwrite(ouput_dir, cropped)
dataset_dir = 'E:/dataset/test/4'
output_dir = 'E:/zhongjian/test/4'
# 获得需要转化的图片路径并生成目标路径
image_filenames = [(os.path.join(dataset_dir, x), os.path.join(output_dir, x))
for x in os.listdir(dataset_dir)]
# 转化所有图片
for path in image_filenames:
img_cut(path[0], path[1])
函数img_cut跟前面是类似的,不再赘述。
os.path.join()
函数是指连接多个文件夹,比如说:
Path20 = os.path.join(Path1,Path2,Path3)
的输出就是Path20 = home\develop\code
。然后这个for x in os.listdir(dataset_dir)
相当于是对x的注解,表示x是数据集中图片序列。所以image_filenames
就是只有(os.path.join(dataset_dir, x), os.path.join(output_dir, x)
。
重新设定图片大小
核心函数:resize
import os
from PIL import Image
def image_processing():
# 待处理图片路径下的所有文件名字
all_file_names = os.listdir('E:/zhongjian/test/4')
for file_name in all_file_names:
# 待处理图片路径
img_path = Image.open(f'E:/zhongjian/test/4/{file_name}')
# resize图片大小,入口参数为一个tuple,新的图片的大小
img_size = img_path.resize((224, 224))
# 处理图片后存储路径,以及存储格式
img_size.save(f'E:/dataset/test/4/{file_name}', 'JPEG')
image_processing()
比较简单不赘述。