文章目录
- 一、图像数据类型转换
- 二、颜色模型转换
- 三、通道的分离和融合
一、图像数据类型转换
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]; //Bimgs1 = img_array[1]; //Gimgs2 = img_array[2]; //Rcv::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;
}