色彩空间
RGB,RGBA,YUV(亮度,红色分量与亮度信号的插值,蓝色与亮度的插值),HSV(色度,饱和度,亮度)。。。。。
void cv::cvtColor ( InputArray src,
OutputArray dst,
int code,
int dstCn = 0
)
// 数据类型转换
void cv::Mat::convertTo ( OutputArray m,
int rtype,
double alpha = 1,
double beta = 0
) const
改变色彩空间,前两个参数用于输入图像,目标图像,第三个参数指明转换的色彩空间,第四个参数默认就行。。需要注意的是该函数变换前后的图像取值范围
8位无符号图像的像素为0 - 255。CV_8U
16 无符号图像的像素为 0-65535. CV_16U
32 位浮点图像的像素为 0-1 ,
因此一定要注意目标图像的像素范围.在线性变换的情况下,范围问题不需要考虑,目标图像的像素不会超出范围。如果在非线性变换的情况下,那么应将输入 RGB 图像归一化到适当的范围以内来获得正确的结果,例如将 8位无符号图像转成 位32浮点图像 需要先将图像像素通过除以 255 缩放0-1 范围内 以防止产生错误结果.
数据类型转换,参数为输出图像,转换图像的目标类型,alpha ,beta缩放因子,偏置因子。
m(x,y)=saturatecast<rtpye>(α(∗this)(x,y)+β) m(x,y) = saturate_cast<rtpye>(\alpha(*this)(x,y) + \beta)m(x,y)=saturatecast<rtpye>(α(∗this)(x,y)+β)
转换方式就是线性变换,按照指定的类型输出。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
system("color E");
Mat img = imread("D:\\壁纸\\2k.jpg");
cout<<img.type()<<endl;
cout << size(img) << img.type() << endl;
if (img.empty())
{
cout << "error";
}
Mat gray, HSV, YUV, Lab, img32;
img.convertTo(img32, CV_32F, 1.0 / 255); // 类型转换,将CV_8U转换成CV_32F
cvtColor(img32, HSV, COLOR_BGR2HSV);
cvtColor(img32, YUV, COLOR_BGR2YUV);
cvtColor(img32, Lab, COLOR_BGR2Lab);
cvtColor(img32, gray, COLOR_BGR2GRAY);
imshow("原图", img32);
imshow("hsv", HSV);
imshow("YUV", YUV);
imshow("Lab", Lab);
imshow("gray", gray);
waitKey(100);
return 0;
}
通道的分离和合并
图片的不同分量存放在不同通道里,通道的分离处理,在合并重新生成图像。
void cv::split ( const Mat & src,
Mat * mvbegin // 分离的通道,为数组的形式,需要知道通道数
)
void cv::split ( InputArray m,
OutputArrayOfArrays mv // 分离的单通道,向量vector格式,不用知道通道数
)
void cv::merge ( const Mat * mv, // 数组,尺寸,类型相同
size_t count, // 输入图像数组的长度,大于0
OutputArray dst
)
void cv::merge ( InputArrayOfArrays mv, // 与split对应
OutputArray dst
)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
system("color E");
Mat img = imread("D:\\壁纸\\2k.jpg");
Mat HSV;
cvtColor(img, HSV, COLOR_RGB2HSV);
Mat imgs0, imgs1, imgs2; // 存放数组类型的结果
Mat imgv0, imgv1, imgv2; // 存放vector类型的结果
Mat result0, result1, result2; // 合并结果
Mat imgs[3];
split(img, imgs