赞
踩
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。