OpenCV繪製圖像的水平和豎直方向直方圖

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軸感興趣區域的亮點分佈,對一幅二值化圖像做了直方圖統計:

二值化後圖像:
二值化後圖像

直方圖:
二值化後圖像的Y方向直方圖

發佈了16 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章