- 图像通道
- 图像分割split
- 图像合并merge
- 图像掩模
图像通道
日常使用的图像多为彩色图,彩色图像是多通道图像,分别为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);