HSV颜色分割
HSV颜色分割
目的:
目的就是为了更多地了解图像色彩空间,大部分图像计算基于图像色彩空间和图像统计直方图进行计算,而图像色彩空间最常用的有RGB、HSV、YUV三种格式。
任务:
了解图像的常用色彩空间,熟悉图像的基本处理方式,能够使用;
图像色彩空间:
RGB是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,这个我就不再介绍了。
HSV色彩空间即色相、饱和度、明度(英语:Hue, Saturation, Value),基于HSV颜色空间的表示在图像分割、特征提取等领域都有重要的应用。
在后面的图像对接的时候我们小组采用了通设置具体的H、S、V区间来做颜色空间的分割。
YUV颜色空间:
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。两个色差信号是蓝色色差信号B-Y(U)、红色色差信号R-Y(V)。
与RGB不同的是YUV里亮度信号Y和色度信号U、V是分离,只需要占用极少的频宽。U和V作用是描述影像色彩及饱和度,用于指定像素的颜色。
Y通过RGB叠加计算,U(Cb, Chrominance blue) 反映RGB蓝色部分与RGB信号亮度值之间的差异,Y(Cr, Chrominance red) 反映RGB红色部分与RGB信号亮度值之间的差异。
灰度图像:
灰度图色阶从0-255,求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
使用HSV做颜色空间的分割 ,RGB也是用来做颜色空间的分割,定义颜色阈值就可以了,为什么使用HSV来做更好呢。
HSV是依赖于RGB的简单变换,(h, s, v)三元组在被约束于特定RGB空间的时候就色域变成更加明确,类似于人类感觉颜色的方式,具有较强的感知度。就
好像你会问 “这是什么颜色?深浅如何?明暗如何?”
在RGB当中色域太过于丰富,色域空间是256*256*256个值,选定阈值进行颜色分割并不是一件容易界定的事情(太多值),而HSV则使一切变得更加简单,256种颜色选定一个,再设定明暗和饱和度即可。
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace cv; using namespace std; int HSVShow() { char img_path[] = "/Users/summing/Workplaces/data/Coke.jpg"; Mat img_rgb, img_hsv, img_hsv_mark, red_dst; clock_t start, end; img_rgb = imread(img_path); if (!img_rgb.data) { return -1; } start = clock(); cvtColor(img_rgb, img_hsv, CV_BGR2HSV); Scalar lowerb = Scalar(0, 43, 46); // Scalar lowerb2 = Scalar(156, 43, 46);// backup Scalar upperb = Scalar(10, 255, 255); // Scalar upperb2 = Scalar(180, 255, 255);// backup; inRange(img_hsv, lowerb, upperb, img_hsv_mark); red_dst = Mat(img_rgb.rows, img_rgb.cols, CV_32FC3); end = clock(); cout << end - start << "/" << CLOCKS_PER_SEC << " (s) " << endl; // bitwise_and(img_rgb, img_hsv_mark, red_dst); namedWindow("img_rgb", CV_WINDOW_NORMAL); namedWindow("img_hsv", CV_WINDOW_NORMAL); namedWindow("hsv_mask", CV_WINDOW_NORMAL); imshow("img_rgb", img_rgb); imshow("img_hsv", img_hsv); imshow("hsv_mask", img_hsv_mark); waitKey(0); return 0; } int main(int argc, const char *argv[]) { HSVShow(); return 0; }
HSV图像,看不懂的我们表示会控制HSV就好啦~~
红色区域提取后:
当不知道如何选择HSV色域范围的时候可以参考下面表格:
opencv中的 H分量是 0~180, S分量是0~255, V分量是0~255,但是HSV颜色空间却规定的是,H范围0~360,S范围0~1,V范围0~1,所以你需要自己转换一下,H*2,V/255,S/255。
H——Hue即色相,就是我们平时所说的红、绿,如果你分的更细的话可能还会有洋红、草绿等等;在HSV模型中,用度数来描述色相,其中红色对应0度,绿色对应120度,蓝色对应240度。
S——Saturation即饱和度,色彩的深浅度(0-100%) ,对于一种颜色比如红色,我们可以用浅红——大红——深红——红得发紫等等语言来描述它(请原谅一个纯理科生的匮乏的颜色系统),对应在画水彩的时候即一种颜料加上不同分量的水形成不同的饱和度。
V——Value即色调,纯度,色彩的亮度(0-100%) ,这个在调整屏幕亮度的时候比较常见。
注:在模型2中:
H是色彩点在对应圆形切面上与红色半径(对于H=0度)所形成的圆心角。
V是色彩点所在圆形切面到圆锥顶点的距离。在顶面上V=1 顶点V=0
S是色彩点到所在圆形切面圆心的距离与该圆半径的比例值,在圆锥表面上S=1,在圆心处S=0
转自链接:https://blog.csdn.net/chen_zhongming/article/details/52003666 https://cloud.tencent.com/developer/article/1471678