关于C#:来自多通道cv :: Mat的最大单通道cv :: Mat

Maximum single channel cv::Mat from multi channel cv::Mat

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


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

1
2
3
4
5
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