OpenCV 找出圖像中最小值最大值函數(shù)minMaxLoc的使用
功能:從一個(gè)矩陣中找出全局的最大值和最小值。
函數(shù)cv::minMaxLoc找出最大和最小元素的值和他們的位置。極值是遍歷整個(gè)矩陣找到,或者當(dāng)掩碼不是一個(gè)空矩陣時(shí),是通過遍歷指定矩陣區(qū)域找到。
函數(shù)不適用于多通道矩陣,如果需要遍歷所有的通道來找到最大和最小值,首先使用函數(shù)Mat::reshape轉(zhuǎn)換為單通道矩陣。或者你可以使用函數(shù) extractImageCOI ,mixChannels , or split 來提取特定通道。
1 函數(shù)解析
1.1 函數(shù)原型1
CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
參數(shù)說明:
參數(shù)1:InputArray類型的src,輸入單通道數(shù)組(圖像)。
參數(shù)2:double*類型的minVal,返回最小值的指針。若無須返回,此值置為NULL。
參數(shù)3:double*類型的maxVal,返回最大值的指針。若無須返回,此值置為NULL。
參數(shù)4:Point*類型的minLoc,返回最小位置的指針(二維情況下)。若無須返回,此值置為NULL。
參數(shù)5:Point*類型的maxLoc,返回最大位置的指針(二維情況下)。若無須返回,此值置為NULL。
參數(shù)6:InputArray類型的mask,用于選擇子陣列的可選掩膜。
1.2 函數(shù)原型2
CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0,
int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());
參數(shù)說明:
參數(shù)1 src 輸入單通道矩陣.
參數(shù)1 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數(shù) maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數(shù) minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個(gè)矩陣, 每個(gè)維度里最小元素的坐標(biāo)按順序存儲(chǔ).
參數(shù) maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
參數(shù) mask 指定矩陣區(qū)域.
注意:
在稀疏矩陣中,最小值是只能在非零元素中找到。
當(dāng)minIdx 不是NULL的時(shí)候,他必須有至少兩個(gè)元素(同maxIdx),即使src是一個(gè)單行或者單列矩陣。在OpenCV (跟隨MATLAB)中每個(gè)矩陣至少要有兩個(gè)維度。單列矩陣是Mx1 矩陣(因此 minIdx/maxIdx將是(i1,0)/(i2,0)),單行矩陣是 1xN矩陣(因此minIdx/maxIdx 將是(0,j1)/(0,j2))。
1.2 函數(shù)原型3
CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal,
double* maxVal, int* minIdx = 0, int* maxIdx = 0);
參數(shù)說明:
參數(shù)1 a 輸入單通道矩陣.
參數(shù)2 minVal 返回最小值的指針; 如果不需要輸入NULL.
參數(shù)3 maxVal 返回最大值的指針; 如果不需要輸入NULL.
參數(shù)4 minIdx 返回最小值位置的指針 ((n維情況下); 如果不需要輸入NULL. 否則,它必須指向src.dims元素的一個(gè)矩陣, 每個(gè)維度里最小元素的坐標(biāo)按順序存儲(chǔ).
參數(shù)5 maxIdx 返回最大值位置的指針 ((n維情況下); 如果不需要輸入NULL.
2 示例
對(duì)"lena.png"圖像進(jìn)行三通道分離,
找出每個(gè)通道顏色的最小值和最大值文章來源:http://www.zghlxwxcb.cn/news/detail-714543.html
#include<opencv.hpp>
#include<iostream>
#include<string>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("lena.png");
imshow("src", src);
//通道分離
vector<Mat>images;
split(src, images);
//計(jì)算各通道直方圖,并進(jìn)行統(tǒng)計(jì)
//https://www.cnblogs.com/bjxqmy/p/12378312.html
vector<Mat>bgr(3);
int channels[] = { 0,1,2 };
int histsize[] = { 10,10,10 };
float r[] = { 0,255 };
const float* ranges[] = { r,r,r };
Scalar colors[] = { Scalar(255,0,0),Scalar(0,255,0),Scalar(0,0,255) };
string names[] = { "藍(lán)色通道","綠色通道","紅色通道" };
for (int i = 0; i < 3; i++) {
calcHist(&src, 3, &channels[i], Mat(), bgr[i], 1, &histsize[i], &ranges[i], true);
normalize(bgr[i], bgr[i], 1, 0, NORM_L1);//https://www.cnblogs.com/bjxqmy/p/12292421.html
double mx, mn; Point pmx, pmn;
minMaxLoc(bgr[i], &mn, &mx, &pmn, &pmx);
double width = 255.0 / histsize[i];
cout << names[i] << endl;
cout << "數(shù)量最少的顏色范圍:[" << pmn.y * width << "," << (pmn.y + 1) * width << "] 占比:" << mn * 100 << "%" << endl;
cout << "數(shù)量最多的顏色范圍:[" << pmx.y * width << "," << (pmx.y + 1) * width << "] 占比:" << mx * 100 << "%" << endl;
cout << endl;
imshow(names[i], images[i]);
}
waitKey(0);
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-714543.html
到了這里,關(guān)于OpenCV minMaxLoc()函數(shù)找出圖像中最小值最大值的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!