当前位置:   article > 正文

OpenCV4(C++) —— 图像数据类型转换和颜色模型转换_opencvc++格式转换函数

opencvc++格式转换函数


一、图像数据类型转换

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注:因为是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和代码中自动导出通道数
  • 1
  • 2
  • 3

代码如下(示例):

#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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

其中:转为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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/742839
推荐阅读
相关标签
  

闽ICP备14008679号