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

0 c++ opencv

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

Mik*_*iki 5

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


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

cv::Mat3b img("path/to/image", cv::IMREAD_COLOR);
cv::Mat1b blue;
cv::extractChannel(img, blue, 0);
Run Code Online (Sandbox Code Playgroud)

这比使用该方法要快一点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);
Run Code Online (Sandbox Code Playgroud)

您可以通过以二进制格式保存/加载图像来提高速度:

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

// Processing
cv::Mat1b blue = matread("path/to/image");
Run Code Online (Sandbox Code Playgroud)