我需要读取大量具有高速要求的图像,只需要处理彩色图像的蓝色通道。
如果我用cv::imread(imgName, CV_LOAD_IMAGE_COLOR);
读取图像这将是非常长的时间,所以我想只读取一个彩色图像通道。怎么做 ???非常感谢!!
答案 0 :(得分:3)
我认为你不能这样做,至少在OpenCV上是这样。如果您查看cv::imread
的文档,您将看到没有选项只能读取一个颜色通道:
如果需要,可以在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");