教程汇总: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 npdef 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.shapewhile(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)&0xFFif k == 27: #esc exitbreak#cv2.waitKey(0)
cv2.destroyAllWindows()

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


同样的,我们把皮肤颜色作为颜色分割替换目标也可以更改皮肤颜色,比如改成绿巨人的肤色:

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

  1. HSV颜色分割,RGB与HSV颜色空间的关系

    1前言 在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解. 而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色.深浅如何.明暗 ...

  2. 基于HSV颜色空间的辅助车牌定位

    HSV颜色空间(H代表色调,S即饱和度,V是亮度) 色调H 用角度度量,取值范围为0°-360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°.它们的补色是:黄色为60°,青 ...

  3. 由RGB到HSV颜色空间的理解

    1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常 ...

  4. AR学习笔记(七):阈值二值化优化与颜色分割的优化

    AR学习笔记(七):阈值二值化优化与颜色分割的优化 阈值二值化的优化 当前方案 图像预处理 阈值二值化 优化方案 otsu法 顶帽变换 分块阈值法 颜色分割的优化 当前方案 优化方案 HSV模型分割 ...

  5. 基于hsv颜色空间的图像分割

    HSV颜色空间模型是倒锥形模型: 这个模型是按色调.饱和度.明暗来描述的. H值代表色调.S值代表饱和度.V值代表亮度. 在圆锥上,角度代表色调H,饱和度S表示为点到中心竖线的距离,而亮度值V用中心竖 ...

  6. 使用纯JavaCV实现颜色分割 / 轮廓提取 / 离焦 / 线性旋转变焦模糊 / 灰度化 / 标注等处理

    年底冲KPI很多项目要结项,临时被拉去开发了一些"很有意思"的项目,感觉自从离开学校以后很长时间都没有再接触过图像处理领域了,有点跟熟悉的陌生人打交道的快感.这里简单记录一下相关代 ...

  7. OpenCV通过HSV颜色空间过滤图片及目标检测颜色空间范围确定

    在目标检测中,我们可以通过卷积网络进行目标检测,但实际上,卷积网络并不能完全正确.所以,我们可以通过其它方式进行筛选,比如颜色空间 参考: Image Segmentation Using Color ...

  8. 【主色提取】HSV 颜色空间与 RGB 颜色空间互相转化的公式和代码

    系列文章目录 第二章 主色提取之颜色空间转化 目录 系列文章目录 文章目录 前言 一.HSV 和 RGB 颜色空间 二.颜色转化 1. RGB to HSV 2. HSV to RGB 三. 完整代码 ...

  9. opencv颜色识别python_opencv使用HSV颜色空间实现颜色识别

    一.颜色空间介绍 RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色调 Hue, ...

最新文章

  1. StarUML中时序图添加小人
  2. CentOS6.5更改ssh端口问题
  3. Paper Review: Bayesian Shrinkage towards Sharp Minimaxity
  4. python 的下划线_
  5. 计算机组成原理左规右规,计算机组成原理 第四章(严军勇)-2003-2012年.ppt
  6. P2962 [USACO09NOV]灯Lights
  7. 【华为云技术分享】程序员实用JDK小工具归纳
  8. 元气骑士如何获得机器人成就皮肤_元气骑士:获得成就叹息之墙,花圃免费开,附带5000蓝币奖励...
  9. php 5.3连接mssql2005以上版本的数据库
  10. Java+Swing+mysql实现学生选课管理系统
  11. MAC系统/虚拟机中的chm打不开
  12. 第6章 DataNode
  13. Qlik view 连接数据库
  14. 上周热点回顾(10.18-10.24)
  15. 我的世界 win10c语言版,Minecraft Win10版下载
  16. 【爬虫】应用Python爬虫爬取豆瓣租房上的帖子信息
  17. Doves and bombs UVA - 10765
  18. 检索所学课程包含学生S3所学课程的学生学号
  19. HTML5 CSS3 精美案例 实现VCD包装盒个性幻灯片
  20. 目前5G SoC 芯片技术成熟吗

热门文章

  1. 2020版idea ij 创建web项目和以往稍有不同。
  2. mysql数据库的在线数据备份与数据恢复
  3. iframe vue 宽度_vue 如何自适应调整嵌入的 iframe 的大小,让用户完全感觉不出有 iframe 这个东西?...
  4. telnet不是内部或外部命令,也不是可运行的程序
  5. addEventListener()事件监听
  6. Linux网络之连接跟踪(conntrack)
  7. MySQL_15_MySQL底层SQL查询成本计算
  8. 最优化及其运用 学习笔记(二)
  9. 云服务器搭建好,出现 拒绝了我们的连接请求。
  10. vue-cli自动化测试karma + mocha + chai