前言
带有透明度的图片,在某些场景下有使用需求,故特意研究了一下如何通过OpenCV实现此目的。
一、RGBA色彩空间
在计算机图形学中,一个RGB色彩空间的图形,是由红、绿、蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息。为实现图形的透明效果,采取在图形文件的处理与存储中附加上另一个8位信息的方法,这个附加的代表图形中各个素点透明度的通道信息就被叫做Alpha通道。
Alpha通道使用8位二进制数,可以表示256级灰度,取值范围是0~255。值为255的Alpha像素用以定义不透明的彩色像素,而值为0的Alpha通道像素用以定义透明像素,介于黑白之间的灰度的Alpha像素用以定义不同程度的半透明像素。
二、使用示例
#include "opencv2/opencv.hpp"
#include <vector>
using namespace cv;
using namespace std;
int main()
{
cv::Mat image = cv::imread("./Datas/test.jpg");
if (image.channels() == 3)
{
cv::cvtColor(image,image,cv::COLOR_BGR2BGRA);
}
else if (image.channels() == 1)
{
cv::cvtColor(image, image, cv::COLOR_GRAY2BGRA);
}
for (int y = 0; y<image.rows; y++)
{
for (int x = 0; x < image.cols; x++)
{
image.at<cv::Vec4b>(y, x)[3] = 50;//设置透明度值
}
}
cv::imwrite("./Datas/transparent.png", image);
return 0;
}
测试结果
原图片
透明图片