Opencv-python 将图片中某段HSV范围内的所有像素去除,用白色替换

news2024/11/28 17:51:52

文章目录

  • 前言
  • 一、效果
  • 二、代码
    • 1.思路
    • 2.代码解释
  • 总结


前言

  本次实验要求将模拟飞行座舱图像中的HUD绿色字体去掉,并且用白色来替代,最终输出没有绿色字体的图片,用于下一步的某种图像算法的输入。


一、效果

在这里插入图片描述

在这里插入图片描述

二、代码

1.思路

  将一张图片中的某个颜色去除,现在主流的做法就是通过建立一个HSV空间范围φ,在该范围内建立一个掩膜mask,与原始图像进行对比,只要原始图像像素点范围满足该HSV空间范围的,则直接用白色rgb(255,255,255)来替代。
  这里有个问题是,如何确定整个HSV空间范围φ,你可以自己直接赋值(能准确肉眼给出来的,都是神仙),一般人应该还是会通过某种“连续调节装置”首先来确定HSV取值范围,然后再进一步去做去除、替代操作。

import cv2
import numpy as np
import time


def color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv):

    img = cv2.imread(input_path, 1)
    img_background = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)

    # # 背景图改成白色
    # img_background_white = img_background
    # img_background_white[0: img.shape[0]-1, 0: img.shape[1]-1] = 255

    # ######################将绿色区域单独提取出来绘制在一张图上##################
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    roi = hsv_img[ymin:ymax, xmin:xmax]
    mask = cv2.inRange(roi, low_hsv, high_hsv)
    red = cv2.bitwise_and(roi, roi, mask=mask)
    bgr_red = cv2.cvtColor(red, cv2.COLOR_HSV2BGR)

    # 背景设置为白色
    # black_pixels = np.where((bgr_red[:, :, 0] == 0) & (bgr_red[:, :, 1] == 0) & (bgr_red[:, :, 2] == 0))
    # bgr_red[black_pixels] = [255, 255, 255]

    # 将roi区域叠加至黑色背景中去
    img_result = img_background
    img_result[ymin:ymax, xmin:xmax] = bgr_red
    cv2.imwrite(output_path, img_result)

    # 原图resize
    img2 = cv2.resize(img, (800, 600), interpolation=cv2.INTER_AREA)
    # cv2.imshow('result', bgr_red)
    # cv2.waitKey(0)

    # #######################将原图的绿色区域替换成白色############################

    img_cut = img[ymin:ymax, xmin:xmax]
    img_cut[mask > 0] = (255, 255, 255)
    img[ymin:ymax, xmin:xmax] = img_cut
    cv2.imwrite(output_path, img)
    cv2.imshow('result', img)


def nothing(x):
    pass


def test_color_hsv_values(input_path):

    cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)
    blue = np.uint8([[[255, 0, 0]]])
    hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)

    print(hsv_blue)
    cv2.createTrackbar('Hue min', 'image', 10, 179, nothing)
    cv2.createTrackbar('Hue max', 'image', 10, 179, nothing)
    cv2.createTrackbar('sat min', 'image', 10, 255, nothing)
    cv2.createTrackbar('sat max', 'image', 10, 255, nothing)
    cv2.createTrackbar('val min', 'image', 10, 255, nothing)
    cv2.createTrackbar('val max', 'image', 10, 255, nothing)

    img = cv2.imread(input_path)
    # img = cv2.resize(src=img2, dsize=(400, 300), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)

    while True:
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        h_min = cv2.getTrackbarPos('Hue min', 'image')
        h_max = cv2.getTrackbarPos('Hue max', 'image')
        s_min = cv2.getTrackbarPos('sat min', 'image')
        s_max = cv2.getTrackbarPos('sat max', 'image')
        v_min = cv2.getTrackbarPos('val min', 'image')
        v_max = cv2.getTrackbarPos('val max', 'image')
        lower = np.array([h_min, s_min, v_min])
        upper = np.array([h_max, s_max, v_max])
        mask = cv2.inRange(hsv, lower, upper)
        res = cv2.bitwise_and(img, img, mask=mask)
        cv2.imshow('img', img)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)

        k = cv2.waitKey(5)
        if k == 27:
            break

    cv2.destroyAllWindows()


