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

时间:2017-12-13 08:10:48

标签: c++ opencv

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

2 个答案:

答案 0 :(得分:3)

我认为你不能这样做,至少在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加载矩阵之后拆分矩阵的通道:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.youResourceId);

答案 1 :(得分:3)

OpenCV不提供任何方法来仅加载特定频道。但是,您有几个选择。

加载为彩色图像并提取您需要的频道

cv::Mat3b img("path/to/image", cv::IMREAD_COLOR);
cv::Mat1b blue;
cv::extractChannel(img, blue, 0);

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

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

// 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提高速度:

// Preprocessing
...
matwrite("some/other/name", blue);

// Processing
cv::Mat1b blue = matread("path/to/image");