2013年3月3日 星期日

[EmguCV]計算直方圖(Histgram)與繪製

前言

在影像處理中常常會需要計算影像的值方圖(Histogram)作為後續的處理資料,以下是使用EmguCV來計算出值方圖與顯示的Code

值方圖類別使用

EmguCV提供DenseHistogram的類別方便快速地完成值方圖的計算步驟
  • 初始化與計算
  • 設定你需要的量化的程度與顯示的範圍
      
    //1.計算Blue單通道
    int Bbin = 32; //切割量化的數量
    RangeF BRange = new RangeF(0,255);
    DenseHistogram blueHist = new DenseHistogram(Bbin, BRange);
    //參數一是要計算的顏色資料,這邊分割通道並取得Blue通道的顏色;依序[1]:Green->[2]:Red
    blueHist.Calculate(new Image[] { loadImg.Split()[0] }, false, null);
    
    //2.計算Blue-Green單通道
    int[2] bins = {16,16}; //切割量化的數量
    RangeF[] ranges = new RangeF[]{ new RangeF(0,255),new RangeF(0,255) };
    DenseHistogram bgHist = new DenseHistogram(bins, ranges);
    //填入Blue-Green通道的顏色圖像
    bgHist.Calculate(new Image[] { loadImg.Split()[0],loadImg.Split()[1] }, false, null);
    
    
    //3.計算Hsv的H-S
    int[2] bins = {8,16}; //切割量化的數量{HBin,SBin}
    RangeF[] ranges = new RangeF[]{ new RangeF(0,180),new RangeF(0,255) }; //H,S
    DenseHistogram hsHist = new DenseHistogram(bins, ranges);
    //填入H-S通道的顏色圖像
    hsHist.Calculate(new Image[] { loadImg.Convert().Split()[0],loadImg.Convert().Split()[1] }, false, null);
    
    //多通道或其他色彩表示以此類推...
       
  • 繪製值方圖
  • 可以使用內建的控制項ImageViwver或ImageBox繪製,但是只能顯示一維
    • HistogramViewer:彈出視窗顯示
    • HistogramViewer.Show(blueHist, "Blue channel");
          
    • HistogramBox:UI有擺放HistogramBox
    • histogramBox.AddHistogram("Blue channel", Color.Blue, blueHist);
      histogramBox.Refresh(); //更新資料
      histogramBox.Show();     
          
  • 圖像直接顯示
  • 不使用DenseHistogram值方圖類別,直接顯示
    loadImg = new Image("lena_ori.jpg");
    Image[] image = loadImg.Split();
    
    //1.使用HistogramViewer
    HistogramViewer.Show(image[0],32); //顯示Blue,bin = 32
    
    //2.使用HistogramBox
    histogramBox.GenerateHistograms(image[0], 32); 
    histogramBox.Refresh(); //更新資料
    histogramBox.Show(); 
                

    結果

    參考資料

    沒有留言:

    張貼留言