前言
该代码用于去除图片当中的红框。主要使用了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即可,第一个为包含所需要去除红框的图片路径,第二个为找到了含有红框的图片路径,第三个是去除完红框之后的图片。(注:文件名与原始图片文件一致,如需训练,只需将第三个文件夹当中的去除红框图片替换原图片即可)