一、导入库
glob
和 os
都是Python的标准库模块,也就是说它们随Python一起安装,无需额外安装即可使用。
glob
模块提供了一个在目录中使用通配符搜索创建文件列表的函数,例如,可以使用glob.glob('*.txt')
来查找当前目录下所有的.txt
文件。os
模块提供了与操作系统交互的接口,包括文件和目录操作、进程管理、系统环境变量等。
这两个模块都是Python自带的,可以直接通过 import
语句导入并使用。
cv2
是 OpenCV(Open Source Computer Vision Library)的 Python 绑定库。OpenCV 是一个开源的计算机视觉和机器学习库,它包含了超过 2500 个优化的算法,能处理图像和视频数据。OpenCV 最初是用 C/C++ 编写的,但现在已经可以支持多种语言,包括 Python。
在 Python 中,OpenCV 绑定库通常通过 import cv2
导入,并且这个库广泛用于实时图像处理、计算机视觉、模式识别、摄影测量、3D 建模等领域。
OpenCV 可以用于处理图像和视频数据,包括图像滤波、特征提取、目标检测、光流法、立体视觉、运动分析、图像分割等高级功能。cv2
提供了大量的函数和方法来实现这些功能,以及方便的矩阵操作,使得图像处理和计算机视觉任务变得简单高效。
在 Python 中使用 cv2
,需要先安装 opencv-python
包,这通常可以通过 pip 安装(numpy同理安装,关于numpy库不做详细介绍):
pip install opencv-pythonpip install numpy
二、归一化
外框归一化大小可以自主设置,为了模型建立一般设置为小于(64 * 64)。具体实现如下:
import glob
import osimport cv2
import numpy as np# 设置输入和输出文件夹路径
input_folder = ("imgs//" # 替换为实际的输入文件夹路径
)
output_folder = ("imgs2/" # 替换为实际的输出文件夹路径
)# 确保输出文件夹存在
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历输入文件夹中的所有png图像
image_paths = glob.glob(os.path.join(input_folder, "*.png"))
if not image_paths:print("No PNG images found in the input folder.")exit()for image_path in image_paths:# 读取图像image = cv2.imread(image_path, 0)if image is None:print(f"Failed to read image: {image_path}")continue# 重心归一化moments = cv2.moments(image)if moments["m00"] == 0:# 如果图像为空(全黑或全白),则不进行归一化,直接跳过或可以选择进行外框归一化print(f"Skipping image with no moments: {image_path}")continuecx = moments["m10"] / moments["m00"]cy = moments["m01"] / moments["m00"]# 计算平移量以使重心居中tx = -cx + image.shape[1] / 2ty = -cy + image.shape[0] / 2M = np.float32([[1, 0, tx], [0, 1, ty]])centered_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))# 裁剪图像以确保重心位于中心,并且去除平移后产生的空白边缘height, width = centered_image.shape[:2]left = max(0, int(tx))top = max(0, int(ty))right = min(width, int(tx + width))bottom = min(height, int(ty + height))centered_image_cropped = centered_image[top:bottom, left:right]# 外框归一化(假设目标大小为64x64像素)resized_image = cv2.resize(centered_image_cropped, (128, 128))# 保存归一化后的图像output_path = os.path.join(output_folder, os.path.basename(image_path))cv2.imwrite(output_path, resized_image)print(f"Saved normalized image to: {output_path}")