opencv實現(xiàn)像素統(tǒng)計的示例代碼
在 OpenCV 中,統(tǒng)計圖像的像素信息(如像素值分布、最大值、最小值、均值等)是常見的操作。以下是一些常用的方法和函數(shù),用于統(tǒng)計圖像的像素信息:
1. 統(tǒng)計像素值的基本信息
- 最大值、最小值、均值、標準差: 使用
cv::minMaxLoc()
和cv::meanStdDev()
函數(shù)可以快速計算圖像的最大值、最小值、均值和標準差。
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 讀取灰度圖像 if (image.empty()) { std::cerr << "Error: Could not load image!" << std::endl; return -1; } double minVal, maxVal; cv::Point minLoc, maxLoc; cv::minMaxLoc(image, &minVal, &maxVal, &minLoc, &maxLoc); cv::Scalar mean, stddev; cv::meanStdDev(image, mean, stddev); std::cout << "Min value: " << minVal << " at " << minLoc << std::endl; std::cout << "Max value: " << maxVal << " at " << maxLoc << std::endl; std::cout << "Mean: " << mean[0] << std::endl; std::cout << "Stddev: " << stddev[0] << std::endl; return 0; }
2. 統(tǒng)計像素值的直方圖
- 直方圖計算: 使用
cv::calcHist()
函數(shù)可以計算圖像的直方圖,用于分析像素值的分布。
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 讀取灰度圖像 if (image.empty()) { std::cerr << "Error: Could not load image!" << std::endl; return -1; } // 定義直方圖參數(shù) int histSize = 256; // 直方圖的 bin 數(shù)量 float range[] = {0, 256}; // 像素值范圍 const float* histRange = {range}; bool uniform = true, accumulate = false; cv::Mat hist; cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); // 打印直方圖 for (int i = 0; i < histSize; i++) { std::cout << "Bin " << i << ": " << hist.at<float>(i) << std::endl; } return 0; }
3. 統(tǒng)計像素值的總和
- 像素值求和: 使用
cv::sum()
函數(shù)可以計算圖像中所有像素值的總和。
cv::Scalar sum = cv::sum(image); std::cout << "Sum of pixel values: " << sum[0] << std::endl;
4. 統(tǒng)計非零像素的數(shù)量
- 非零像素統(tǒng)計: 使用
cv::countNonZero()
函數(shù)可以統(tǒng)計圖像中非零像素的數(shù)量。
int nonZeroCount = cv::countNonZero(image); std::cout << "Non-zero pixel count: " << nonZeroCount << std::endl;
5. 統(tǒng)計像素值的分布(分通道)
- 對于多通道圖像(如 RGB 圖像),可以分別統(tǒng)計每個通道的像素信息。
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR); // 讀取彩色圖像 std::vector<cv::Mat> channels; cv::split(image, channels); // 分離通道 for (int i = 0; i < channels.size(); i++) { double minVal, maxVal; cv::minMaxLoc(channels[i], &minVal, &maxVal); std::cout << "Channel " << i << " - Min: " << minVal << ", Max: " << maxVal << std::endl; }
6. 統(tǒng)計像素值的百分比
如果需要統(tǒng)計像素值的百分比(如 95% 的像素值小于某個閾值),可以通過直方圖計算累積分布函數(shù)(CDF )來實現(xiàn)。
cv::Mat hist; cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); // 計算累積分布函數(shù) for (int i = 1; i < histSize; i++) { hist.at<float>(i) += hist.at<float>(i - 1); } // 歸一化 hist /= image.total(); // 查找 95% 的像素值閾值 float threshold = 0.95; int pixelValueThreshold = 0; for (int i = 0; i < histSize; i++) { if (hist.at<float>(i) >= threshold) { pixelValueThreshold = i; break; } } std::cout << "95% of pixel values are below: " << pixelValueThreshold << std::endl;
通過以上方法,可以有效地統(tǒng)計和分析 OpenCV 圖像的像素信息。這些統(tǒng)計信息對于圖像處理、分析和特征提取等任務非常重要。根據(jù)具體需求,可以選擇合適的方法進行像素統(tǒng)計。
到此這篇關于opencv實現(xiàn)像素統(tǒng)計的示例代碼的文章就介紹到這了,更多相關opencv 像素統(tǒng)計內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學處理詳解
OpenCV是一款由Intel公司俄羅斯團隊發(fā)起并參與和維護的一個計算機視覺處理開源軟件庫,支持與計算機視覺和機器學習相關的眾多算法,下面這篇文章主要給大家介紹了關于OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學處理的相關資料,需要的朋友可以參考下2022-12-12VC6.0代碼自動提示 VC6.0在win7環(huán)境下代碼提示智能化
作為程序猿的你,是否已經喜歡或習慣依賴IDE開發(fā)環(huán)境呢,有了IDE環(huán)境,即使你想不起方法全名,只要知道某個前綴,或哪怕在提示列表中,一一查詢,也可以找到自己想找的方法或屬性2013-01-01詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用
這篇文章主要介紹了詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用,是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-08-08