【发布时间】:2014-03-04 13:59:57
【问题描述】:
我有一张图片,它有 4 个通道,格式为 4 * UINT8。
我正在尝试将其转换为 3 通道浮点数,并且我正在使用此代码:
images.convertTo(images,CV_32FC3,1/255.0);
转换后,图像为浮点格式,但仍有 4 个通道。如何摆脱 OpenCV 中的第 4 个(alpha)通道?
【问题讨论】:
标签: c++ opencv alpha-transparency
我有一张图片,它有 4 个通道,格式为 4 * UINT8。
我正在尝试将其转换为 3 通道浮点数,并且我正在使用此代码:
images.convertTo(images,CV_32FC3,1/255.0);
转换后,图像为浮点格式,但仍有 4 个通道。如何摆脱 OpenCV 中的第 4 个(alpha)通道?
【问题讨论】:
标签: c++ opencv alpha-transparency
正如@AldurDisciple 所说,Mat::convertTo() 旨在用于更改Mat 的数据类型,而不是用于更改通道数。
要解决,你应该把它分成两个步骤:
cvtColor(image, image, CV_BGRA2BGR); // 1. change the number of channels
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale
【讨论】:
1/255.0 是什么?对什么有用?
1/255.0 这里是比例因子,它将值 [0, 255] 转换为 [0, 1]。有关详细信息,请参阅Mat::convertTo() 的文档。
函数convertTo 专门用于更改Mat 的数据类型。正如文档 (link) 中提到的,输出图像的通道数始终与输入图像相同。
如果你想改变数据类型和减少通道数,你应该使用split、merge和convertTo的组合:
cv::Mat img_8UC4;
cv::Mat chans[4];
cv::split(img_8UC4,chans);
cv::Mat img_8UC3;
cv::merge(chans,3,img_8UC3);
cv::Mat img_32FC3;
img_8UC3.convertTo(img_32FC3);
另一种方法可能是自己重新编码算法,这很容易而且可能更有效。
【讨论】:
OpenCV 的 cvtColor function 允许您转换 Mat 的类型和通道数。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
所以这样的事情会将彩色 4 通道转换为彩色 3 通道:
cvtColor(image, image, CV_BGRA2BGR, 3);
或者使用mixChannels function 可能更有效,如果您查看文档,其示例显示了如何拆分通道。
那如果你真的想改成特定的类型:
image.convertTo(image,CV_32F);
【讨论】: