首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用C++从opencv中的磁盘中读取图像颜色的一个通道

如何用C++从opencv中的磁盘中读取图像颜色的一个通道
EN

Stack Overflow用户
提问于 2017-12-13 08:10:48
回答 2查看 3.8K关注 0票数 0

我需要阅读大量的图像和高速要求,只需要处理蓝色通道的彩色图像。如果我用cv::imread(imgName, CV_LOAD_IMAGE_COLOR);读取图像会很长时间,所以我只想读取一个彩色图像通道。怎么做?非常感谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-13 08:48:16

OpenCV不提供只加载特定通道的任何方法。然而,你有几个选择。

加载为彩色图像并提取所需的通道。

代码语言:javascript
复制
cv::Mat3b img("path/to/image", cv::IMREAD_COLOR);
cv::Mat1b blue;
cv::extractChannel(img, blue, 0);

这比使用split方法要快一些,但是仍然需要加载彩色图像。

在预处理阶段,加载所有图像(可以使用glob检索文件夹中的所有图像),提取蓝色通道并将其存储为灰度。然后,您可以加载图像为灰度。

代码语言:javascript
复制
// Preprocessing

cv::String folder = "your_folder_with_images/*.jpg";
std::vector<cv::String> filenames;
cv::glob(folder, filenames);

for (size_t i = 0; i < std::filenames.size(); ++i)
{
    cv::Mat3b img = cv::imread(filenames[i], cv::IMREAD_COLOR);
    cv::Mat1b blue;
    cv::extractChannel(img, blue, 0);
    cv::imwrite("some/other/name", blue);
}

// Processing

cv::Mat1b blue = imread("path/to/image", cv::IMREAD_UNCHANGED);

你可以通过saving / loading the image in binary format提高速度

代码语言:javascript
复制
// Preprocessing
...
matwrite("some/other/name", blue);

// Processing
cv::Mat1b blue = matread("path/to/image");
票数 5
EN

Stack Overflow用户

发布于 2017-12-13 08:13:56

我认为你不能这样做,至少用OpenCV。如果您查看cv::imread的文档,您将发现没有选择只读取一个颜色通道:

  • 如果设置为IMREAD_UNCHANGED:,则按原样返回加载的图像(使用alpha通道,否则将被裁剪)。
  • 如果设置为IMREAD_GRAYSCALE:,则始终将图像转换为单通道灰度图像。
  • 如果设置为IMREAD_COLOR:,则始终将图像转换为3通道BGR彩色图像。
  • 如果设置为IMREAD_ANYDEPTH:,则在输入具有相应深度时返回16位/32位图像,否则将其转换为8位。
  • 如果设置为IMREAD_ANYCOLOR:,图像将以任何可能的颜色格式读取。
  • 如果设置了IMREAD_LOAD_GDAL:,请使用gdal驱动程序加载图像。
  • IMREAD_REDUCED_GRAYSCALE_2:设置时,始终将图像转换为单通道灰度图像,图像大小减小1/2。
  • IMREAD_REDUCED_COLOR_2:设置时,始终将图像转换为3通道BGR彩色图像,图像大小减小1/2。
  • IMREAD_REDUCED_GRAYSCALE_4:设置时,始终将图像转换为单通道灰度图像,图像大小减小1/4。
  • IMREAD_REDUCED_COLOR_4:设置时,始终将图像转换为3通道BGR彩色图像,图像大小减小1/4。
  • IMREAD_REDUCED_GRAYSCALE_8:设置时,始终将图像转换为单通道灰度图像,图像大小减小1/8。
  • IMREAD_REDUCED_COLOR_8:设置时,始终将图像转换为3通道BGR彩色图像,图像大小减小1/8。
  • 如果设置为IMREAD_IGNORE_ORIENTATION:,请不要根据EXIF的方向标志旋转图像。

如果需要,可以在加载矩阵后将其拆分为Mat::split

代码语言:javascript
复制
Mat src = imread("img.png",CV_LOAD_IMAGE_COLOR); //load  image

Mat bgr[3];   //destination array
split(src,bgr);//split source  

//Note: OpenCV uses BGR color order
imwrite("blue.png",bgr[0]); //blue channel
imwrite("green.png",bgr[1]); //green channel
imwrite("red.png",bgr[2]); //red channel
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47788287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档