OpenCV(5).图像通道,分割,合并与掩膜

2,087 阅读2分钟
  1. 图像通道
  2. 图像分割split
  3. 图像合并merge
  4. 图像掩模

图像通道

日常使用的图像多为彩色图,彩色图像是多通道图像,分别为RGB通道
  • 如果要获取彩色图像的单个通道图像,可以使用split函数     
  • 将图像矩阵合并到另外一张图像上,可使用merge函数
api:split()与merge()方法是一对互逆操作,
split是对图像进行通道分离,merge()是进行通道合并
灰度图像只有1个通道,一般RGB能分离出3个通道,RGBA图像能分离出4个通道 (如.png格式图像)

void split(const Mat& src, Mat* mvbegin);
void split(InputArray m, OutputArrayOfArrays mv);
void merge(const Mat* mv, size_t count, OutputArray dst)
void merge(InputArrayOfArrays mv, OutputArray dst)
split方法将图像分割成多个通道
参数:
count 要合并的通道数
剩余参数都是Mat类型

例子:
    //彩色图像分割
    Mat imgSplits[3];
    split(img, imgSplits);
    imshow("img", img);
    imshow("B", imgSplits[0]);
    imshow("G", imgSplits[1]);
    imshow("R", imgSplits[2]);  

原图 BRG三通道图

  • 从图中可以看出R通道的人脸图像亮度特别明显,是因为人脸在原图中是偏红色,所以在红色通道中值比较大
Alpha通道
  • 具有alpha通道的图像,除了有三个彩色通道外还有一个表示像素透明度的通道,即alpha通道。
  • alpha通道像素的值在0到255之间,这个值定义了当叠加在另一个像素上时如何处理该像素。
  • 0表示该像素完全透明,255表示该像素完全不透明,其他值表示的透明程度介于(0~255)之间
    //原图方式加载图像(保留alpha通道)
    img = imread(path, IMREAD_UNCHANGED);
    //Mat img = imread(path);       //默认加载只有三通道
    cout << img.size() << endl;
    //图像拥有的通道数
    cout << img.channels() << endl;
    imshow("png", img);
    //png图像4通道图像分割
    Mat pngSplits[4];
    split(img, pngSplits);
    //将前三个通道合并为彩色图像
    Mat bgrMat;
    merge(pngSplits, 3, bgrMat);
    imshow("bgrMat", bgrMat);
    //最后一个通道为alpha通道图像
    imshow("alpha", pngSplits[3]);

原图与alpha通道图

下图描绘了一个一般的RGB图形在opencv的Mat中像素数据存储结构以及通道分离/合并操作关系

图像掩模     
    imshow("img", img);
    //根据图像性质生成掩膜
    Mat musk3;
    //特征提取,提取img原图中 B通道(0-100),G通道(0-100),R通道(150-255)特征值,然后生成新的图像
    inRange(img, Scalar(0, 0, 150), Scalar(100, 100, 255), musk3);
    imshow("musk3", musk3);