博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RGB色彩空间和HSV色彩空间的理解
阅读量:5115 次
发布时间:2019-06-13

本文共 3158 字,大约阅读时间需要 10 分钟。

转自:https://blog.csdn.net/u010429424/article/details/76577399

 

本文的结构如下: 

1、RGB色彩空间 
2、HSV色彩空间(附HSV颜色分量范围表) 
3、RGB到HSV的转换的Demo 
  使用OpenCV实现RGB转HSV,并通过滑动条动态设定HSV阈值 
  自己写程序,实现RGB转HSL

 

1、RGB色彩空间

RGB色彩空间源于使用阴极射线管的彩色电视,RGB分别代表三个基色(R-红色、G-绿色、B-蓝色),具体的色彩值由三个基色叠加而成。在图像处理中,我们往往使用向量表示色彩的值,如(0,0,0)表示黑色、(255, 255, 255)表示白色。其中,255表示色彩空间被量化成255个数,最高亮度值为255(255 = 2^8 - 1,即每个色彩通道用8位表示)。在这个色彩空间中,有256*256*256种颜色。RGB色彩空间如下图所示(图片来自百度百科)。是一个包含Red、Green、Blue的三维空间。

这里写图片描述

注: 

1、在OpenCV中,RGB色彩空间的顺序是BGR,千万不要弄错了 
2、在Java的Bitmap中,RGB色彩空间被表示为ARGB,其中A代表透明度

2、HSV色彩空间

HSV色彩空间(Hue-色调、Saturation-饱和度、Value-值)将亮度从色彩中分解出来,在图像增强算法中用途很广。在我本人接触的图像处理项目中,经常将图像从RGB色彩空间转换到了HSV色彩空间,以便更好地感知图像颜色,利用HSV分量从图像中提取感兴趣的区域。

HSV色彩空间也被称为HSB(色调、饱和度、亮度),在PS中常被用到。

HSV色彩空间如下图所示,用一个倒圆锥体表示整个色彩空间:

这里写图片描述

注: 

1、H的范围是[0,360),S和V的范围是[0,1]。但是在OpenCV 中,HSV好像被规范化到了[0, 255],此处求大神指导。 
2、另外,网上有人总结了HSV颜色对应RGB的分量范围,见下面的表格。参考自: 
 

这里写图片描述

3、RGB到HSV的转换的Demo

(1) 使用OpenCV的cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

OpenCV为我们提供了现成的函数cvtColor(),帮助我们将图像从BGR转换到HSV。

# -*- coding:utf-8 -*-import cv2"""功能:读取一张图片,显示出来,并转化为HSV色彩空间"""image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片 cv2.imshow("BGR", image) # 显示图片 # 转化图片到HSV色彩空间 dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) cv2.imshow("HSV", dst) # 显示图片 cv2.waitKey(0) # 等待键盘触发事件,释放窗口

结果如下:

这里写图片描述

挺好看的美女,结果被弄成了这个样子。一些初学者包括我自己有时会问,为什么要把好端端的图片转成HSV色彩空间呢。其实这样做大有用处,比如我们要提取美女的头发区域,就可以通过设置HSV色彩空间的高低阈值来做。

# -*- coding:utf-8 -*-import cv2import numpy as np   # ------------------改变1 """ 功能:读取一张图片,显示出来,并转化为HSV色彩空间 """ image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片 cv2.imshow("BGR", image) # 显示图片 # 转化图片到HSV色彩空间 dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) cv2.imshow("HSV", dst) # 显示图片 # 根据HSV提取头发 --------------------------------改变2 low_hsv = np.array([0, 0, 46]) high_hsv = np.array([200, 40, 220]) dst = cv2.inRange(dst, low_hsv, high_hsv) cv2.imshow("result", dst) # 显示图片 cv2.waitKey(0) # 等待键盘触发事件,释放窗口

程序的运行效果如下。我们看到,头发区域显示为白色,这样我们就初步地提取出了头发区域。当然这个效果并不理想,是因为我们设定的阈值不好,如果能动态地设定阈值就好了。

这里写图片描述

我们可以利用滑块动态地设置阈值,一边拖动滑块,一边观察图像。OpenCV提供了createTrackbar(),用于创建滑块。代码如下:

# -*- coding:utf-8 -*-import cv2import numpy as np""" 功能:读取一张图片,显示出来,转化为HSV色彩空间 并通过滑块调节HSV阈值,实时显示 """ image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片 cv2.imshow("BGR", image) # 显示图片 hsv_low = np.array([0, 0, 0]) hsv_high = np.array([0, 0, 0]) # 下面几个函数,写得有点冗余 def h_low(value): hsv_low[0] = value def h_high(value): hsv_high[0] = value def s_low(value): hsv_low[1] = value def s_high(value): hsv_high[1] = value def v_low(value): hsv_low[2] = value def v_high(value): hsv_high[2] = value cv2.namedWindow('image') cv2.createTrackbar('H low', 'image', 0, 255, h_low) cv2.createTrackbar('H high', 'image', 0, 255, h_high) cv2.createTrackbar('S low', 'image', 0, 255, s_low) cv2.createTrackbar('S high', 'image', 0, 255, s_high) cv2.createTrackbar('V low', 'image', 0, 255, v_low) cv2.createTrackbar('V high', 'image', 0, 255, v_high) while True: dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # BGR转HSV dst = cv2.inRange(dst, hsv_low, hsv_high) # 通过HSV的高低阈值,提取图像部分区域 cv2.imshow('dst', dst) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows()

 

程序运行的效果如下,我们拉动滑块会自动改变HSV的高低阈值,进而根据高低阈值提取的图像区域也会改变:

这里写图片描述

转载于:https://www.cnblogs.com/JorSean/p/9412952.html

你可能感兴趣的文章
嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】...
查看>>
函数随笔
查看>>
哈尔滨工程大学ACM预热赛(A,C,H,I)
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
Dijkstra算法——最短路径(转)
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
【实数二分/前缀和维护】Best Cow Fences
查看>>
构造者模式
查看>>
[转][C#]Combobox 行高
查看>>
什么是IDS/IPS?
查看>>
JavaScript:学习笔记(3)——正则表达式的应用
查看>>
LeetCode:旋转链表【61】
查看>>
浮点数转化为字符串
查看>>
ssRs父子维度
查看>>
关押罪犯
查看>>
像房源上下架链路比较长的需求怎么测试?测试的重点和难点?
查看>>
python小记(6)高阶函数
查看>>
加密接口如何测试?
查看>>
Dubbo和kafka的基本原理和测试方法
查看>>