cvtColor函数
1.函数原型
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 )
This function only supports YUV420 to RGB conversion as of now.
2.函数功能
cvtcolor()函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
3.参数code的取值
- RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换
cv::COLOR_BGR2RGB
cv::COLOR_RGB2BGR
cv::COLOR_RGBA2BGRA
cv::COLOR_BGRA2RGBA - 向RGB和BGR图像中增添alpha通道
cv::COLOR_RGB2RGBA
cv::COLOR_BGR2BGRA - 从RGB和BGR图像中去除alpha通道
cv::COLOR_RGBA2RGB
cv::COLOR_BGRA2BGR - 从RBG和BGR颜色空间转换到灰度空间
cv::COLOR_RGB2GRAY
cv::COLOR_BGR2GRAY
cv::COLOR_RGBA2GRAY
cv::COLOR_BGRA2GRAY - 从灰度空间转换到RGB和BGR颜色空间
cv::COLOR_GRAY2RGB
cv::COLOR_GRAY2BGR
cv::COLOR_GRAY2RGBA
cv::COLOR_GRAY2BGRA - RGB和BGR颜色空间与BGR565颜色空间之间的转换
cv::COLOR_RGB2BGR565
cv::COLOR_BGR2BGR565
cv::COLOR_BGR5652RGB
cv::COLOR_BGR5652BGR
cv::COLOR_RGBA2BGR565
cv::COLOR_BGRA2BGR565
cv::COLOR_BGR5652RGBA
cv::COLOR_BGR5652BGRA - 灰度空间域BGR565之间的转换
cv::COLOR_GRAY2BGR555
cv::COLOR_BGR5552GRAY - RGB和BGR颜色空间与CIE XYZ之间的转换
cv::COLOR_RGB2XYZ
cv::COLOR_BGR2XYZ
cv::COLOR_XYZ2RGB
cv::COLOR_XYZ2BGR - RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
cv::COLOR_RGB2YCrCb
cv::COLOR_BGR2YCrCb
cv::COLOR_YCrCb2RGB
cv::COLOR_YCrCb2BGR - RGB和BGR颜色空间与HSV颜色空间之间的相互转换
cv::COLOR_RGB2HSV
cv::COLOR_BGR2HSV
cv::COLOR_HSV2RGB
cv::COLOR_HSV2BGR - RGB和BGR颜色空间与HLS颜色空间之间的相互转换
cv::COLOR_RGB2HLS
cv::COLOR_BGR2HLS
cv::COLOR_HLS2RGB
cv::COLOR_HLS2BGR - RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
cv::COLOR_RGB2Lab
cv::COLOR_BGR2Lab
cv::COLOR_Lab2RGB
cv::COLOR_Lab2BGR - RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
cv::COLOR_RGB2Luv
cv::COLOR_BGR2Luv
cv::COLOR_Luv2RGB
cv::COLOR_Luv2BGR - Bayer格式(raw data)向RGB或BGR颜色空间的转换
cv::COLOR_BayerBG2RGB
cv::COLOR_BayerGB2RGB
cv::COLOR_BayerRG2RGB
cv::COLOR_BayerGR2RGB
cv::COLOR_BayerBG2BGR
cv::COLOR_BayerGB2BGR
cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR
inRange函数
1.函数功能
- OpenCV中的inRange()函数可实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作!主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
2.函数原型
void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);
参数1:输入要处理的图像,可以为单通道或多通道。
参数2:包含下边界的数组或标量。
参数3:包含上边界数组或标量。
参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型
```
按位操作–bitwise
1. 说明
- 如果一个给定的像素的值大于零,那么这个像素会被打开,如果它的值为零,不会被打开。按位功能在这些二进制条件下运行。
- AND:当且仅当两个像素都大于零时,按位AND才为真,即像素点打来。
- OR:如果两个像素中的任何一个大于零,则按位“或”为真。
- XOR 异或功能:当且仅当两个像素中的任何一个大于零时,按位XOR才为真。即当且仅当两个像素一个大于0一个小于0时才为真,其他都为false。
- NOT 取反:倒置图像中的“开”和“关”像素。
2. 函数原型
void bitwise_not(InputArray src, OutputArray dst,
InputArray mask = noArray());
void bitwise_and(InputArray src1, InputArray src2,
OutputArray dst, InputArray mask = noArray());
void bitwise_or(InputArray src1, InputArray src2,
OutputArray dst, InputArray mask = noArray());
void bitwise_xor(InputArray src1, InputArray src2,
OutputArray dst, InputArray mask = noArray());
```
举例说明:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src,hsv, bg, bg_not, people, changeBg;
src=imread("D:/test/suan.jpg");
imshow("src", src);
cvtColor(src, hsv, COLOR_BGR2HSV);
imshow("hsv", hsv);
//将图形转化为二值图像,在hsv取值范围内的图像为白色,不在范围内为黑色。
//inRange(hsv, Scalar(100, 43, 46), Scalar(124,255,255), bg);
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), bg);
imshow("bg", bg);
//对调二值图像取值,在hsv范围内为黑色0,不再范围内为白色255
bitwise_not(bg, bg_not);
imshow("bg_not", bg_not);
//按位二值运算--and 都大于0的颜色打开,即显示不在hsv范围内的图像
bitwise_and(src, src, people, bg_not);
imshow("people", people);
//===============换背景=======================
//读取需要替换的背景图片
Mat bg2,des,des1;
bg2=imread("D:/test/bg2.jpg");
imshow("bg2", bg2);
//裁剪出与目标图片一样规格的图像,因此才可以做二值操作
Mat sc(bg2, Rect(0, 0, people.cols, people.rows));
imshow("sc", sc);
//二者都大于0像素点会被打开
bitwise_and(sc, sc, des, bg);
imshow("des", des);
//只要大于0的像素都会被打开
bitwise_or(des, people, des1);
imshow("des1", des1);
waitKey(0);
return 0;
}
彩色图片转化成灰色图像
彩色图象的灰度其实在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R, G,B 的比一般为3:6:1。
任何颜色都由红、绿、蓝三基色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R0.3+G0.59+B0.11
2.整数方法:Gray=(R30+G59+B11)/100
3.移位方法:Gray =(R77+G151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。