if __name__ == '__main__':

    input_path = '4.jpg'
    output_path = '4_result.jpg'

    # 像素点坐标,图左上角为0,0, x往右增大, y向下增大

    # 1.jpg 参数
    # ymin, ymax, xmin, xmax = 200, 560, 800, 1150
    # low_hsv = np.array([30, 0, 108])
    # high_hsv = np.array([91, 255, 255])

    # 2.png 参数
    # ymin, ymax, xmin, xmax = 0, 1440, 0, 1724
    # low_hsv = np.array([58, 85, 0])
    # high_hsv = np.array([91, 255, 255])

    # 3.png 参数
    # ymin, ymax, xmin, xmax = 0, 1440, 0, 1442
    # low_hsv = np.array([28, 52, 0])
    # high_hsv = np.array([92, 255, 255])

    # 4.png 参数
    ymin, ymax, xmin, xmax = 200, 800, 700, 1200
    low_hsv = np.array([28, 52, 178])
    high_hsv = np.array([92, 255, 255])

    color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv)

    # test_color_hsv_values(input_path)

2.代码解释

  这里有个test_color_hsv_values(input_path)函数,其作用就在于修改输入的范围,实时动态观察图像颜色变化情况。
  下面两张是演示效果,上面为提取“飞机”本身的图形,下面为提取“天空”的图形,通过移动Hue、Sat、Val三组共六个进度条,确定三种变量的上下值,从而确定要选择的HSV范围。
在这里插入图片描述
在这里插入图片描述

  通过test_color_hsv_values(input_path)函数,确定了HSV数值后,重新调用 color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv)函数,生成result图片。


总结

  本文是利用Opencv-python 进行的对图片颜色进行提取、抠图的一个脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经验教训:微服务设计时的五条宝贵经验

微服务架构的新挑战 在著名软件著作《人月神话》中提到,软件世界没有“银弹”,这句话当然适用于架构领域,随着从单体架构过渡到微服务架构,因为将原有系统打散,给系统增加了许多不稳定因素。 单体架构向微服务架构转变…

【服务器数据恢复】断电导致RAID无法找到存储设备的数据恢复案例

服务器数据恢复环境: HP EVA存储,6块SAS硬盘组建的raid5磁盘阵列。上层操作系统是WINDOWS SERVER。该存储为公司内部文件服务器使用。 服务器故障&分析: 在遭遇两次意外断电后,设备重启时raid提示“无法找到存储设备”。管理员…

值得推荐收藏的 9个免费PDF转PPT的方法

随着现在工作和学习越来越多涉及到电子文件,PDF格式已经成为了一种非常重要的文件格式。但有时候需要将PDF文件转换为PPT格式,因为PPT格式更适合用于演示和公开演讲等场合。而转换PDF文件到PPT格式则需要使用专用工具。以下是9个免费的PDF转PPT的方法介绍…

蓝牙耳机都能打电话吗,分享几款通话效果不错的骨传导耳机

骨传导耳机的兴起是近几年来才出现的新概念,骨传导耳机也是近几年来才开始流行起来,在我看来骨传导耳机的兴起是科技进步的产物。随着蓝牙耳机技术和设备的发展,蓝牙耳机也越来越普及,但是也给用户带来了很多困扰。而骨传导耳机就…

好用的电容笔有哪些推荐?性价比高的触控笔

电容笔的选购对新手来说难度很大,看到网友们都在讨论电容笔什么牌子的好用,电容笔怎么挑选?小编今天也来详细解答这个问题,盘点四款好用的平价电容笔,如果你想知道性价比高电容笔推荐哪些,那这篇文章一定不…

什么是 Vue 的片段(Fragment)?如何使用片段?

什么是 Vue 的片段(Fragment)?如何使用片段? 在 Vue 2.6.0 版本中,新增了一个特性:片段(Fragment)。片段是一种特殊的组件,可以让开发者在不增加额外节点的情况下渲染多…

2023年第二届计算与人工智能国际会议(ISCAI 2023)

会议简介 Brief Introduction 2023年第二届计算与人工智能国际会议(ISCAI 2023) 会议时间:2023年10月13 -15日 召开地点:中国上海 大会官网:www.iscai.org 2023年第二届计算与人工智能国际会议(ISCAI 2023)将围绕“计算与人工智能”的最新研究…

