【问题标题】:Maximum single channel cv::Mat from multi channel cv::Mat来自多通道 cv::Mat 的最大单通道 cv::Mat
【发布时间】:2014-06-01 20:53:29
【问题描述】:

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

【问题讨论】:

  • 看看docs.opencv.org/modules/core/doc/… 但你必须先转换宽度高度3通道元素高度*通道矩阵
  • 我该如何进行转换,你能更明确一点吗?我喜欢 Mat::reshape(),但在这种情况下,矩阵必须满足 Mat::IsCountinuous()。

标签: c++ opencv


【解决方案1】:

您可以使用cv::reduce()Mat::reshape() 完成此操作。关键是将m1 重塑为单通道图像,其中一行的每个元素代表一个颜色分量。您可以通过m1.reshape(1, m1.total()) 执行此操作。然后应用reduce() 将给出一个包含最大分量值的Mat,然后将结果重塑为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

【讨论】:

  • 我同意您的回答,我可以将其应用于我的问题,但正如我之前所说并根据 OpenCV 文档 m.reshape(x,y) 只能在 m.IsContinuous() 时应用返回真。在那种情况下有什么答案吗?
  • 编写自己的解决方案?这不是一个很难解决的问题。
猜你喜欢
  • 2012-09-02
  • 2016-06-11
  • 1970-01-01
  • 2014-06-21
  • 2013-06-26
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多