2015-02-11 72 views
1

我有以下EMGU CV代碼來創建一個灰度圖像的直方圖:直方圖倉總數不等於圖像像素大小

Image<Bgr, Byte> img = new Image<Bgr, 
    Byte>(fileNameTextBox.Text).Resize(400, 400, 
    Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR, true); 

// Convert to grayscale and filter out noise. 
Image<Gray, Byte> gray = img.Convert<Gray, Byte>().PyrDown().PyrUp(); 

DenseHistogram dh = new DenseHistogram(256, new RangeF(0, 255)); 
dh.Calculate(new Image<Gray, Byte>[] { gray }, false, null); 
float[] valHist = new float[256];   // # of bins: 256 
dh.MatND.ManagedArray.CopyTo(valHist, 0); 
float total = 0F; 
for (int ii = 0; ii < 256; ii++) 
{ 
    total += valHist[ii]; 
} 
MessageBox.Show("Bins total: " + total); 

我運行下面的圖片上面的代碼(原始圖像不不包含它周圍的邊框 - 我在這裏補充它劃分):

的圖像是384 282,這使得108288個像素。但是,直方圖256個分檔的內容總數爲4,724個(如MessageBox代碼所示)。總數不應該是108,288? (也許我錯過了直方圖概念的基本原理?)

(聲明:我是圖像處理和EMGU簡歷的新手,雖然我已經完成了研究,但是在這裏對於SO有相對較少的EMGU問題,網絡上的所有其他內容似乎都是這裏問題的副本。)

回答

2

我意識到我在上述方法中遇到了幾個錯誤。我試圖計算已經調整大小並轉換爲灰度的圖像的直方圖,當然這已經破壞了原始圖像的規格!

除此之外,基本問題是,對於直方圖處理,必須先將圖像分離爲其通道(藍色,綠色,紅色)。否則,每個像素值的可能性介於0和16,581,375之間(並且試圖將每個這樣的強度放置在它自己的容器中)可能的需要大小爲2的矩陣,其中每個項需要高達2 比特。

以下C#代碼總計純白色像素和其他像素。在這種情況下,總計出來正確:

int pureWhites = 0; 
int otherPixels = 0; 
int totals = 0; 
Bgra tmp; 

for (int ii = 0; ii < 282; ii++) 
{ 
    for (int jj = 0; jj < 384; jj++) 
    { 
     tmp = img[ii,jj]; 
     if (tmp.Blue == 255 && tmp.Green == 255 && tmp.Red == 255) 
      pureWhites++; 
     else 
      otherPixels++; 
    } 
} 

totals = purewhites + otherPixels; 

對於問題(上述)中的圖像,總計如下:

pureWhites:106757(圖像背景)
otherPixels: 1531(文本)
總計:108288(圖像中的正確的像素數)

我希望這幫助他人在直方圖基礎知識以及像素級訪問EMGU簡歷中的圖像。

+0

我不認爲你只能得到RGB像素的直方圖。您可以很好地獲取灰度值像素的直方圖。 我剛剛瀏覽了EMGU DenseHistogram類的一些文檔,但是在代碼中找不到任何錯誤,因此可能錯誤確實在您創建/調整大小/轉換圖像的部分內。 – RFerwerda 2015-02-19 12:26:18

+0

@RFerwerda謝謝。在我上面的回答中,我描述瞭如何獲得直方圖(如果您真的想要)複合像素值,但您的正確之處在於,典型方法是將顏色分爲R,G,B通道。 – Sabuncu 2015-02-19 12:30:46

+0

@Sabuncu所以你在這裏散步。 ;) – karlphillip 2015-04-01 01:01:38