当前位置: 首页 > article >正文

OpenCV轻松入门(七)——HSV颜色模型图像特效案例:判断白天夜晚抠图颜色过滤替换背景图

HSV模型解释

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

这个模型中颜色的参数分别是:

  • 色调(H)
  • 饱和度(S)
  • 明度(V)

色调H

用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度S

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

明度V

明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

结论

  1. 当S=1 V=1时,H所代表的任何颜色被称为纯色;
  2. 当S=0时,即饱和度为0,颜色最浅,最浅被描述为灰色(灰色也有亮度,黑色和白色也属于灰色),灰色的亮度由V决定,此时H无意义;
  3. 当V=0时,颜色最暗,最暗被描述为黑色,因此此时H(无论什么颜色最暗都为黑色)和S(无论什么深浅的颜色最暗都为黑色)均无意义。

注意:  

  • 在opencv中,H、S、V值范围分别是[0,180],[0,255],[0,255],而非[0,360],[0,1],[0,1];

这里我们列出部分hsv空间的颜色值, 表中将部分紫色归为红色。

判断白天还是夜晚案例

实现步骤

  1. 将图片从BGR颜色空间,转变成HSV颜色空间
  2. 获取图片的宽高信息
  3. 统计每个颜色点的亮度
  4. 计算整张图片的亮度平均值

注意:这仅仅只能做一个比较粗糙的判定,按照我们人的正常思维,在傍晚临界点我们也无法判定当前是属于晚上还是白天!

代码实现

import cv2
import numpy as np# 计算明暗程度平均值函数
def col_v(img):img = cv2.imread(img) # 读取传进来的图片img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 转换图片为HSV颜色模式h,s,v = cv2.split(img) # 分割后会得到HSV3个通道的值v = np.average(v) # 对V(明暗度)求平均值,也可以用np.sum/图片像素点总数来求平均值return vimg_1 = '/Users/guojun/Desktop/img1.jpg'
img_2 = '/Users/guojun/Desktop/img2.jpg'
v_1 = col_v(img_1)
v_2 = col_v(img_2)# 我们假设根据经验,平均值大于100的是白天
if v_2>100:print('day')
else:print('night')

颜色过滤案例

在一张图片中,如果某个物体的颜色为纯色,那么我们就可以使用颜色过滤inRange的方式很方便的来提取这个物体.

下面我们有一张网球的图片,并且网球的颜色为一定范围内的绿色,在这张图片中我们找不到其它颜色也为绿色的图片,所以我们可以考虑使用绿色来提取它!

图片的颜色空间默认为BGR颜色空间,如果我们想找到提取纯绿色的话,我们可能需要写(0,255,0)这样的内容,假设我们想表示一定范围的绿色就会很麻烦!

所以我们考虑将它转成HSV颜色空间,绿色的色调H的范围我们很容易知道,剩下的就是框定颜色的饱和度H和亮度V就可以啦!

实现步骤

  1. 读取一张彩色图片
  2. 将RGB转成HSV图片
  3. 定义颜色的范围,下限位(30,120,130),上限为(60,255,255)
  4. 根据颜色的范围创建一个mask

代码实现

import cv2
import numpy as np
'''
读取一张彩色图片
将RGB转成HSV图片
定义颜色的范围,下限位(30,120,130),上限为(60,255,255)
根据颜色的范围创建一个mask
'''
img = cv2.imread('/Users/guojun/Desktop/ball.jpg') # 读取传进来的图片
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 转换图片为HSV颜色模式# 定义范围 网球颜色范围
lower_color = (30,120,130)
upper_color = (60,255,255)# 查找颜色
mask = cv2.inRange(img,lower_color,upper_color)
cv2.imshow("mask_img",mask)cv2.waitKey(0)
cv2.destroyAllWindows()

替换背景图案例

实现步骤

  1. 从绿幕图片中过滤出绿幕
  2. 将狗子从绿幕中抠出来
  3. 在背景图片上抠出狗子的位置
  4. 将狗子和背景图片进行相加得到最终的图片

