去除图片当中的红框

文章目录


前言

该代码用于去除图片当中的红框。主要使用了opencv和hsv通道进行去除红框。


提示:以下是本篇文章正文内容,下面案例可供参考

源码


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

def get_image_list(path, extensions):
    image_list = []
    for root, dirs, files in os.walk(path):
        for file in tqdm(files,desc='get_origion_image_list'):
            if file[-4:] in extensions:
                image_list.append(os.path.join(root, file))
    return image_list


def cv_imread(file_path):
    cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED) #读取的为bgr图像
    return cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)


def get_red_box_image_list(image_list):
    result = []
    for file in tqdm(image_list, desc='get_red_box_image_list'):
        image = cv_imread(file)
        lower_red2 = np.array([195, 38, 27], dtype=np.uint8)
        upper_red2 = np.array([237, 115, 111], dtype=np.uint8)
        mask = cv2.inRange(image, lower_red2, upper_red2)
        num_red_pixels = cv2.countNonZero(mask)
        if num_red_pixels >= 200 and num_red_pixels < 5000:
            result.append(file)
    return result


def copy_image(image_list,dst):
    if not os.path.exists(dst):
        os.makedirs(dst)
    for file in tqdm(image_list,desc='copy_origion_image'):
        shutil.copy(file, os.path.join(dst, os.path.basename(file)))


def remove_red_box(image_list, output_path):
    if not os.path.exists(output_path):
        os.makedirs(output_path, exist_ok=True)
    for file in tqdm(image_list, desc='remove_red_box_save_image'):
        image = cv_imread(file)
        hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

        # 定义红色的HSV范围(这里需要根据实际情况调整)
        lower_red = np.array([0, 43, 46])  # 红色的下界(H, S, V)
        upper_red = np.array([20, 255, 255])  # 红色的上界(H, S, V)
        mask1 = cv2.inRange(hsv, lower_red, upper_red)

        # 因为红色在HSV空间中可能跨越0-179的H值,所以我们需要再定义一个范围来捕获这部分红色
        lower_red2 = np.array([156, 43, 46])
        upper_red2 = np.array([180, 255, 255])
        mask2 = cv2.inRange(hsv, lower_red2, upper_red2)

        # 将两个掩码合并
        mask = mask1 | mask2
        kernel = np.ones((5, 5), np.uint8)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

        mask_inv = cv2.bitwise_not(mask)
        result = cv2.bitwise_and(image, image, mask=mask_inv)

        inpainted_image = cv2.inpaint(result.copy(), mask, inpaintRadius=10, flags=cv2.INPAINT_TELEA)

        inpainted_image = cv2.cvtColor(inpainted_image, cv2.COLOR_BGR2RGB)
        cv2.imencode('.jpg', inpainted_image)[1].tofile(os.path.join(output_path,os.path.basename(file)))


def parse_opt(known=False):
    # parser 解析器 argparse 参数解析 argumentparser 参数解析器
    parser = argparse.ArgumentParser()
    parser.add_argument('--input_path', type=str, default=r'C:\Users\Test', help='input path')
    parser.add_argument('--output_path', type=str, default=r'C:\Users\Test'+'_origion', help='origion image output path')
    parser.add_argument('--remove_red_boxs_save', type=str, default=r'C:\Users\Test'+'_s',help='remove red boxs path')
    parser.add_argument('--extensions', type=list, default=['.jpg', '.JPG', '.jpeg', '.png', '.bmp', '.tiff', '.svg','.pfg'], help='image extension')
    return parser.parse_known_args()[0] if known==True else parser.parse_args()


def main(opt):
    # 1.获取路径下的所有图片列表
    image_list = get_image_list(opt.input_path, opt.extensions)
    # 2.获得有红框的图片列表
    result = get_red_box_image_list(image_list)
    # 3.复制带有红框的图片
    copy_image(result, opt.output_path)
    # 4.去除红框
    remove_red_box(result, r'C:\Users\hhkj\Desktop\Temp\ws_s')


if __name__=='__main__':
    opt = parse_opt(True)
    main(opt)

总结

修改可视化参数–input_path;–output_path和–remove_red_boxs_save即可,第一个为包含所需要去除红框的图片路径,第二个为找到了含有红框的图片路径,第三个是去除完红框之后的图片。(注:文件名与原始图片文件一致,如需训练,只需将第三个文件夹当中的去除红框图片替换原图片即可)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值