使用opencv为没有透明通道的图像加入透明通道

  在图像处理中,我们经常需要处理带透明通道的图片,比如为图片或视频添加水印,为图片或视频添加字幕、贴图等。然而,我们的素材图片未必总是带有透明通道。比如,素材的背景本该透明的地方,却是黑色和白色。有时,我们甚至需要让素材本身有图像的部分半透明。接下来,我将介绍两个方法,一种是使用opencv内置方法,另一种是自己写代码,来为图像添加透明通道。

  1.首先,是opencv中的cvtColor方法。

C++void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );

  参数解释:
  . InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
  . OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
  . int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将
  . int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定

  我们可以令code参数为COLOR_BGRABGRA,将图像转化为带透明通道的图片。这里要注意,加上的透明通道,默认值为255,也就是说,默认将图像转换为不透明图。如果需要对图像的透明度进行调整,则还需要另写代码。下面是部分代码,来验证默认值确实为255。

  

1 std::string path = "E:/140.jpg"; 2 Mat image = cv::imread(image_path); 3 std::cout << "原图像通道数: " << image.channels() << std::endl; 4 cvtColor(image, image, COLOR_BGR2BGRA); 5 std::cout << "转换后图像通道数: " << image.channels() << std::endl; 6 for (int i = 0; i < image.rows; i++) { 7 for (int j = 0; j < image.cols; j++) { 8 std::cout<<(int)image.at<Vec4b>(i, j)[3]<<std::endl; 9 } 10 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpygjf.html