代码实现

备注:      感兴趣的小伙伴可自行封装哦~~~

import cv2
import numpy as np
import matplotlib.pyplot as plt# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()
'''
1、从绿幕图片中过滤出绿幕
2、将狗狗从绿幕中抠出来
3、在背景图片上抠出狗狗的位置
4、将狗狗和背景图片进行相加得到最终的图片
'''
dog_img = cv2.imread('/Users/guojun/Desktop/dog.jpg') # 读取传进来的前景图片
bg_img = cv2.imread('/Users/guojun/Desktop/bk.jpeg') # 读取传进来的背景图片
hsv_dog_img = cv2.cvtColor(dog_img,cv2.COLOR_BGR2HSV) # 转换图片为HSV颜色模式
hsv_bg_img = cv2.cvtColor(bg_img,cv2.COLOR_BGR2HSV) # 转换图片为HSV颜色模式# 定义范围 绿颜色范围
lower_color = (30,120,130)
upper_color = (60,255,255)# 从绿幕图片中过滤出绿幕
mask = cv2.inRange(hsv_dog_img,lower_color,upper_color)
# imgshow(mask)
mask_dog_img = dog_img.copy()
# 将狗狗从绿幕中抠出来
mask_dog_img[mask!=0]=[0,0,0]
# imgshow(mask_dog_img)mask_bg_img = bg_img.copy()
# 因为两张图不一样大小,按照小的来进行裁剪,定义裁剪区域
start_row, start_col = 0, 0
end_row, end_col = dog_img.shape[0], dog_img.shape[1]
# 裁剪图片
mask_bg_img = mask_bg_img[start_row:end_row, start_col:end_col]# 在背景图片上抠出狗狗的位置
mask_bg_img[mask==0]=[0,0,0]
# imgshow(mask_bg_img)# 将狗狗和背景图片进行相加得到最终的图片
new_img = mask_bg_img+mask_dog_img
imgshow(new_img)
http://www.lryc.cn/news/2417515.html

相关文章:

  • 车辆管理系统的设计与实现-附源码031034
  • Android中APK安装过程及原理解析
  • Visual Studio Code 如何编写运行 C、C++ 程序?(高赞回答)
  • 摄影常用词:光圈、快门、曝光、底片、ISO、焦距、景深
  • Flink系列四:Flink中并行度、算子链、任务槽详解
  • 【艾琪出品】《计算机应用基础》【试题汇总1】
  • CTR(Click-Through-Rate)即点击通过率
  • 代码随想录学习记录——字符串篇
  • PLSQL_性能优化系列03_Oracle Parallel并发处理
  • 深入浅出达梦SQL(基础篇)
  • 李宏毅《机器学习》| 神经网络训练不起来怎么办(上)
  • C++ 应用软件开发从入门到实战详解
  • 使用Python编写圣诞树
  • 开源虚拟化管理平台Ovirt简介和配置环境搭建
  • 获取同局域网其他用户数据_一些无线局域网的专业名词解释
  • c++ png图片合成_前端小知识 | 合理选择 PNG, JPG, SVG 图片格式
  • 因找不到d3dcompiler_42.dll文件导致游戏软件无法运行问题
  • 吴恩达机器学习系列课程--个人笔记
  • 【DDoS】钟南山:对抗DDoS的5大手段
  • 如何卸载IE7重装IE6
  • go桌面主题制作工具——GO Dev Team
  • 自动化测试学习笔记
  • 番茄todo电脑版_好用到叫出声!10 款特别优秀的电脑软件,错过真可惜了
  • 实战:无线wifi密码破解与路由器入侵
  • C++ STL vector assign用法
  • 记我的第一次烘焙
  • RW-50004:Error code received when running external process
  • 舆情监控系统的设计与优化
  • 利用CSS制作静态网页的注意事项
  • 窄字节与宽字节