OpenCV - 图片增加透明通道,图片合并透明通道

1 为图像增加透明通道

一般人像抠图相关的AI模型会输出一个Mask图,这个Mask图就是我们需要的可以将人物抠出来的Alpha通道信息,我们需要将这个Mask图附加到原始图片上,从BGR图片转成BGRA图片或者从RGB图片转成RGBA图片。

如果使用OpenCV进行图像处理,在为图像增加透明通道时会使用到cv::splitcv::merge方法,先使用cv::split方法分离原始图片各个通道,然后将Mask加入到原始通道中,最后使用cv::merge合成新的通道生成最后的图片。

示例代码如下

#include "opencv2/opencv.hpp"

cv::Mat MergeAlpha(const cv::Mat& src_image, const cv::Mat& alpha_image)
{
	std::vector<cv::Mat> channels;
	cv::split(src_image, channels);
	channels.push_back(alpha_image);
	cv::Mat src_alpha;
	cv::merge(channels, src_alpha);
	return src_alpha;
}

需要注意的是,Mask图片必须与原始图片具有相同的分辨率大小和相同的数据类型,比如原始图片是1920x1080,CV_8UC3的图片,那么Mask图片必须是1920x1080,CV_8UC1的图片。

如果你的OpenCV是编译了CUDA,还可以将上述代码修改成CUDA版本

cv::Mat MergeAlphaCUDA(const cv::Mat& src_image, const cv::Mat& alpha_image)
{
	cv::cuda::GpuMat src_image_gpu;
	src_image_gpu.upload(src_image);

	cv::cuda::GpuMat alpha_image_gpu;
	alpha_image_gpu.upload(alpha_image);

	std::vector<cv::cuda::GpuMat> channels;
	cv::cuda::split(src_image_gpu, channels);
	channels.push_back(alpha_image_gpu);
	cv::cuda::GpuMat src_alpha_gpu;
	cv::cuda::merge(channels, src_alpha_gpu);

	cv::Mat result;
	src_alpha_gpu.download(result);

	src_image_gpu.release();
	alpha_image_gpu.release();
	src_alpha_gpu.release();

	for (int i = 0; i < channels.size(); ++i)
	{
		channels[i].release();
	}

	return result;
}

按理来说,使用OpenCV的CUDA版本进行计算相比CPU会快很多,但是经过我对上面CPU和CUDA版本的运行时间的测试,发现最终处理的时间是差不多的,我分析这个原因是在使用CUDA版本时,需要将cpu上的图片使用upload方法从内存传递到显存中,计算完成还需要将最终的结果图片通过download方法从显存传递到内存中,如果图片比较大,这种HostToDevice和DeviceToHost是比较耗时的。

参考链接

有兴趣可以访问我的个人站:https://www.stubbornhuang.com/

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV中旋转图片并保持透明度可以通过以下几个步骤实现: 1. 读取图片并加载为4通道的BGRA格式:首先使用`cv2.imread()`函数读取图片,并使用`cv2.IMREAD_UNCHANGED`参数加载为原始的4通道BGRA格式。 2. 创建旋转矩阵:使用`cv2.getRotationMatrix2D()`函数创建一个旋转矩阵,该矩阵用于定义旋转角度、缩放因子和旋转中心。例如,可以设置旋转角度为45度,缩放因子为1.0,并将旋转中心设置为图像的中心。 3. 透明通道分离:将加载的图像分离为颜色通道透明通道,其中颜色通道通过`img[:, :, :3]`获取,透明通道通过`img[:, :, 3]`获取。 4. 进行旋转操作:使用`cv2.warpAffine()`函数进行旋转操作,将颜色通道透明通道分别进行旋转。 5. 合并颜色通道透明通道:使用`cv2.merge()`函数将旋转后的颜色通道透明通道合并为一个图像。 6. 显示旋转后的图片:使用`cv2.imshow()`函数显示旋转后的图片。 下面是一个示例代码: ```python import cv2 # 读取原始图像 img = cv2.imread('example.png', cv2.IMREAD_UNCHANGED) # 创建旋转矩阵 angle = 45 scale = 1.0 center = (img.shape[1] // 2, img.shape[0] // 2) matrix = cv2.getRotationMatrix2D(center, angle, scale) # 分离透明通道 color_channels = img[:, :, :3] alpha_channel = img[:, :, 3] # 进行旋转操作 rotated_color_channels = cv2.warpAffine(color_channels, matrix, (img.shape[1], img.shape[0])) rotated_alpha_channel = cv2.warpAffine(alpha_channel, matrix, (img.shape[1], img.shape[0])) # 合并颜色通道透明通道 rotated_img = cv2.merge((rotated_color_channels, rotated_alpha_channel)) # 显示旋转后的图片 cv2.imshow("Rotated Image", rotated_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 通过以上步骤,您就可以在OpenCV中旋转带有透明度的图片并保持其透明度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值