文章目录
- 一、图像数据类型转换
- 二、颜色模型转换
- 三、通道的分离和融合
一、图像数据类型转换
OpenCV中使用imread读取一张彩色图像时,默认采用的是BGR通道和整数类型(0-255,CV_8U)。
在某些情况下,会将整数类型(0-255)转换为浮点类型(0-1),可采用 convertTo() 函数。它将源图像的每个元素按照以下公式进行转换: dst = src*缩放因子+偏移量
cv::Mat img = cv::imread("C:/Users/Opencv/temp/lena.png");
cv::Mat img2;
img.convertTo(img2, CV_32F, 1 / 255.0, 0);
// img2:目标图像
// CV_32F:目标数据类型
// 1 / 255.0:缩放因子,默认为1
// 0:偏移量,默认为0
注:因为是BGR通道顺序,所以例如左图的第一个像素点,B为247,G为247,R为229
二、颜色模型转换
在OpenCV中,彩色图像默认读取为RGB颜色模型(但通道相反,BGR)。还有其他的颜色模型,如YUV、HSV、Lab、GRAY等,都是可以进行转换的。使用的转换函数是 cvtColor()函数
cv::cvtColor(src, dst, code, dstCn=0);
// code:颜色空间转换的标志,如由RGB空间到HSV空间——COLOR_BGR2HSV
// dstCn:目标图像中的通道数,如果参数为0,则从src和代码中自动导出通道数
代码如下(示例):
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
int main()
{
cv::Mat img = cv::imread("C:/Users/Opencv/temp/lena.png");
cv::Mat img2;
img.convertTo(img2, CV_32F, 1 / 255.0, 0);
cv::Mat HSV;
cv::cvtColor(img, HSV, cv::COLOR_BGR2HSV);
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
return 0;
}
其中:转为GRAY灰度图的方式:gray = R * 0.3 + G * 0.59 + B * 0.11
三、通道的分离和融合
OpenCV采用的是BGR的通道顺序,可以使用通道的分离和融合来进行验证。主要函数:split和merge
#include <opencv2/opencv.hpp>
#include <vector>
#include<iostream>
using namespace std;
int main()
{
cv::Mat img = cv::imread("C:/Users/Opencv/temp/lena.png");
cv::Mat img_array[3];
cv::Mat imgs0, imgs1, imgs2; //用于存放数组类型的结果
cv::split(img, img_array);
imgs0 = img_array[0]; //B
imgs1 = img_array[1]; //G
imgs2 = img_array[2]; //R
cv::Mat zero1 = cv::Mat::zeros(cv::Size(img.cols, img.rows), CV_8UC1);
cv::Mat zero2 = zero1.clone();
vector<cv::Mat> imgsV1;
imgsV1.push_back(imgs0); // B通道放在第一个
imgsV1.push_back(zero1);
imgsV1.push_back(zero2);
cv::Mat imgM1;
cv::merge(imgsV1, imgM1);
cv::imshow("RGB-B通道", imgM1); //显示分离后B通道的像素值
vector<cv::Mat> imgsV2;
imgsV2.push_back(zero1);
imgsV2.push_back(zero2);
imgsV2.push_back(imgs2); // R通道放在最后一个
cv::Mat imgM2;
cv::merge(imgsV2, imgM2);
cv::imshow("RGB-R通道", imgM2); //显示分离后R通道的像素值
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}