opencv 红色的rgb分别多少
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 红色的rgb分别多少相关的知识,希望对你有一定的参考价值。
参考技术A 光看RGB值很难把红色提取出来,建议转到HSV颜色空间。因为opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180)
S饱和度很重要,一般是大于一个值,S过低就是灰色(参考值S>80),
V就亮度,过低就是黑色,过高就是白色(参考值220>V>50)
PS:用cvCvtColor(src,dst,CV_BGR2HSV)即可转换追问
能不能具体的???我想根据一张工具盒的图片(放工具的地方有凹槽,一个工具对应一个凹槽),只有普通工具的,请问如何判断工具盒里面,有多少个凹槽里有工具,有多少个没有放工具??(因为工具就那几种特定的颜色),我想采用颜色进行试验,请问可行不???
追答应该可行。
方法说得很具体了,把RGB的彩色照片转HSV颜色空间再判断颜色。
能不能加QQ详聊啊???谢谢,有点小疑问
参考技术B RGB色彩模式(也翻译为“红绿蓝”,比较少用)是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。例如:纯红色R值为255,G值为0,B值为0;灰色的R、G、B三个值相等(除了0和255);白色的R、G、B都为255;黑色的R、G、B都为0。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色。
在 RGB 模式下,每种 RGB 成分都可使用从 0(黑色)到 255(白色)的值。 例如,亮红色使用 R 值 246、G 值 20 和 B 值 50。 当所有三种成分值相等时,产生灰色阴影。 当所有成分的值均为 255 时,结果是纯白色;当该值为 0 时,结果是纯黑色。
应用
目前的显示器大都是采用了RGB颜色标准,在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示32位颜色,约有一百万种以上的颜色。
在led 领域 利用三合一点阵全彩技术, 即在一个发光单元里由RGB三色晶片组成全彩像素。 随着这一技术的不断成熟,led显示技术会给人们带来更加丰富真实的色彩感受。
原理
RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。
有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。
红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。
红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱??是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。
RGB 颜色称为加成色,因为您通过将 R、G 和 B 添加在一起(即所有光线反射回眼睛)可产生白色。 加成色用于照明光、电视和计算机显示器。 例如,显示器通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视光谱都可表示为红、绿、蓝 (RGB) 三色光在不同比例和强度上的混合。 这些颜色若发生重叠,则产生青、洋红和黄。
语法RGB
( red,green,blue )
参数red:integer类型,指定颜色中的红色分量强度,有效值在0到255之间green:integer类型,指定颜色中的绿色分量强度,有效值在0到255之间blue:integer类型,指定颜色中的蓝色分量强度,有效值在0到255之间返回值Long。函数执行成功时返回由指定分量确定的颜色,用长整数表示。发生错误时返回-1。如果任何参数的值为NULL,RGB()函数返回NULL。
用法RGB()函数使用下述公式计算表示颜色的长整数:65536 * Red+ 256 * Green+Blue其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,亮度越低,数值越大,亮度越高。例如,RGB ( 0, 0, 0 )为黑色(亮度最低),RGB ( 255, 255,255 )为白色(亮度最高)。
RGB格式
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,R GB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,件多电子电器厂商普遍采用的做法是,将RGB转换成YUV 颜色空同,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
由于网页(WEB)是基于计算机浏览器开发的媒体,所以颜色以光学颜色RGB(红、绿、蓝)为主。 网页颜色是以16进制代码表示,一般格式为#ZYZABC (字母用数字代替 )如黑色是三个颜色为0,在网页代码便是:#000000。当颜色代码为#XXYYZZ时,可以用#XYZ表示,如#135与#113355表示同样的颜色。
各种RGB格式
RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色),那么图像数据001101010111…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。
¨ RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:
高字节 低字节
R R R R R G G G G G G B B B B B
可以组合使用屏蔽字和移位操作来得到RGB各分量的值:
#define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31
#define RGB(r,g,b) (unsigned int)( (r/0x08 << 11) | (g/0x08 << 6) | b/0x08 )
#define RGB(r,g,b) (unsigned int)( (r/0x08 << 10) | (g/0x08 << 5) | b/0x08 )
该代码可以解决24位与16位相互转换的问题
¨ RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
高字节 低字节
X R R R R G G G G G B B B B B (X表示不用,可以忽略)
可以组合使用屏蔽字和移位操作来得到RGB各分量的值:
#define RGB555_MASK_RED 0x7C00
#define RGB555_MASK_GREEN 0x03E0
#define RGB555_MASK_BLUE 0x001F
R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31
¨ RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:
typedef struct tagRGBTRIPLE
BYTE rgbtBlue; // 蓝色分量
BYTE rgbtGreen; // 绿色分量
BYTE rgbtRed; // 红色分量
RGBTRIPLE;
¨ RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:
typedef struct tagRGBQUAD
BYTE rgbBlue; // 蓝色分量
BYTE rgbGreen; // 绿色分量
BYTE rgbRed; // 红色分量
BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)
RGBQUAD。
[编辑本段]主要算法
public void paint(Graphics g)
h.clearRect(0, 0, 370, 420);
h.setColor(Color.black);
h.drawLine(100, 100, 355, 100);
h.drawLine(100, 100, 100, 355);
h.drawLine(100, 355, 355, 355);
h.drawLine(355, 100, 355, 355);
h.drawLine(100, 100, 50, 150);
h.drawLine(355, 100, 305, 150);
h.drawLine(355, 355, 305, 405);
h.drawLine(100, 355, 50, 405);
h.drawLine(50, 150, 50, 405);
h.drawLine(50, 150, 305, 150);
h.drawLine(305, 150, 305, 405);
h.drawLine(50, 405, 305, 405);
h.setColor(Color.red);
h.fillOval(45, 400, 10, 10);
h.setColor(Color.green);
h.fillOval(350, 350, 10, 10);
h.setColor(Color.blue);
h.fillOval(95, 95, 10, 10);
h.setColor(Color.cyan);
h.fillOval(350, 95, 10, 10);
h.setColor(Color.magenta);
h.fillOval(45, 145, 10, 10);
h.setColor(Color.yellow);
h.fillOval(300, 400, 10, 10);
h.setColor(Color.black);
h.fillOval(95, 350, 10, 10);
h.drawOval(300, 145, 10, 10);
h.setColor(c);
int i = (90 + gc) - (int)(0.19600000000000001D * (double)rc);
int j = (345 - bc) + (int)(0.19600000000000001D * (double)rc);
h.fillRect(i, j, 20, 20);
h.setColor(Color.black);
h.drawRect(i, j, 20, 20);
g.drawImage(offimg, 0, 0, this);
g.setColor(Color.red);
g.setFont(fonsig);
g.drawString
参考技术C RGB ....R =Red G=GREEN B=BLUE..你说呢
OpenCV进阶--图像颜色空间
一、颜色模型与转换
1.1RGB颜色模型
RGB颜色空间模型:
该模型的命名方式是采用三种颜色的英文首字母,分别是红色,绿色,和蓝色。在RGB模型中所有的颜色都是这三种颜色通过不同比例的混合模型,如果三种颜色都为零,则表示为黑色,如果三种颜色的分量相同且都为最大值,则表示为白色。在这个基础上增加第四个通道即为RGBA模型,第四个通道表示颜色的透明度,当没有透明度需求的时候,RGBA模型就会退化成RGB模型。
1.2YUV颜色模型
YUV模型是电视信号系统所采用的颜色编码方式。这三个变量分别表示像素的亮度(Y)、红色分量与亮度信号差值(U)、蓝色与亮度的差值(V)。这种颜色模型主要用于视频和图像的传输。RGB模型与YUV模型之间的转换关系如下:
1.3HSV颜色模型
HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
1.4Lab颜色模型
Lab颜色模型弥补来了RGB颜色模型的不足。是一种设备无关和基础与生理特征的颜色模型。在模型中, L表示亮度,a和b是两个颜色通道,两者的取值区间都是-128~127,其中a通道数值有小到打对应的颜色是从绿色变成红色,b通道数值由小到大对应的颜色是由蓝色变成黄色。
1.5GRAY颜色模型
GRAY模型并不是一个彩色模型,而是一个灰度图像,灰度图像具有相同尺寸相同亚索格式所占容量小,易于采集,便于传输等优点。常用RGB模型转化成灰度图像的方式:
GRAY = 0.3R+ 0.59G+ 0.11B
1.6不同颜色模型之间的互相转换
OpenCV提供了cvtColor()函数用于转化功能。
void cv::cvtColor(InputArray src,
OutputArray dst,
int code,
int dstCn = 0
)
src: 待转换颜色模型的原始图像。
dst:转换颜色模型后的目标图像。
code:颜色空间转换的标志。
dstCn:目标图像中的通道数。
如果转换过程中添加了alpha通道(RGB模型中第四个通道,表示透明度),则其值将设置为相应通道范围的最大值:CV_8U为255,CV_16U为65535,CV_32F为1。
标志参数 | 简记 | 作用 |
COLOR_BGR2BGRA | 0 | 对RGB图像添加alpha通道 |
COLOR_BGR2RGB | 4 | 彩色图像通道颜色顺序的更改 |
COLOR_BGR2GRAY | 10 | 彩色图像转化成灰度图像 |
COLOR_GRAY2BGR | 8 | 灰度图像转化成彩色图像(伪彩色) |
COLOR_BGR2YUV | 82 | RGB颜色模型转成YUV颜色模型 |
COLOR_YUV2BGR | 84 | YUV颜色模型转成RGB颜色模型 |
COLOR_BGR2HSV | 40 | RGB颜色模型转成HSV颜色模型 |
COLOR_HSV2BGR | 54 | HSV颜色模型转成RGB颜色模型 |
COLOR_BGR2Lab | 44 | BGR颜色模型转成Lab颜色模型 |
COLOR_Lab2BGR | 56 | Lab颜色模型转成RGB颜色模型 |
代码实例:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lena.png");
if (img.empty())
{
cout << "请检查输入的图像数据是否正确" << endl;
return -1;
}
Mat gray, HSV, YUV, Lab;
cvtColor(img, HSV, COLOR_BGR2HSV);
cvtColor(img, YUV, COLOR_BGR2YUV);
cvtColor(img, Lab, COLOR_BGR2Lab);
cvtColor(img, gray, COLOR_BGR2GRAY);
imshow("原图", img);
imshow("HSV", HSV);
imshow("YUV", YUV);
imshow("Lab", Lab);
imshow("gray", gray);
waitKey(0);
return 0;
}
二、多通道分离函数与合并
2.1多通道分离函数split()
OpenCV中针对多通道分离函数split()有两种重载原型。
void cv::split(const Mat &src,
Mat *mvbegin
)
void cv::split(InputArray m,
OutArray mv
)
src:带分离的多通道图像。
mvbegin:分离后的单通道图像,为数组形式,数组大小需要与图像的通道数相同。
m:带分离的多通道图像。
mv:分离后的单通道图像,为向量(vector)形式。
虽然两个函数原型输入参数的类型不同,但通道分离的原理是相同的,可以用下式表示:
mv[c](I) = src(I)
2.2多通道合并函数merge()
OpenCV针对多通道分离合并函数merge()也有两种重载原型。
void cv::merge(const Mat &mv,
size_t cout,
OutputArray dst
)
void cv::merge(InputArrayOfArrays mv,
OutputArray dst
)
mv(第一种重载原型参数) : 需要合并的图像数组,其中每个图像必须有相同的尺寸和数据类型。
cout:输入的图像数组的长度,其数值必须大于0。
mv(第二种重载原型参数):需要合并的图像向量(vector),其中每个图像必须拥有相同的尺寸和数据类型。
dst:合并后输出的图像,与mv[0]具有相同的尺寸和数据类型,通道数等于所有输入图像的通道数总和。
2.3图像多通道分离与合并例程
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("C:\\\\Users\\\\王淏\\\\Pictures\\\\f9afe18da2fb1fa2ff72c4d8b29fe6a (2).png");
if (img.empty())
{
cout << "请检查输入的图像数据是否正确" << endl;
return -1;
}
Mat HSV;
cvtColor(img, HSV, COLOR_BGR2HSV);
Mat imgs0, imgs1, imgs2; //用于存放数组类型的结果
Mat imgv0, imgv1, imgv2; //用于存放vector类型的结果
Mat result0, result1, result2; //多通道合并的结果
//输入数组参数的多通道分离与合并0
Mat imgs[3];
split(img, imgs);
imgs0 = imgs[0];
imgs1 = imgs[1];
imgs2 = imgs[2];
imshow("RGB-B通道", imgs0);
imshow("RGB-G通道", imgs1);
imshow("RGB-R通道", imgs2);
imgs[2] = img; //将数组中的图像通道数变成不一致
merge(imgs, 3, result0); //合并图像
//imshow("result0", result0); imshow最多显示4个通道因此结果Image Watch中查看
Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
imgs[0] = zero;
imgs[2] = zero;
merge(imgs , 3, result1);
imshow("result1", result1);
//输入vector参数的多通道分离与合并
vector<Mat> imgv;
split(HSV, imgv);
imgv0 = imgv.at(0);
imgv1 = imgv.at(1);
imgv2 = imgv.at(2);
imshow("HSV-H通道", imgv0);
imshow("HSV-S通道", imgv1);
imshow("HSV-V通道", imgv2);
imgv.push_back(HSV); //将vector中的图像通道数变成不一致
merge(imgv, result2);
//imshow("result2", result2); imshow最多显示4个通道,因此结果在Image Watch中查看
waitKey(0);
return 0;
}
以上是关于opencv 红色的rgb分别多少的主要内容,如果未能解决你的问题,请参考以下文章