ETC人车关系查询-ETC人车关系查询api接口

接口地址: https://登录后显示/api/189/363(支持:http/https)) 接口页面:https://www.wapi.cn/api_detail/189/363.html 网站地址:https://www.wapi.cn 接口简介:核验指定人员/企业是否是指定车辆的 ETC 开户人、车辆所有人或 E…

【c/c++】属于程序员的浪漫,基于easyx.h图形库实现3D Heart

文章目录 😏专栏导读🤖文章导读🙀一、easyX图形库基本介绍?1、easyX的原理:2、easyX的安装🙀3D Heat源码描述 😳3D Heat效果展示总结 😏专栏导读 👻作者简介:…

ssm+java汽车销售分析与管理系统

此次设计一款汽车销售分析与管理系统,能够对当前销售的车辆的日销售、季度销售以及年度销售进行统计分析、对于车辆的入库出库进行了准确的信息录入。对于销售人员的销售情况进行登记和统计,能够对整个店面的财务情况、盈利情况进行统计。同时对于以上数…

精选|Dubbo异步化实践

1 背景 从Apach Dubbo的官网了解到从 2.7.0 版本开始,Dubbo 的所有异步编程接口开始以CompletableFuture为基础,Dubbo接口异步化能够极大地提高接口性能,降低接口依赖调用之间的阻塞,同时了解到我们公司大部分应用使用的是同步rp…

微信小程序 地图map组件 SDK 并 实现导航

说明 本文使用uniapp使用map组件作为示例 效果预览 主要实现: 地图上搜索关键字地址对地址设置标记点位置授权被拒后,重新触发授权的处理逻辑实现获取当前位置,计算目标地址与当前位置的距离触发对选中的信息展示弹窗实现开始导航操作 需要源…

无人机航拍高度与地面采样距离

无人机航拍高度与地面采样距离 1.无人机航拍高度与地面采样距离的关系 为搞清无人机航拍高度与地面采样距离的关系,首先需要了解像素与像元之间的细小差别(个人理解)。像素偏重于图片描述,也就是常说的一张图片像素是多少。像元…

谷粒商城学习笔记(一):分布式基础概念

分布式基础概念 1. 微服务2. 集群&分布式&节点3. 远程调用4. 负载均衡5. 服务注册/发现&注册中心6. 配置中心7. 服务熔断&服务降级8. API网关 1. 微服务 微服务架构风格,就是把一个单体架构按照业务拆分成多个服务模块,每个模块之间独立…

C标准库——字符串函数反汇编分析

1、前置概念补充 test:逻辑与,如果是1,zf就是1,如果是0,zf就是0 可以还原成等价的高级语言,理解代码逻辑,但是不一定是源代码 大写的A:41,小写a:61 asci…

manacher——马拉车算法(图文详解)

文章目录 简要介绍实际应用算法详解 简要介绍 马拉车算法,Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,是一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性O(N)。 实际应用 刷…

ChatGPT让沟通更智能、更便捷

ChatGpt是最近引起强烈关注的一种技术,它可以实现聊天机器人,为使用者解决复杂的信息获取和学习任务。但他也不仅仅是一个聊天机器人,它是一种基于深度学习算法的自然语言生成模型,由OpenAI公司开发。它可以模拟人类的对话方式&am…

AICG - Stable Diffusion 学习思考踩坑实录(待续补充)

关于模型 如果模型中没有各种角度的脚和手,无论你再怎么费劲心思,AI 都画不出来,目前C 站也没有什么好脚的例子,正面脚背面脚,但是没有侧面脚,脚这块还是很欠缺,希望未来有大牛能训练出来美脚 …

Python头歌合集(题集附解)

目录 一、Python初识-基本语法 第1关:Hello Python! 第2关:我想看世界 第3关:学好Python 第4关:根据圆的半径计算周长和面积 第5关:货币转换 二、turtle简单绘图 第1关:英寸与厘米转换 第2关&#xff1…

【MySQL数据库 | 第十篇】DCL操作

目录 🤔 前言: 🤔DCL介绍: 🤔1.DCL管理用户: 1.查询用户: 图示: 2.创建用户 示例1: 运行结果:​ 示例2: 运行结果:​ 3.修改…