六、HSV颜色空间应用实例——颜色分割提取与替换

2023-11-01

教程汇总:python基础入门系列

通过之前的章节(四、OpenCV颜色空间——HSV颜色模型),我们已经初步认识了HSV颜色空间的特性与优势,现在就来看两个典型的应用实例,颜色分割提取 与 颜色替换。

颜色分割

通过HSV颜色空间的操作我们可以准确的对指定颜色进行分割图像,这也是后续图像处理中会用到的一种预处理手段。

下面我们就结合一个实例来看HSV颜色分割的应用:
如下图是一个穿有红色上衣的人,我们要把衣服部分的图分割出来:
在这里插入图片描述
通过前面几个章节的讲解我们能够想到,可以通过观察h分量的直方图来确定这个上衣红色的取值范围,以作为我们分割的界限标准。上代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread('RedShirt.jpg')
# BGR图转为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 提取hsv中H通道数据
h = hsv[:, :, 0].ravel()
# 直方图显示
plt.hist(h, 180, [0, 180])
plt.show()

得到直方图如下:
在这里插入图片描述
根据HSV颜色空间模型可知 红色的颜色分布在0或180附近,直方图中170到180部分出现了大量数据,由此可以确定红色的H分量上下限为170-180,至于SV的界限可以先给个30-255的初始值,具体可以在提取掩模的时候调整确定。
下面通过HSV的红色界限生成mask掩模。上代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

