一、导入库

globos 都是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}")

三、处理结果

处理前:

图像识别 猫 识别猫狗图像步骤_图像识别 猫

处理后:

图像识别 猫 识别猫狗图像步骤_人工智能_02

单图对比(前后):

图像识别 猫 识别猫狗图像步骤_python_03

图像识别 猫 识别猫狗图像步骤_图像识别 猫_04