OpenCV 找出圖像中最小值最大值函數minMaxLoc的使用


功能:從一個矩陣中找出全局的最大值和最小值。

函數cv::minMaxLoc找出最大和最小元素的值和他們的位置。極值是遍歷整個矩陣找到,或者當掩碼不是一個空矩陣時,是通過遍歷指定矩陣區域找到。

函數不適用於多通道矩陣,如果需要遍歷所有的通道來找到最大和最小值,首先使用函數Mat::reshape轉換為單通道矩陣。或者你可以使用函數 extractImageCOI ,mixChannels , or split 來提取特定通道。

函數原型1:

1 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, 2                             CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0, 3                             CV_OUT Point* maxLoc = 0, InputArray mask = noArray());

參數說明:
參數1 src 輸入單通道矩陣.

參數1 minVal 返回最小值的指針; 如果不需要輸入NULL.

參數 maxVal 返回最大值的指針; 如果不需要輸入NULL.

參數 minLoc 返回最小值位置的指針 (二維情況下); 如果不需要輸入NULL.

參數 maxLoc 返回最大值位置的指針 (二維情況下); 如果不需要輸入NULL.

參數 mask 可選參數,用於選擇一個子矩陣.

參考 max, min, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape

函數原型2:

1 CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0, 2                           int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());

參數說明:
參數1 src 輸入單通道矩陣.

參數1 minVal 返回最小值的指針; 如果不需要輸入NULL.

參數 maxVal 返回最大值的指針; 如果不需要輸入NULL.

參數 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個矩陣, 每個維度里最小元素的坐標按順序存儲.

參數 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.

參數 mask 指定矩陣區域.

注意:
在稀疏矩陣中,最小值是只能在非零元素中找到。

當minIdx 不是NULL的時候,他必須有至少兩個元素(同maxIdx),即使src是一個單行或者單列矩陣。在OpenCV (跟隨MATLAB)中每個矩陣至少要有兩個維度。單列矩陣是Mx1 矩陣(因此 minIdx/maxIdx將是(i1,0)/(i2,0)),單行矩陣是 1xN矩陣(因此minIdx/maxIdx 將是(0,j1)/(0,j2))。

函數原型3:

1 CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal, 2                           double* maxVal, int* minIdx = 0, int* maxIdx = 0);

參數說明:
參數1 a 輸入單通道矩陣.

參數2 minVal 返回最小值的指針; 如果不需要輸入NULL.

參數3 maxVal 返回最大值的指針; 如果不需要輸入NULL.

參數4 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個矩陣, 每個維度里最小元素的坐標按順序存儲.

參數5 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.

代碼示例:

 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3  4 int main()  5 {  6     // std::cout << "Hello World!\n";
 7     cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");  8     cv::Mat image_re = image.reshape(1);  9     double minValue, maxValue;    // 最大值,最小值
10     cv::Point  minIdx, maxIdx;    // 最小值坐標,最大值坐標 
11     cv::minMaxLoc(image_re, &minValue, &maxValue, &minIdx, &maxIdx); 12     std::cout << "最大值:" << maxValue <<"最小值:"<<minValue<<std::endl; 13     std::cout << "最大值位置:" << maxIdx << "最小值位置:" << minIdx; 14    
15     cv::waitKey(0); 16 17 }

運行結果如下

Mat類的函數reshape
功能:不用拷貝數據轉換一個2維矩陣的形狀或通道的個數

函數為這些元素制造了一個新的矩陣頭,新的矩陣可能會有不同的大小或不同的通道數,如果滿足下面條件任何組合都有可能:

沒有額外的元素被包含進去新矩陣,也沒有元素被排除。所以結果的行數、列數、通道數必須在轉換后保持不變。

沒有數據拷貝,也就是說這是個 O(1)操作。因此,如果你改變了行的個數,或者操作以其他方式改變了元素行的指數,矩陣必須是連續的,參考:Mat::isContinuous

例如:假如有一些3維的點的集合存儲在一個STL vector中,你想用一個3xN矩陣表示這些點,按下面這樣做:

1 td::vector<Point3f> vec; 2  ... 3     Mat pointMat = Mat(vec). // convrt vector to Mat, O(1) operation
4                  reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel. 5                                   // Also, an O(1) operation
6                   t(); // finally, transpose the Nx3 matrix. 7                               // This involves copying all the elements

函數原型1:

Mat reshape(int cn, int rows=0) const;
  • 參數說明:

  • 參數1 cn 新通道數.如果參數是0,通道數保持不變.

  • 參數2 rows 新通道行數. 如果參數是0,行數保持不變.

函數原型2:

Mat reshape(int cn, int newndims, const int* newsz) const;

函數原型3:

Mat reshape(int cn, const std::vector<int>& newshape) const;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM