我有以下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問題,網絡上的所有其他內容似乎都是這裏問題的副本。)
我不認爲你只能得到RGB像素的直方圖。您可以很好地獲取灰度值像素的直方圖。 我剛剛瀏覽了EMGU DenseHistogram類的一些文檔,但是在代碼中找不到任何錯誤,因此可能錯誤確實在您創建/調整大小/轉換圖像的部分內。 – RFerwerda 2015-02-19 12:26:18
@RFerwerda謝謝。在我上面的回答中,我描述瞭如何獲得直方圖(如果您真的想要)複合像素值,但您的正確之處在於,典型方法是將顏色分爲R,G,B通道。 – Sabuncu 2015-02-19 12:30:46
@Sabuncu所以你在這裏散步。 ;) – karlphillip 2015-04-01 01:01:38