批量处理图像,对每个图像提取轮廓内的区域并将轮廓外的区域设置为白色背景,然后保存处理后的图像到指定的输出目录,同时保持与输入目录相同的文件和目录结构。
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)
这段代码主要实现了以下功能:
-
批量处理图像文件:
- 遍历指定的输入目录(
input_dir
)及其所有子目录。 - 识别图像文件(支持格式:png, jpg, jpeg, bmp, tiff, webp)。
- 保持原始目录结构,在输出目录(
output_dir
)中创建相应的子目录结构。
- 遍历指定的输入目录(
-
图像处理 (
process_image
函数):- 读取每个图像文件。
- 将图像转换为灰度图。
- 应用阈值处理,生成二值图像。
- 通过二值图像寻找轮廓。
- 创建一个掩码(mask),并在掩码上根据找到的轮廓填充区域。
- 反转掩码,以便轮廓内是黑色,轮廓外是白色。
- 创建一个全白背景图像。
- 将反转的掩码应用于白色背景,使得轮廓外的区域保持白色。
- 将掩码转换为三通道格式,与原图像进行位运算,提取轮廓内的图像区域。
- 将轮廓内的图像与白色背景合并,得到最终结果。
- 保存处理后的图像到相应的输出目录。
-
进度显示:
使用tqdm
库在命令行显示处理进度条。