OpenCV学习笔记(Python)—— 批量提取图像轮廓并保存结果到保持原始结构的输出目录

        批量处理图像,对每个图像提取轮廓内的区域并将轮廓外的区域设置为白色背景,然后保存处理后的图像到指定的输出目录,同时保持与输入目录相同的文件和目录结构。

import cv2
import numpy as np
import os
from tqdm import tqdm 

def process_image(input_path, output_path):
    # 读取图像
    img = cv2.imread(input_path)
    if img is None:
        print(f"Error loading image {input_path}")
        return
    
    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 应用阈值处理或者Canny边缘检测
    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)

    # 寻找轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 创建一个和原图像同样大小的掩码,并用0填充
    mask = np.zeros_like(gray)

    # 绘制轮廓到掩码上
    cv2.drawContours(mask, contours, -1, (255), thickness=cv2.FILLED)

    # 反转掩码:将轮廓内部变为黑色,外部变为白色
    mask_inv = cv2.bitwise_not(mask)

    # 创建一个全白的背景图像
    white_background = np.full(img.shape, (255, 255, 255), dtype=np.uint8)

    # 将反转的掩码应用于白色背景,掩码外的区域将保持白色
    background = cv2.bitwise_or(white_background, white_background, mask=mask_inv)

    # 将掩码转换为三通道,用于与原图像进行位运算
    mask_three_channel = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

    # 使用bitwise_and提取轮廓内区域
    contour_area = cv2.bitwise_and(img, mask_three_channel)

    # 将轮廓内的图像与背景合并
    result = cv2.bitwise_or(contour_area, background)

    # 保存结果
    cv2.imwrite(output_path, result)

def process_directory(input_dir, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    for root, dirs, files in os.walk(input_dir):
        # 构造在输出目录中相同的目录结构
        rel_path = os.path.relpath(root, input_dir)
        output_subdir = os.path.join(output_dir, rel_path)
        if not os.path.exists(output_subdir):
            os.makedirs(output_subdir)
        
        for file in tqdm(files):
            # 只处理图像文件
            if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.webp')):
                input_path = os.path.join(root, file)
                output_path = os.path.join(output_subdir, file)
                process_image(input_path, output_path)
                # print(f"Processed {input_path} to {output_path}")

# 输入和输出目录
input_dir = ''
output_dir = ''

# 处理整个目录
process_directory(input_dir, output_dir)

这段代码主要实现了以下功能:

  1. 批量处理图像文件:

    • 遍历指定的输入目录(input_dir)及其所有子目录。
    • 识别图像文件(支持格式:png, jpg, jpeg, bmp, tiff, webp)。
    • 保持原始目录结构,在输出目录(output_dir)中创建相应的子目录结构。
  2. 图像处理 (process_image函数):

    • 读取每个图像文件。
    • 将图像转换为灰度图。
    • 应用阈值处理,生成二值图像。
    • 通过二值图像寻找轮廓。
    • 创建一个掩码(mask),并在掩码上根据找到的轮廓填充区域。
    • 反转掩码,以便轮廓内是黑色,轮廓外是白色。
    • 创建一个全白背景图像。
    • 将反转的掩码应用于白色背景,使得轮廓外的区域保持白色。
    • 将掩码转换为三通道格式,与原图像进行位运算,提取轮廓内的图像区域。
    • 将轮廓内的图像与白色背景合并,得到最终结果。
    • 保存处理后的图像到相应的输出目录。
  3. 进度显示:

    使用tqdm库在命令行显示处理进度条。

你可能感兴趣的:(OpenCV学习,opencv,人工智能,python,图像处理,计算机视觉)