wordpress電子書(shū)下載地址武漢seo推廣優(yōu)化
- 操作系統(tǒng):ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語(yǔ)言:C++11
算法描述
計(jì)算一組數(shù)組的直方圖。
函數(shù) cv::calcHist 計(jì)算一個(gè)或多個(gè)數(shù)組的直方圖。用于遞增直方圖bin的元組的元素是從相同位置的相應(yīng)輸入數(shù)組中獲取的。下面的示例展示了如何為彩色圖像計(jì)算一個(gè)2D色調(diào)-飽和度直方圖。
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main( int argc, char** argv )
{Mat src, hsv;if( argc != 2 || !(src=imread(argv[1], IMREAD_COLOR)).data )return -1;cvtColor(src, hsv, COLOR_BGR2HSV);// Quantize the hue to 30 levels// and the saturation to 32 levelsint hbins = 30, sbins = 32;int histSize[] = {hbins, sbins};// hue varies from 0 to 179, see cvtColorfloat hranges[] = { 0, 180 };// saturation varies from 0 (black-gray-white) to// 255 (pure spectrum color)float sranges[] = { 0, 256 };const float* ranges[] = { hranges, sranges };MatND hist;// we compute the histogram from the 0-th and 1-st channelsint channels[] = {0, 1};calcHist( &hsv, 1, channels, Mat(), // do not use maskhist, 2, histSize, ranges,true, // the histogram is uniformfalse );double maxVal=0;minMaxLoc(hist, 0, &maxVal, 0, 0);int scale = 10;Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);for( int h = 0; h < hbins; h++ )for( int s = 0; s < sbins; s++ ){float binVal = hist.at<float>(h, s);int intensity = cvRound(binVal*255/maxVal);rectangle( histImg, Point(h*scale, s*scale),Point( (h+1)*scale - 1, (s+1)*scale - 1),Scalar::all(intensity),-1 );}namedWindow( "Source", 1 );imshow( "Source", src );namedWindow( "H-S Histogram", 1 );imshow( "H-S Histogram", histImg );waitKey();
}
函數(shù)原型1
void cv::calcHist
(const Mat * images,int nimages,const int * channels,InputArray mask,OutputArray hist,int dims,const int * histSize,const float ** ranges,bool uniform = true,bool accumulate = false
)
參數(shù)1
- 參數(shù) images 源數(shù)組。它們都應(yīng)該具有相同的深度(CV_8U, CV_16U 或 CV_32F),并且具有相同的尺寸。每一個(gè)都可以有任意數(shù)量的通道。
- 參數(shù)nimages 源圖像的數(shù)量。
- 參數(shù)channels 用于計(jì)算直方圖的各維通道列表。第一個(gè)數(shù)組的通道編號(hào)從 0 到 images[0].channels()-1,第二個(gè)數(shù)組的通道編號(hào)從 images[0].channels() 到 images[0].channels() + images[1].channels()-1,依此類(lèi)推。
- 參數(shù)mask O可選掩碼。如果矩陣不為空,它必須是一個(gè)與 images[i] 同尺寸的8位數(shù)組。非零的掩碼元素標(biāo)記了計(jì)入直方圖的數(shù)組元素。
- 參數(shù)hist 輸出直方圖,它是一個(gè)稠密或稀疏的多維數(shù)組。
- 參數(shù)dims 直方圖的維數(shù),必須是正數(shù)且不大于 CV_MAX_DIMS(在當(dāng)前 OpenCV 版本中等于 32)。
- 參數(shù)histSize 直方圖每個(gè)維度的大小數(shù)組。
- 參數(shù)ranges 每個(gè)維度直方圖bin邊界的數(shù)組。當(dāng)直方圖是均勻的(uniform=true)時(shí),對(duì)于每個(gè)維度 i,只需指定第0個(gè)直方圖bin的下(包含)邊界 L0 和最后一個(gè)直方圖bin histSize[i]-1 的上(不包含)邊界 UhistSize[i]?1。也就是說(shuō),在均勻直方圖的情況下,ranges[i] 是一個(gè)包含2個(gè)元素的數(shù)組。當(dāng)直方圖不是均勻的(uniform=false)時(shí),ranges[i] 包含 histSize[i]+1 個(gè)元素:L0, U0=L1, U1=L2, …, UhistSize[i]?2=LhistSize[i]?1, UhistSize[i]?1。不在 L0 和 UhistSize[i]?1 之間的數(shù)組元素不會(huì)被計(jì)入直方圖。
- 參數(shù)uniform 指示直方圖是否是均勻的標(biāo)志(參見(jiàn)上面的描述)。
- 參數(shù)accumulate 累積標(biāo)志。如果設(shè)置,那么在分配直方圖開(kāi)始時(shí)不將其清空。此功能使您能夠從幾組數(shù)組中計(jì)算單個(gè)直方圖,或隨時(shí)間更新直方圖。
函數(shù)原型2
這是一個(gè)重載的成員函數(shù),為了方便而提供。它與上述函數(shù)的不同之處僅在于它接受的參數(shù)。
這個(gè)變體使用 SparseMat 作為輸出。
void cv::calcHist
(const Mat * images,int nimages,const int * channels,InputArray mask,SparseMat & hist,int dims,const int * histSize,const float ** ranges,bool uniform = true,bool accumulate = false
)
函數(shù)原型3
這是一個(gè)重載的成員函數(shù),為了方便而提供。它與上述函數(shù)的不同之處僅在于它接受的參數(shù)。
這個(gè)變體只支持均勻直方圖。
ranges 參數(shù)要么是一個(gè)空向量,要么是一個(gè)展平的向量,包含 histSize.size() * 2 個(gè)元素(即 histSize.size() 個(gè)元素對(duì))。每對(duì)元素的第一個(gè)和第二個(gè)元素分別指定下界和上界。
void cv::calcHist
(InputArrayOfArrays images,const std::vector< int > & channels,InputArray mask,OutputArray hist,const std::vector< int > & histSize,const std::vector< float > & ranges,bool accumulate = false
)
代碼示例
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加載圖像cv::Mat image = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg", cv::IMREAD_COLOR );if ( image.empty() ){std::cerr << "Error: Image not found or unable to read." << std::endl;return -1;}// 將圖像從BGR轉(zhuǎn)換到HSV顏色空間cv::Mat hsv;cvtColor( image, hsv, cv::COLOR_BGR2HSV );// 定義直方圖參數(shù)int hue_bins = 180; // 色調(diào)范圍是從0到179int sat_bins = 256; // 飽和度范圍是從0到255int histSize[] = { hue_bins, sat_bins };// H和S的范圍float hue_range[] = { 0, 180 };float sat_range[] = { 0, 256 };const float* ranges[] = { hue_range, sat_range };// 指定我們要計(jì)算直方圖的兩個(gè)通道(Hue和Saturation)int channels[] = { 0, 1 };// 創(chuàng)建一個(gè)空的直方圖cv::Mat hist;calcHist( &hsv, 1, channels, cv::Mat(), // 圖像,圖像數(shù)量,通道,掩碼hist, 2, histSize, ranges, true, false ); // 2D直方圖,直方圖尺寸,范圍// 對(duì)直方圖進(jìn)行歸一化,使其值在 0 到 255 之間cv::normalize( hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat() );int hist_w = 512;int hist_h = 400;int bin_w = cvRound( ( double )hist_w / hue_bins );cv::Mat histImage( hist_h, hist_w, CV_8UC3, cv::Scalar( 0, 0, 0 ) );for ( int h = 0; h < hue_bins; h++ )for ( int s = 0; s < sat_bins; s++ ){double binVal = hist.at< float >( h, s ); // 獲取直方圖值int val = cvRound( binVal ); // 四舍五入cv::rectangle( histImage, cv::Point( h * bin_w, hist_h ), cv::Point( ( h + 1 ) * bin_w, hist_h - val ), cv::Scalar( 255, 0, 0 ), -1 );}cv::imshow( "original image", image );cv::imshow( "Hue-Saturation Histogram", histImage );cv::waitKey( 0 );return 0;
}