一、背景
有2个文件夹,其中文件夹a存在多张如上图片,文件夹b为空。现希望读取文件夹a中所有图片,识别黑色矩形并截图保存至文件夹b中(即去掉黑色矩形之外的白色区域)。
二、源代码
# 系统:window7
# 编程工具:PyCharm
# 编程语言:python
# 前置条件:已安装好opencv相关环境
# coding:utf-8
import os
import cv2
# 读取文件夹内的所有文件的路径
def read_file_name(file_dir):
list_path =[] # 文件路径
list_name = [] # 文件名
for root, dirs, files in os.walk(file_dir):
"""
print(root) # 当前目录路径
print(dirs) # 当前路径下所有文件夹
print(files) # 当前路径下所有文件
"""
path = root
if len(dirs) == 0: # 该目录下不存在文件夹
for file in files:
path1 = path + '//' + file
# print(path1)
list_path.append(path1)
list_name.append(file)
else: # 该目录下存在文件夹
for dir1 in dirs:
path = path + '//' + dir1
for file in files:
path1 = path + '//' + file
# print(path1)
list_path.append(path1)
list_name.append(file)
return list_path, list_name
# 主函数
if __name__ == '__main__':
# 读取所有图片的路径
path_original = "C://Users//Administrator//Desktop//a" # 原文件夹
path_target = "C://Users//Administrator//Desktop//b" # 目标文件夹
file_path, file_name = read_file_name(path_original)
i = 0
for path in file_path:
# 读取图片
img_origin = cv2.imread(path)
# 灰度化
img_gray = cv2.cvtColor(img_origin, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY_INV) # 识别黑色轮廓
# 查找轮廓
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 画出最外层轮廓
x, y, w, h = cv2.boundingRect(contours[0])
# img_display = img_origin # 浅拷贝,修改img_display时,同样也修改img_origin
img_display = img_origin.copy() # 深拷贝,修改img_display时不会改变img_origin
cv2.rectangle(img_display, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示图片
# cv2.imshow("image", img_display)
# cv2.waitKey(1000)
# 保存截图
path_save = path_target + "//" + file_name[i]
cv2.imwrite(path_save, img_origin[y:y+h, x:x+w])
i = i + 1
print("执行结束。")
三、执行结果
截图后的图片如下所示。