【OpenCV3】如何给图像添加(不)透明度通道

透明度通道,又叫alpha通道,做用于记录图像的透明度信息。具体参照【百度百科】“alpha通道”中的介绍。透明度确切的说应该叫不透明度(Opacity),取最小值0时,表示完全透明;取最大值255时,表示完全不透明;取值越大表示越不透明。通常遇到的图像如bmp图像、jpg图像都是单通道(灰度图)、RGB三通道(彩色)图像,而没有透明度通道,那么如何使用opencv给没有透明度通道的图像添加透明度,形成具有透明度通道(四通道)的图像呢。

这里封装了一个简单的函数,如下:

int addAlpha(cv::Mat& src, cv::Mat& dst, cv::Mat& alpha)
{
	if (src.channels() == 4)
	{
		return -1;
	}
	else if (src.channels() == 1)
	{
		cv::cvtColor(src, src, cv::COLOR_GRAY2RGB);
	}
	
	dst = cv::Mat(src.rows, src.cols, CV_8UC4);

	std::vector<cv::Mat> srcChannels;
	std::vector<cv::Mat> dstChannels;
	//分离通道
	cv::split(src, srcChannels);

	dstChannels.push_back(srcChannels[0]);
	dstChannels.push_back(srcChannels[1]);
	dstChannels.push_back(srcChannels[2]);
	//添加透明度通道
	dstChannels.push_back(alpha);
	//合并通道
	cv::merge(dstChannels, dst);

	return 0;
}

另一个问题就是如何生成透明度,这个可根据实际的需要来定,为了方便起见,这里将透明度和灰度关联,灰度阶越高,约透明(alpha值越小)。代码如下:

cv::Mat createAlpha(cv::Mat& src)
{
	cv::Mat alpha = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);
	cv::Mat gray = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);

	cv::cvtColor(src, gray, cv::COLOR_RGB2GRAY);

	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			alpha.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j);
		}
	}

	return alpha;
}

最后是测试代码:

int main()
{
	cv::Mat src = cv::imread("car.jpg", 1);
	cv::Mat dst;
	cv::Mat alpha = createAlpha(src);

	addAlpha(src, dst, alpha);

	cv::imshow("src", src);
	cv::imshow("dst", dst);
	cv::imwrite("car.png", dst);
	cv::waitKey(0);
	return 0;
}

注:保存具有透明度的图像,一般采用png格式。

结果如下:


参考:1、https://baike.baidu.com/item/alpha%E9%80%9A%E9%81%93/3163191?fr=aladdin

2018.05.03

猜你喜欢

转载自blog.csdn.net/guduruyu/article/details/80184893
今日推荐