#通过OpenCV读取图片信息
img = cv2.imread('RedShirt.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 提取hsv中H通道数据
# h = hsv[:, :, 0].ravel()
#
# plt.hist(h, 180, [0, 180])
# plt.show()

cv2.imshow("img", img)

# HSV 的下界限
lower_red = np.array([170,30,30])
# HSV 的上界限
upper_red = np.array([180,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_red, upper_red)

cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下图:
在这里插入图片描述
可以发现,答题衣服轮廓对上了,但是有些细节不够完美,比如胳膊两侧还有些白点,这时候就要分析了,胳膊侧边的颜色更接近暗红颜色,所以可以通过提高V值的下限来滤除掉。通过不断调整测试我设定的V值在100-255。
在这里插入图片描述
但是发现右侧的白点已经无法通过V的调整来去除了,这个时候我们还可以采取另一种方法,对于mask这种二值化图处理,可以采用膨胀腐蚀的手段来消除独立的白点或黑点。上代码:

import cv2
import numpy as np

#通过OpenCV读取图片信息
img = cv2.imread('RedShirt.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.imshow("img", img)

# HSV 的下界限
lower_red = np.array([170,30,90])
# HSV 的上界限
upper_red = np.array([180,255,255])

# 通过上下限提取范围内的掩模mask
mask = cv2.inRange(hsv, lower_red, upper_red)
cv2.imshow("mask", mask)

# 腐蚀与膨胀处理
# 定义
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))#定义结构元素的形状和大小
#腐蚀图像
eroded = cv2.erode(mask,kernel)
#显示腐蚀后的图像
cv2.imshow("Eroded Image",eroded)

# #膨胀图像
dilated = cv2.dilate(eroded,kernel)
#显示膨胀后的图像
cv2.imshow("Dilated Image",dilated)

img2 = cv2.bitwise_and(img, img, mask=dilated)
cv2.imshow("img2", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

生成mask之后我们先是用腐蚀方法去除掉周边的孤立白点,但同样的衣服轮廓的白色区域边界也会被腐蚀变小,这时候可以用反向操作膨胀在填充回原来的大小
在这里插入图片描述
这样我们优化好的mask掩模就做好了,可以采用OpenCV的图像位运算cv2.bitwise_and()把原图与mask进行位与得到衣服的抠图:
在这里插入图片描述

颜色替换

通过上面的操作我们已经可以准确的分割出我们指定的颜色了,在次基础上就可以对他的颜色进行更改了,比如改成黄色,这个同样也是要在HSV颜色空间操作的,不过这次就不需要对mask进行膨胀腐蚀优化了。

import cv2
import numpy as np

def nothing(x):
    pass
#通过OpenCV读取图片信息
img = cv2.imread('RedShirt.jpg')
cv2.imshow("img", img)

lower_red = np.array([170,30,30])
upper_red = np.array([180,255,255])

cv2.namedWindow('img2')

cv2.createTrackbar('H','img2',140,180,nothing)
cv2.createTrackbar('S','img2',100,180,nothing)
cv2.createTrackbar('V','img2',117,180,nothing)
rows,cols,channels = img.shape

while(1):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower_red, upper_red)
    #将制定像素点的数据设置为0, 要注意的是这三个参数对应的值是Blue, Green, Red。
    h = cv2.getTrackbarPos('H', 'img2')
    s = cv2.getTrackbarPos('S', 'img2')
    v = cv2.getTrackbarPos('V', 'img2')
    for r in range(rows):
        for c in range(cols):
            if mask[r, c] == 255:
                hsv.itemset((r, c, 0), hsv.item(r, c, 0) -h)
                hsv.itemset((r, c, 1), hsv.item(r, c, 1) +90-s)
                hsv.itemset((r, c, 2), hsv.item(r, c, 2) +90-v)
    img2 = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    #将图像进行输出,使用show()也是可以显示的。
    cv2.imshow("img2", img2)
    k = cv2.waitKey(1)&0xFF
    if k == 27: #esc exit
        break

#cv2.waitKey(0)
cv2.destroyAllWindows()

通过滑动H滑条我们就可以更改衣服的颜色了,同样调节SV滑条也可以更改饱和度与明度。

在这里插入图片描述
在这里插入图片描述

同样的,我们把皮肤颜色作为颜色分割替换目标也可以更改皮肤颜色,比如改成绿巨人的肤色:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

六、HSV颜色空间应用实例——颜色分割提取与替换 的相关文章

随机推荐

  • 基础算法题——家庭作业(并查集的标记法、贪心)

    家庭作业 题目描述 输入格式 第一行一个整数n 表示作业的数量 接下来 n行 每行包括两个整数 第一个整数表示作业的完成期限 第二个数表示该作业的学分 输出格式 输出一个整数表示可以获得的最大学分 保证答案不超过 C C 的 int 范围
  • 《系统集成项目管理工程师》必背81-100题

    软考系统集成项目管理工程师交流裙941853339 附带资料 81 简述风险管理过程 1 规划风险管理 2 识别风险 3 实施定性风险分析 评估并分析风险发生概率和影响 对风险进行优先排序 4 实施定量风险分析 就已识别风险对项目整体目标的
  • cpu算力计算

    CPU的算力与CPU的核心的个数 核心的频率 核心单时钟周期的能力三个因素有关系 常用双精度浮点运算能力衡量CPU的科学计算的能力 就是处理64bit小数点浮动数据的能力 支持AVX2的处理器在1个核心1个时钟周期可以执行16次浮点运算 也
  • python selenium解决报错SessionNotCreatedException session not created: No matching capabilitie与问题解析

    解决方法 查看导包是否正确 如果是webdriver Chrome 那么导包的一切都要是chrome的 如果是webdriver Firefox 那么导入的包也都源于firefox的包 出现这个问题是因为由于selenium很多类都很相似
  • 怎么在springboot实现简单的登录操作关于拦截器中cookie,token,redis的使用,以及使用全局变量ThreadLocal

    1 什么情况下需要登录操作 首先抛出一个问题 什么情况下才需要登录操作 其实登录操作在很多的管理系统 后台系统中都会涉及到的一个看似简单 但是又特别重要的操作 2 登录是简单的验证数据库账号密码 这么简单吗 在之前我总觉得登录应该是一个很简
  • 树莓派之Linux内核源码(基础)

    目录 一 树莓派等芯片带操作系统的启动过程 二 树莓派Linux源码目录树分析 1 linux内核是开源的 支持多架构多平台代码 2 Linux内核源代码目录树结构 三 树莓派Linux源码配置 1 第一种配置方式 使用源码里自带的conf
  • csdn笔记

    一阶系统的单位阶跃响应 unit Step Response 时间常数 Time constant 1 对于一阶系统 线性时不变 来说 传递函数的一般形式 2 时间常数 是系统特性 可用来识别系统 1 a 稳定时间Tss 4 4 a 3 系
  • pandas写入数据到Excel

    pandas将dataframe写入Excel 大数据写入 split count df shape 0 1000000 1 for i in range split count writer pd ExcelWriter xlsx for
  • 第十九篇 ResNet——论文翻译

    文章目录 摘要 1 引言 2 相关工作 3 深度残差学习 3 1 残差学习 3 2 快捷恒等映射 3 3 网络架构 3 4 实现 4 实验 4 1 ImageNet 分类 4 2 CIFAR 10 和分析 4 3 PASCAL 和 MS C
  • kvm中支持SCSI硬盘接口

    在KVM中安装ubuntu14 硬盘接口采用SCSI 可以正常安装 但是安装centos7却不行 原因是Centos7中没有SCSI驱动 在ubuntu中用lsmod命令查看 可以发现ubuntu中加载了sym53c8xx驱动 就是因为缺少
  • vue3自定义指令之复制指令、拖拽指令、按钮长按指令

    1 复制指令 主要用到 document execCommand Copy 这个api app directive copy beforeMount el binding el targetContent binding value el
  • 设计模式学习书籍推荐(设计模式书籍你读过哪几本)

    概述 想成为大神级别的攻城狮 就读以下这些书籍吧 让你从小白到大神 写出有灵魂程序 进阶之路 始于行动 编程重在理解加多实践 在当今快速发展的时代 要学会站在巨人的肩膀上 吸取经验 看书就是最快与最低成本的进阶之路 史上没有最好的书籍 只有
  • Flutter 布局(一)- Container详解

    Flutter 布局 一 Container详解 Q吹个大气球Q关注 62018 06 03 18 36 26字数 2 301阅读 84 509 本文主要介绍Flutter中非常常见的Container 列举了一些实际例子介绍如何使用 1
  • C#学习路线

    导读 计算机课程是一门实践的课程 而编程尤甚 入门建议从 Visual C 从入门到精通 或者 C 入门经典 这本书中文翻译比较生硬晦涩 可看原版 开始学习 过度到 C 高级编程 和 深入理解C 学习C 前提是下载好Visual Studi
  • 高斯整数环学习心得随笔及其实现

    高斯整数环学习心得随笔 过些天补上 代码 两个高斯整数相伴 即为相等 小于和大于 用复数的范数Norm来比较 应用场景举例 高斯整数环的唯一分解定理证明 整除和取模 带余除法 复数除法的结果是个有理数 但为了方便还是直接用double存了
  • torch 矩阵操作

    1 按索引赋值 index put index put不改变变量本身 index put 改变变量本身 相当于inplace操作 index input 维度1坐标列表 维度2坐标列表 赋值列表 x torch ones 3 3 print
  • Ubuntu20.04换为清华的镜像源

    安装过程 Ubuntu 的软件源配置文件是 etc apt sources list 在修改之前 先将系统自带的该文件做个备份 将该文件替换为清华源官网提供的内容 即可使用 TUNA 的软件源镜像 第一步 切换到root账户 sudo s
  • web前端(HTML+CSS)试题总结

    一 填空题 1 网页的后缀名通常为 xxx html 或 xxx htm 的页面 2 请写出在网页中设定表格边框的厚度的属性 border 设定表格单元格之间宽度属性 cellspacing 设定表格资料与单元格线的距离属性 cellpad
  • docker_run_application

    docker三种方式运行application 1 一次性运行 docker run ubuntu 14 04 bin echo Hello world 登录到container ubuntu14 04 运行命令 bin echo Hell
  • 六、HSV颜色空间应用实例——颜色分割提取与替换

    教程汇总 python基础入门系列 通过之前的章节 四 OpenCV颜色空间 HSV颜色模型 我们已经初步认识了HSV颜色空间的特性与优势 现在就来看两个典型的应用实例 颜色分割提取 与 颜色替换 颜色分割 通过HSV颜色空间的操作我们可以