C++ OpenCV學習之圖像像素值統計
opencv知識點:
圖像像素最小/最大值 – minMaxLoc
圖像像素均值/標準差 – meanStdDev
本課所解決的問題:
如何獲取圖像像素的最小/最大值?
如何獲取圖像像素的均值/標準差?
通過圖像像素統計值我們能幹什麼?
1.常用的像素值統計
在圖像分析的時候,我們經常需要對單通道圖像的像素進行統計,以下4種是比較常用的
最小值(min)
最大值(max)
平均值(mean)
標準差(standard deviation)
要求這4種統計,我們就要用到以下兩個API
- minMaxLoc
- meanStdDev
這兩個API非常有用,日後有很多地方用得到
2.像素值統計計算
接下來,我們來應用兩個API,求取4種像素值統計
首先是最小值,最大值
//函數定義 void pixel_statistics_demo(Mat& image); //函數實現 void QuickDemo::pixel_statistics_demo(Mat& image) { double minv, maxv; Point minLoc, maxLoc; std::vector<Mat> mvt; split(image, mvt); /* minMaxLoc 求取單通道圖像像素的最小值,最大值 共6個參數 第1個參數 輸入單通道圖像 第2個參數 輸出最小值 第3個參數 輸出最大值 第4個參數 輸出最小值點的坐標 第5個參數 輸出最大值點的坐標 第6個參數 輸入圖像的子數組(有時候我們會求取ROI區域的最小/最大值,就會傳入mask圖像) (這裡的子數組,是一種圖像掩模,可以實現加東西/扣東西) */ for (int i = 0; i < mvt.size(); i++) { minMaxLoc(mvt[i], &minv, &maxv, &minLoc, &maxLoc); std::cout << "通道:" << i << " 最小值:" << minv << " 最大值:" << maxv << std::endl; } }
然後是,平均值和標準差
void QuickDemo::pixel_statistics_demo(Mat& image) { Mat mean, stddev; meanStdDev(image, mean, stddev); /* meanStdDev 求取平均值,標準差 共4個參數 第1個參數 輸入 第2個參數 輸出圖像像素的平均值,每個通道都會輸出一個 第3個參數 輸出圖像像素的標準差,每個通道都會輸出一個 第4個參數 輸入圖像的子數組(有時候我們會求取ROI區域的平均值/標準差,就會傳入mask圖像) (這裡的子數組,是一種圖像掩模,可以實現加東西/扣東西) */ std::cout << "平均值" << std::endl << mean << std::endl; std::cout << "標準差" << std::endl<<stddev << std::endl; }
上圖中,輸出平均值和標準差,是把所有通道的都輸出瞭,那如果怎麼輸出單通道的呢?
很簡單,隻要用到Mat::at
//opencv為瞭保證精度,平均值,標準差矩陣的數據類型是double類型 std::cout<<"平均值"<< mean.at<double>(0, 0)<<std::endl; std::cout << "標準差" << stddev.at<double>(0, 0) << std::endl;
3.圖像統計值分析
這裡簡單提一下圖像分析的事情
圖像的平均值和標準差會給我們帶來一定的信息
比如:當平均值恒定,標準差很小時,我們可以想到是基本純色的圖片,也就是低對比度的圖
在圖像分析的時候,我們關註圖像的有效信息,也就是ROI區域。
通過圖像像素的統計值,我們就可以對圖像的有效信息作出判斷。
比如,當圖像標準差很小時,圖像所攜帶的有效信息會很少,我們就要對圖像進行篩選,通過一些手段過濾掉一些東西。
本課所用API查閱
1.minMaxLoc
2.meanStdDev
3.Mat::at
雖然有12種重載,但隻有6種傳參方式
1.單維度坐標——i0:沿維度 0 的索引
2.雙維度坐標——row 沿維度 0 的索引 ;col 沿維度 1 的索引
3.三維度坐標——i0 沿維度 0 的索引;i1 沿維度 1 的索引;i2 沿維度 2 的索引
4.維度數組坐標——int數組
5.維度數組坐標——vector數組
6.點的坐標——point類
以上就是C++ OpenCV學習之圖像像素值統計的詳細內容,更多關於OpenCV像素值統計的資料請關註WalkonNet其它相關文章!