利用OpenCV去除图片中设定颜色区域(Python)

摘要:

通过将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)

 实验结果

模板图像 

待处理图像

 

处理结果图像

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值