我需要阅读大量的图像和高速要求,只需要处理蓝色通道的彩色图像。如果我用cv::imread(imgName, CV_LOAD_IMAGE_COLOR);读取图像会很长时间,所以我只想读取一个彩色图像通道。怎么做?非常感谢!!
发布于 2017-12-13 08:48:16
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");发布于 2017-12-13 08:13:56
我认为你不能这样做,至少用OpenCV。如果您查看cv::imread的文档,您将发现没有选择只读取一个颜色通道:
如果需要,可以在加载矩阵后将其拆分为Mat::split。
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 channelhttps://stackoverflow.com/questions/47788287
复制相似问题