2014-04-17 116 views
2

我使用的OpenCV通過C++接口。我有一個cv::Mat m1表示的多通道的圖像,從中我需要獲得一個單一的通道圖像m2其中像素具有如圖值在m1對應的像素的所有值中的最大值(在m1的像素具有多個值,一個用於每個頻道)。有沒有人知道從m1獲得m2的最有效方法?最大單通道CV ::墊從多通道CV ::墊

+1

看看http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#void%20reduce%28InputArray%20src,%20OutputArray%20dst,%20int %20dim,%20int%20rtype,%20int%20dtype%29,但你必須寬*高3通道元素轉換成寬*高*信道矩陣第一 – Micka

+0

怎樣才能做轉換,你能更明確?我可以使用Mat :: reshape(),但是在這種情況下矩陣必須滿足Mat :: IsCountinuous()。 –

回答

2

可以使用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 
+0

我同意你的答案,我可以把它應用到我的問題,但正如我之前所說,並根據OpenCV的文檔m.reshape(X,Y)只能應用在m.IsContinuous()返回true。在這種情況下的任何答案? –

+0

寫你自己的解決方案?這不是一個難以解決的問題。 – Aurelius