如何使用EmguCV和C#绘制直方图

我需要绘制两种类型的直方图,即单维和立体。 我是EMGU的新手,我在网上找到的所有样本都是用C ++或C.是否有使用C#和Emgucv的样本?

谢谢你的帮助。

以下代码将分割RED GREEN和BLUE Histogram数据,并将它们放入浮动数组中,以满足您的任何需要。

float[] BlueHist; float[] GreenHist; float[] RedHist; Image img = new Image("ImageFileName"); DenseHistogram Histo = new DenseHistogram(255, new RangeF(0, 255)); Image img2Blue = img[0]; Image img2Green = img[1]; Image img2Red = img[2]; Histo.Calculate(new Image[] { img2Blue }, true, null); //The data is here //Histo.MatND.ManagedArray BlueHist = new float[256]; Histo.MatND.ManagedArray.CopyTo(BlueHist, 0); Histo.Clear(); Histo.Calculate(new Image[] { img2Green }, true, null); GreenHist = new float[256]; Histo.MatND.ManagedArray.CopyTo(GreenHist, 0); Histo.Clear(); Histo.Calculate(new Image[] { img2Red }, true, null); RedHist = new float[256]; Histo.MatND.ManagedArray.CopyTo(RedHist, 0); 

这将执行灰度直方图:

 float[] GrayHist; Image img_gray = new Image("ImageFileName"); Histo.Calculate(new Image[] { img_gray }, true, null); //The data is here //Histo.MatND.ManagedArray GrayHist = new float[256]; Histo.MatND.ManagedArray.CopyTo(GrayHist, 0); 

希望这可以帮助,

干杯,

克里斯

[编辑]

要绘制直方图,您需要使用自己的或者设计的控件,例如Zedgraph(这是随EMGU提供的),这是一篇关于codeproject的非常好的文章,展示了它的用途。

http://www.codeproject.com/KB/graphics/zedgraph.aspx

干杯

克里斯

在Emgu中显示直方图非常简单有趣。 只需在表单上创建一个histogramBox控件,然后在循环中调用它即可完成。

  histogramBox1.ClearHistogram(); histogramBox1.GenerateHistograms(frame, 256); histogramBox1.Refresh(); 

立体直方图

 Image[] inp = new Image("fileName.jpg"); int nBins = 256; DenseHistogram hist = new DenseHistogram(new int[] { nBins, nBins, nBins }, new RangeF[] { new RangeF(0, 255), new RangeF(0, 255), new RangeF(0, 255) }); hist.Calculate(inp.Split(), false, null); // To get value of single bin int b = 255; int g = 0; int r = 0; //blue int count = Convert.ToInt32(hist.MatND.ManagedArray.GetValue(b, g, r)); //count = no of pixels in color Bgr(b,g,r) //To get all values in a single array List> histVal = new List>(nBins * nBins * nBins); for (int i = 0; i < nBins; i++) for (int j = 0; j < nBins; j++) for (int k = 0; k < nBins; k++) histVal.Add(new Tuple(new Bgr(i, j, k), Convert.ToInt32(hist.MatND.ManagedArray.GetValue(i, j, k)))); 

单维直方图

 int nBins = 256; float[] valHist = new float[nBins]; Image[] inp = new Image("fileName.jpg"); DenseHistogram hist = new DenseHistogram(nBins, new RangeF(0, 255)); hist.Calculate(new Image[] { inp }, true, null); hist.MatND.ManagedArray.CopyTo(valHist,0); 

请务必按照以下步骤将Emgu.CV.UI.dll添加到Windows窗体中的工具箱中,以便使用Emgu CV提供的所有Windows窗体控件(包括HistogramBox)。

首先,您需要在设计器视图中打开表单。 在“工具箱”中,右键单击“常规”列的空白区域。 这将弹出一个选择菜单,其中“选择项目”选项可用,请参见下图。

设计师表单视图

然后,点击“选择项目”; 您将看到“选择工具箱项”对话框。 从那里单击对话框右下角的“浏览…”按钮。

在此处输入图像描述

