摘要:
通过将RGB图片转化到HSV颜色空间,结合opencv中的inRange和inpaint函数,实现对图片中的设定颜色去除。
代码:
使用环境和函数库:
python=3.8.19
tqdm=4.66.2
numpy=1.23.2
opencv-python=3.4.18.65
具体实现与提示:
1、代码中列了部分颜色的HSV区间,如果没有想要的颜色可以查找对应颜色的HSV区间,推荐这个blog:HSV分量
2、修改代码中的read_path、save_path、color这三个变量
3、提供了批量处理方式和单张图片处理方式
import os
import cv2
import tqdm
import numpy as np
color2hsv = {
# color: ((hmin, smin, vmin), (hmax, smax, vmax))
'black': ((0, 0, 0), (180, 255, 46)),
'white': ((0, 0, 221), (180, 30, 255)),
'red': (((0, 43, 46), (156, 43, 46)), ((10, 255, 255), (180, 255, 255))),
'green': ((35, 43, 46), (77, 255, 255)),
'blue': ((100, 43, 46), (124, 255, 255))
}
# 将红色替换为周围像素点的颜色
def main(img_path, save_path, color):
# 判断color是否在转化表中,若在表中获取对应颜色的HSV区间
assert color in color2hsv.keys(), f'{color} is not in [{color2hsv.keys()}]'
hsv_lower, hsv_upper = color2hsv[color]
# 读取RGB图片,opencv默认通道顺序是BGR
img = cv2.imread(img_path)
# 将BGR图片转化为HSV格式
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 使用inRange函数获取区间mask
if isinstance(hsv_lower[0], int):
lowerBound = np.array(hsv_lower)
upperbBound = np.array(hsv_upper)
mask = cv2.inRange(img_hsv, lowerBound, upperbBound)
elif isinstance(hsv_lower[0], tuple) or isinstance(hsv_lower[0], list):
mask = None
for i in range(len(hsv_lower)):
lowerBound = np.array(hsv_lower[i])
upperbBound = np.array(hsv_upper[i])
mask = cv2.inRange(img_hsv, lowerBound, upperbBound) if mask is None \
else mask + cv2.inRange(img_hsv, lowerBound, upperbBound)
else:
raise AssertionError
# 使用inpaint函数去除并修补mask区域
inpaint_img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
# 保存处理后的图片
cv2.imwrite(save_path, inpaint_img)
if __name__ == '__main__':
# 方案一:按照文件夹批量处理
# 首先设置读取路径、保存路径、需要处理的颜色
read_path = 'xxx/images'
save_path = 'xxx/images_new'
color = 'red'
assert os.path.isdir(read_path) and os.path.isdir(save_path)
os.makedirs(save_path)
img_list = os.listdir(read_path)
for img_name in tqdm.tqdm(img_list):
img_path = os.path.join(read_path, img_name)
img_save_path = os.path.join(save_path, img_name)
main(img_path, img_save_path, color)
# # 方案二:按照文件单个处理
# # 首先设置读取路径、保存路径、需要处理的颜色
# read_path = './xxx/images.jpg'
# save_path = './xxx/images_new.jpg'
# color = 'red'
# main(read_path, save_path, color)
实验结果
模板图像
待处理图像
处理结果图像