我有一张图片,它有4个通道并且是以4 * UINT8
格式存储的。
我想要将它转换成3通道的浮点型数据,我正在使用以下代码:
images.convertTo(images,CV_32FC3,1/255.0);
转换后,图片变成了浮点格式,但仍然有4个通道。如何在OpenCV中去除第四个(alpha)通道?
我有一张图片,它有4个通道并且是以4 * UINT8
格式存储的。
我想要将它转换成3通道的浮点型数据,我正在使用以下代码:
images.convertTo(images,CV_32FC3,1/255.0);
转换后,图片变成了浮点格式,但仍然有4个通道。如何在OpenCV中去除第四个(alpha)通道?
就像 @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
convertTo
的作用是专门用于更改Mat
的数据类型。根据文档(链接)中所述,输出图像的通道数始终与输入图像相同。如果您想要更改数据类型并减少通道数,则应使用split
、merge
和convertTo
的组合。请注意保留HTML标签。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函数允许您转换Mat的类型和通道数量。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
这样做可以将一个有色的4通道转换为有色的3通道:
cvtColor(image, image, CV_BGRA2BGR, 3)
;
或者更有效的方法可能是使用mixChannels函数,如果您查看文档,它的示例显示了如何拆分通道。
然后,如果您真的想将其更改为特定类型:
image.convertTo(image,CV_32F);
1/255.0
是什么意思?它有什么用处? - user45843331/255.0
是一个比例因子,它将把取值范围在[0, 255]
的数转换到[0, 1]
。请查看Mat::convertTo()
的文档了解更多详情。 - herohuyongtao