从“打开”对话框中选择“Emgu.CV.UI.dll”文件,单击“打开”按钮。 现在您应该注意到ImageBox控件已添加到“选择工具箱项”对话框中。 点击“确定”。 然后你应该注意到你的工具箱中添加了以下控件(适用于Emgu的3.10版本。某些其他版本的Emgu可能有其他控件或缺少下面提到的控件。)

  • HistogramBox
  • ImageBox
  • MatrixBox
  • PanAndZoomPictureBox。

ToolBoxControls

然后,您应该能够拖放到您的表单,因为您认为Emgu CV已经构建了它的Windows窗体控件。 或者您应该能够以编程方式使用它们:

 Form frm = new Form(); var img = CvInvoke.Imread(this.PictureBox.ImageLocation, Emgu.CV.CvEnum.LoadImageType.Grayscale).ToImage(); HistogramBox histo = new HistogramBox(); histo.ClearHistogram(); histo.GenerateHistograms(img, 256); histo.Dock = DockStyle.Fill; histo.Refresh(); frm.Controls.Add(histo); frm.ShowDialog(); 

这个答案的灵感来自于添加图像框控件教程。

在这里你可以找到在MVVM WPF方法的上下文中使用Emgucv绘制灰度图像直方图的答案..希望它对某人有用

MainWindow.xaml

这是视图

           

MainWindowViewModel.cs

这是viewmodel类

 class MainWindowViewModel { public ICommand OpenImg { get; set; } Image imgInput; Histogram his = new Histogram(); public MainWindowViewModel() { OpenImg = new RelayCommand(openImg, (obj) => true); _image = new System.Windows.Controls.Image(); _hist = new System.Windows.Controls.Image(); } private void openImg(object obj = null) { OpenFileDialog op = new OpenFileDialog(); op.Title = "Select a picture"; op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png;*.bmp;*.tiff|" + "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" + "Portable Network Graphic (*.png)|*.png"; if (op.ShowDialog() == true) { string ImgPath = op.FileName; imgInput = new Image(ImgPath); Image.Source = BitmapSourceConvert.ToBitmapSource(imgInput); } } private System.Windows.Controls.Image _image; public System.Windows.Controls.Image Image { get { return _image; } set { _image = value; } } private ICommand _histogram; public ICommand Histogram { set { _histogram = value; } get { if(_histogram == null) { _histogram = new RelayCommand(param => DrawHistogram((EventArgs)param)); } return _histogram; } } private void DrawHistogram(EventArgs e) { Bitmap img; img = his.ApplyHistogram(imgInput); Hist.Source = BitmapSourceConvert.BitmapToImageSource(img); } private System.Windows.Controls.Image _hist; public System.Windows.Controls.Image Hist { get { return _hist; } set { _hist = value; } } } 

Histogram.cs

这是模特课

 public class Histogram { public Bitmap ApplyHistogram(Image imgInput) { Image src = imgInput.Convert(); DenseHistogram hist = new DenseHistogram(256, new RangeF(0.0f, 255f)); hist.Calculate(new Image[] { src }, true, null); // Get the max value of histogram double minVal = 0.0; double maxVal = 0.0; Point minLoc = new Point(); Point maxLoc = new Point(); CvInvoke.MinMaxLoc(hist, ref minVal, ref maxVal, ref minLoc, ref maxLoc); // Scale histogram const int width = 256; const int height = 250; var histData = hist.GetBinValues(); Bitmap histo = DrawHistogram(maxVal, width, height, histData); return histo; } private static Bitmap DrawHistogram(double maxVal, int width, int height, float[] histData) { Bitmap histo = new Bitmap(width, height); Graphics g = Graphics.FromImage(histo); g.Clear(SystemColors.Window); Pen penGray = new Pen(Brushes.DarkGray); for (var i = 0; i < histData.GetLength(0); i++) { var val = (float)histData.GetValue(i); val = (float)(val * (maxVal != 0 ? height / maxVal : 0.0)); Point s = new Point(i, height); Point e = new Point(i, height - (int)val); g.DrawLine(penGray, s, e); } return histo; } }