2013-11-15 29 views
0

我是OpenCV的新手,學習繪製單通道圖像的直方圖。當我運行程序時,我只會看到一條白線。請告訴我這段代碼有什麼問題。無法在OpenCV中獲取直方圖圖像

int histSize[1] = {256}; 
float hranges[2] = {0.0, 255.0}; 
const float* ranges[1] = {hranges}; 
int channels[1] = {0}; 

cv::MatND getHistogram(const cv::Mat &image) { 
    cv::MatND hist; 

    cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges); 

    return hist; 
} 

cv::Mat getHistogramImage(const cv::Mat &image) { 
    cv::MatND hist = getHistogram(image); 

    double minVal = 0; 
    double maxVal = 0; 

    cv::minMaxLoc(hist,&minVal,&maxVal,0,0); 

    cv::Mat histImg(histSize[0],histSize[0],CV_8U,cv::Scalar(255)); 

    int hpt = static_cast<int>(0.9*histSize[0]); 

    for(int h=0; h<256; ++h){ 
     float binVal = hist.at<float>(h); 

     int intensity = static_cast<int>(binVal*hpt/maxVal); 

     cv::line(histImg,cv::Point(h,histSize[0]), 
         cv::Point(h,histSize[0]-intensity), 
         cv::Scalar::all(0)); 
    } 
    return histImg; 
} 
+0

你看到的[官方文檔](http://docs.opencv.org/doc/教程/ imgproc /直方圖/ histogram_calculation/histogram_calculation.html)直方圖計算..?我認爲它會給你所有你需要的答案.. – scap3y

+0

是的,我指的是同一頁。謝謝。 – Shubham

+0

@Shubham從[該頁面](http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/calcHist_Demo.cpp)獲取代碼,進行編譯,運行它並確保它能正常工作。然後,適應單通道圖像。我相信你會發現你的錯誤。 – karlphillip

回答

1

對於單信道(和從色調信道那太),以下代碼可被用於:

{ 
    Mat input("filepath/image.jpg", 1); 
    Mat hsv_input; 

cvtColor(input, hsv_input, CV_BGR2HSV); 

int h_bins = 5; 
int histSize[] = { h_bins}; 
float h_ranges[] = { 0, 180 }; 

const float* ranges[] = { h_ranges}; 
int channels[] = { 0 }; 

MatND original_hist_input; 
calcHist(&hsv_input, 1, channels, Mat(), original_hist_input, 1, histSize, ranges, true, false); 
normalize(original_hist_input, original_hist_input, 0, 1, NORM_MINMAX, -1, Mat());  

} 
0
#include <opencv2/opencv.hpp> 
#include <iostream> 


    using namespace cv; 
    using namespace std; 



    class Histogram1D 
{ 


    public: 

     int hitsize[1]; 
     float hrange[2]; 
     const float *ranges[1]; 
     int channel[1]; 


    Histogram1D() 
    { 
     hitsize[0]=256; 
     hrange[0]=0.0; 
     hrange[1]=256.0; 
     ranges[0]=hrange; 
     channel[0]=0; 

    } 

    MatND gethistogram(Mat &image) 
    { 
     MatND hist; 

     calcHist(&image,1,channel,Mat(),hist,1,hitsize,ranges); 
     return hist; 
    } 
}; 


int main() 


{ 

     Mat image = imread("1.jpg",0); 
     Histogram1D h; 
     double minval=0; 
    double maxval=0; 


    MatND result= h.gethistogram(image); 

    for (int i=0;i<256;i++) 
    { 
     cout << "value" << i << "=" << result.at<float>(i)<< endl; 

    } 

    minMaxLoc(result,&minval,&maxval,0,0); 

    Mat histImg(h.hitsize[0],h.hitsize[0],CV_8U,Scalar(255)); 

    int hpt=static_cast<int>(0.9*h.hitsize[0]); 

     for(int i=0;i<h.hitsize[0];i++) 
     { 
      float binval=result.at<float>(i); 
      int intensity=static_cast<int>(binval*hpt/maxval); 

      line(histImg,Point(i,h.hitsize[0]),Point (i,h.hitsize[0]-intensity),Scalar::all(0)); 


     } 

     namedWindow("Histogram"); 
     imshow("Histogram", histImg); 
     waitKey(0); 
} 
+0

你的代碼如何更好?你能詳細說明一下嗎? – Math

0

您已聲明瞭錯誤的範圍色相通道在第二行

float hranges[2] = {0.0, 255.0}; 

,這是不對的色調通道範圍爲0〜180因此,隨着色調 - 通道範圍是0到180,因此,如果您採用小於或等於180個分檔(即「histSize」)將會很好。