Pyhton OpenCV:批量识别图片外层轮廓并截图保存


1. 背景

执行前所需文件
截图前的图片

  有2个文件夹,其中文件夹a存在多张如上图片,文件夹b为空。现希望读取文件夹a中所有图片,识别黑色矩形并截图保存至文件夹b中(即去掉黑色矩形之外的白色区域)。

2. 源代码

# 系统: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("执行结束。")


3. 执行结果

执行结果
截图后的图片
截图后所有的图片

你可能感兴趣的:(Pyhton OpenCV:批量识别图片外层轮廓并截图保存)