opencv4. C++ 将所有channels和type的图片转换为3通道16位图像,给出具体完整的实现函数
时间: 2024-09-18 12:17:42 浏览: 83
在OpenCV 4中,将单通道或多通道图像转换为3通道16位(通常指`CV_16UC3`)可以使用`cvtColor()`函数以及`Mat`的数据类型操作。假设我们有一个灰度图像或者多通道图像需要转换,这里是一个示例函数:
```cpp
#include <opencv2/opencv.hpp>
cv::Mat convertToThreeChannel16bit(const cv::Mat& inputImage, int srcChannels = -1)
{
// 检查输入图像是否已经是3通道16位
if (inputImage.channels() == 3 && inputImage.depth() == CV_16U) {
return inputImage; // 如果已经是,直接返回
}
// 如果源通道数未指定,默认推断(对于灰度图或BGR图像)
if (srcChannels == -1) {
srcChannels = inputImage.channels();
}
// 创建一个新的3通道16位矩阵,大小和原图相同
cv::Mat output(inputImage.size(), CV_16UC3);
// 对于灰度图像(单通道),复制到每个通道
if (srcChannels == 1) {
for (int i = 0; i < inputImage.rows; ++i) {
const uchar* rowInput = inputImage.ptr<uchar>(i);
uchar* rowOutput = output.ptr<uchar>(i);
std::copy(rowInput, rowInput + inputImage.cols, rowOutput);
}
} else if (srcChannels == 3) { // 多通道,如BGR
for (int y = 0; y < inputImage.rows; ++y) {
for (int x = 0; x < inputImage.cols; ++x) {
uchar* pixel = inputImage.ptr<cv::Vec3b>(y, x); // 提取像素
*output.ptr<cv::Vec3b>(y, x) = cv::Vec3b(pixel[2], pixel[1], pixel[0]); // BGR -> RGB
}
}
}
return output;
}
// 使用示例
cv::Mat grayImage;
grayImage.convertTo(output, CV_16UC3); // 灰度图转16位RGB
cv::Mat bgrImage;
convertToThreeChannel16bit(bgrImage); // BGR图像不需要额外指定通道
阅读全文