OpenCV中有求圖像顏色直方圖的函數,但是沒有沿座標軸的水平直方圖統計的函數。
在實驗室作項目的過程中,有時需要統計X,Y軸方向的水平直方圖,通過水平直方圖來尋找圖像的階躍點,寫了一段代碼與大家共享,水平有限,望大家指正。
編譯平臺:VS2010+OpenCV2.4.4
下面是求y軸直方圖的一段代碼:
#define imageshow 1
std::vector<unsigned int> pixel_sum;
std::vector<unsigned int> row_num;
//提取豎直方向直方圖
unsigned int sum=0;
for(unsigned int j=0;j<image.size().height;j++)
{
sum=0;
for(unsigned int i=0;i<image.size().width;i++)
{
//這裏特別注意at的第一個點是y座標,第二個點纔是橫座標
sum+=bw.at<uchar>(j,i);
}
pixel_sum.push_back(sum);//每行的像素值和存儲
row_num.push_back(j);//行號存儲
}
#if imageshow
//畫直方圖,背景應該是白的,直方圖是黑的纔對
unsigned int hist_height=300;
cv::Mat hist_img(hist_height,row_num.size(),CV_8U,cv::Scalar(255));
//獲取最大值和最小值
double maxVal=0;
double minVal=0;
//cv::minMaxLoc(pixel_sum,&minVal,&maxVal,0,0);
maxVal=pixel_sum[0];
for(unsigned int i=0;i<pixel_sum.size();i++)
{
if(pixel_sum[i]>maxVal)
maxVal=pixel_sum[i];
}
unsigned int hpt=static_cast<unsigned int>(hist_height*0.9);//設置直方圖繪製的最高點
for(unsigned int i=0;i<pixel_sum.size();i++)
{
unsigned int intensity=static_cast<unsigned int>(pixel_sum[i]/maxVal*hpt);
//兩點之間繪製一條直線
cv::line(hist_img,cv::Point(i,hist_height),
cv::Point(i,hist_height-intensity),
cv::Scalar::all(0));
}
cv::namedWindow("hist_img",CV_WINDOW_AUTOSIZE);
cv::imshow("hist_img",hist_img);
cv::waitKey(0);
#endif
試驗中要統計y軸感興趣區域的亮點分佈,對一幅二值化圖像做了直方圖統計:
二值化後圖像:
直方圖: