一、导入库
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-python
pip install numpy
二、归一化
外框归一化大小可以自主设置,为了模型建立一般设置为小于(64 * 64)。具体实现如下:
import glob
import os
import cv2
import numpy as np
# 设置输入和输出文件夹路径
input_folder = (
"imgs1/" # 替换为实际的输入文件夹路径
)
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}")
continue
cx = moments["m10"] / moments["m00"]
cy = moments["m01"] / moments["m00"]
# 计算平移量以使重心居中
tx = -cx + image.shape[1] / 2
ty = -cy + image.shape[0] / 2
M = 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}")
三、处理结果
处理前:
处理后:
单图对比(前后):