c++ - 多 channel cv::Mat 的最大单 channel cv::Mat

标签 c++ opencv

我通过 C++ 接口(interface)使用 opencv。我有一个代表多 channel 图像的cv::Mat m1,我需要从中获取单 channel 图像m2,其中像素的值为所有 channel 中的最大值m1 中相应像素的值(m1 中的一个像素有多个值,每个 channel 一个)。有人知道从m1获取m2的最有效方法吗?

最佳答案

您可以使用 cv::reduce()Mat::reshape() 来完成此操作。关键是将 m1 reshape 为单 channel 图像,其中行的每个元素代表一个颜色分量。您可以通过 m1.reshape(1, m1.total()) 来完成此操作。然后应用reduce()将得到一个包含最大分量值的Mat,然后将结果 reshape 为m1<的形状就很简单了。一个简单的例子如下:

uchar data[] = {1,2,3, 3,1,2, 2,1,3, 3,2,1};
cv::Mat m1(2,2, CV_8UC3, data); // Maximum component value is 3 for all pixels
cv::Mat m2;
cv::reduce(m1.reshape(1, m1.total()), m2, 1, CV_REDUCE_MAX);
m2 = m2.reshape(0, m1.cols); // 2x2 Mat, all elements are 3

关于c++ - 多 channel cv::Mat 的最大单 channel cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135608/

相关文章:

c++ - 在 iOS 上使用 OpenCV 文件存储

opencv - 如何在 Qt 项目中静态链接 OpenCV

c++ - Memcpy 可读范围

c++ - 使用 Qt (Ubuntu 14.04) 编译 qt-dab 时出错

c++ - 发布顺序的概念在实践中有用吗?

c++ - 如何更新此神经网络以使用图像像素数据

python - OpenCV 视频写入会大幅降低 FPS。如何优化性能?

c++ - ARM GCC 交叉编译器 fedora 22

c++ - 寻找广泛使用(大部分使用)设计模式的项目

opencv - drawContours 奇怪的行为?