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的取值

  1. RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换
    cv::COLOR_BGR2RGB
    cv::COLOR_RGB2BGR
    cv::COLOR_RGBA2BGRA
    cv::COLOR_BGRA2RGBA
  2. 向RGB和BGR图像中增添alpha通道
    cv::COLOR_RGB2RGBA
    cv::COLOR_BGR2BGRA
  3. 从RGB和BGR图像中去除alpha通道
    cv::COLOR_RGBA2RGB
    cv::COLOR_BGRA2BGR
  4. 从RBG和BGR颜色空间转换到灰度空间
    cv::COLOR_RGB2GRAY
    cv::COLOR_BGR2GRAY
    cv::COLOR_RGBA2GRAY
    cv::COLOR_BGRA2GRAY
  5. 从灰度空间转换到RGB和BGR颜色空间
    cv::COLOR_GRAY2RGB
    cv::COLOR_GRAY2BGR
    cv::COLOR_GRAY2RGBA
    cv::COLOR_GRAY2BGRA
  6. 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
  7. 灰度空间域BGR565之间的转换
    cv::COLOR_GRAY2BGR555
    cv::COLOR_BGR5552GRAY
  8. RGB和BGR颜色空间与CIE XYZ之间的转换
    cv::COLOR_RGB2XYZ
    cv::COLOR_BGR2XYZ
    cv::COLOR_XYZ2RGB
    cv::COLOR_XYZ2BGR
  9. RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
    cv::COLOR_RGB2YCrCb
    cv::COLOR_BGR2YCrCb
    cv::COLOR_YCrCb2RGB
    cv::COLOR_YCrCb2BGR
  10. RGB和BGR颜色空间与HSV颜色空间之间的相互转换
    cv::COLOR_RGB2HSV
    cv::COLOR_BGR2HSV
    cv::COLOR_HSV2RGB
    cv::COLOR_HSV2BGR
  11. RGB和BGR颜色空间与HLS颜色空间之间的相互转换
    cv::COLOR_RGB2HLS
    cv::COLOR_BGR2HLS
    cv::COLOR_HLS2RGB
    cv::COLOR_HLS2BGR
  12. RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
    cv::COLOR_RGB2Lab
    cv::COLOR_BGR2Lab
    cv::COLOR_Lab2RGB
    cv::COLOR_Lab2BGR
  13. RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
    cv::COLOR_RGB2Luv
    cv::COLOR_BGR2Luv
    cv::COLOR_Luv2RGB
    cv::COLOR_Luv2BGR
  14. 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. 说明

  • 如果一个给定的像素的值大于零,那么这个像素会被打开,如果它的值为零,不会被打开。按位功能在这些二进制条件下运行。
  1. AND:当且仅当两个像素都大于零时,按位AND才为真,即像素点打来。
  2. OR:如果两个像素中的任何一个大于零,则按位“或”为真。
  3. XOR 异或功能:当且仅当两个像素中的任何一个大于零时,按位XOR才为真。即当且仅当两个像素一个大于0一个小于0时才为真,其他都为false。
  4. 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);

opencv黑白图像转彩色 opencv彩色转灰度函数_inRange

cvtColor(src, hsv, COLOR_BGR2HSV);
	imshow("hsv", hsv);

opencv黑白图像转彩色 opencv彩色转灰度函数_cvtColor_02

//将图形转化为二值图像,在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);

opencv黑白图像转彩色 opencv彩色转灰度函数_cvtColor_03

//对调二值图像取值,在hsv范围内为黑色0,不再范围内为白色255
	bitwise_not(bg, bg_not);
	imshow("bg_not", bg_not);

opencv黑白图像转彩色 opencv彩色转灰度函数_颜色空间_04

//按位二值运算--and   都大于0的颜色打开,即显示不在hsv范围内的图像
	bitwise_and(src, src, people, bg_not);
	imshow("people", people);

opencv黑白图像转彩色 opencv彩色转灰度函数_bitwise_05

//===============换背景=======================
	//读取需要替换的背景图片
	Mat bg2,des,des1;
	bg2=imread("D:/test/bg2.jpg");
	imshow("bg2", bg2);

opencv黑白图像转彩色 opencv彩色转灰度函数_opencv黑白图像转彩色_06

//裁剪出与目标图片一样规格的图像,因此才可以做二值操作
	Mat sc(bg2, Rect(0, 0, people.cols, people.rows));
	imshow("sc", sc);

opencv黑白图像转彩色 opencv彩色转灰度函数_cvtColor_07

//二者都大于0像素点会被打开
	bitwise_and(sc, sc, des, bg);
	imshow("des", des);

opencv黑白图像转彩色 opencv彩色转灰度函数_bitwise_08

//只要大于0的像素都会被打开
	bitwise_or(des, people, des1);
	imshow("des1", des1);
	waitKey(0);
	return 0;
}

opencv黑白图像转彩色 opencv彩色转灰度函数_bitwise_09

彩色图片转化成灰色图像

彩色图象的灰度其实在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,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)就是灰度图了。