Мне нужно нарисовать два типа гистограммы, а именно одномерную и трехмерную. Я новичок в EMGU, и все примеры, которые я нашел в сети, написаны на C++ или C. Есть ли примеры с использованием C# и Emgucv?
Спасибо за помощь.
Мне нужно нарисовать два типа гистограммы, а именно одномерную и трехмерную. Я новичок в EMGU, и все примеры, которые я нашел в сети, написаны на C++ или C. Есть ли примеры с использованием C# и Emgucv?
Спасибо за помощь.
Следующий код будет сегментировать данные гистограммы RED GREEN и BLUE и поместить их в массив с плавающей запятой для любого использования, которое вы хотите.
float[] BlueHist;
float[] GreenHist;
float[] RedHist;
Image<Bgr, Byte> img = new Image<Bgr, byte>("ImageFileName");
DenseHistogram Histo = new DenseHistogram(255, new RangeF(0, 255));
Image<Gray, Byte> img2Blue = img[0];
Image<Gray, Byte> img2Green = img[1];
Image<Gray, Byte> img2Red = img[2];
Histo.Calculate(new Image<Gray, Byte>[] { 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<Gray, Byte>[] { img2Green }, true, null);
GreenHist = new float[256];
Histo.MatND.ManagedArray.CopyTo(GreenHist, 0);
Histo.Clear();
Histo.Calculate(new Image<Gray, Byte>[] { img2Red }, true, null);
RedHist = new float[256];
Histo.MatND.ManagedArray.CopyTo(RedHist, 0);
и это сделает гистограмму в оттенках серого:
float[] GrayHist;
Image<Gray, Byte> img_gray = new Image<Gray, byte>("ImageFileName");
Histo.Calculate(new Image<Gray, Byte>[] { img_gray }, true, null);
//The data is here
//Histo.MatND.ManagedArray
GrayHist = new float[256];
Histo.MatND.ManagedArray.CopyTo(GrayHist, 0);
Надеюсь это поможет,
Ваше здоровье,
Крис
[Редактировать]
Чтобы нарисовать гистограмму, вам нужно будет использовать собственные или разработанные элементы управления, такие как Zedgraph (поставляется с EMGU). Вот очень хорошая статья о кодовом проекте, в которой показано его использование.
http://www.codeproject.com/KB/graphics/zedgraph.aspx
Ваше здоровье
Крис
DenseHistogram Histo = new DenseHistogram(255, new RangeF(0, 255));
должно быть DenseHistogram Histo = new DenseHistogram(256, new RangeF(0, 256));
В противном случае вы пропустите какие-либо значения в своей корзине 255, как я только что испытал, когда создавал лапласиан по изображению.
- person foofunner; 11.03.2013
Отображать гистограммы в Emgu очень просто и весело. Просто создайте элемент управления histogramBox в своей форме, затем вызовите его в своем цикле, и все готово.
histogramBox1.ClearHistogram();
histogramBox1.GenerateHistograms(frame, 256);
histogramBox1.Refresh();
Важно следовать процедуре добавления Emgu.CV.UI.dll на панель инструментов в Windows Forms, чтобы использовать все элементы управления Windows Forms, которые предоставляет Emgu CV (включая HistogramBox).
Прежде всего, вам нужно открыть форму в режиме конструктора. В панели инструментов щелкните правой кнопкой мыши пустое место в столбце «Общие». Это должно открыть меню выбора, где доступен выбор «Выбрать элементы», см. изображение ниже.
После этого нажмите «Выбрать элементы»; вы увидите диалоговое окно «Выбрать элемент панели инструментов». Оттуда нажмите кнопку «Обзор..» в правом нижнем углу диалогового окна.
Выберите файл «Emgu.CV.UI.dll» в диалоговом окне «Открыть», нажмите кнопку «Открыть». Теперь вы должны заметить, что элемент управления ImageBox был добавлен в диалоговое окно «Выбрать элементы панели инструментов». Нажмите «ОК». Затем вы должны отметить следующие элементы управления, добавленные в вашу панель инструментов (применимо к версии 3.10 Emgu. Некоторые другие версии Emgu могут иметь другие элементы управления или не иметь элементов управления, упомянутых ниже).
Затем вы должны иметь возможность перетаскивать в свою форму элементы управления Windows Forms, которые встроены в Emgu CV. Или вы должны иметь возможность использовать их программно:
Form frm = new Form();
var img = CvInvoke.Imread(this.PictureBox.ImageLocation, Emgu.CV.CvEnum.LoadImageType.Grayscale).ToImage<Gray, Byte>();
HistogramBox histo = new HistogramBox();
histo.ClearHistogram();
histo.GenerateHistograms(img, 256);
histo.Dock = DockStyle.Fill;
histo.Refresh();
frm.Controls.Add(histo);
frm.ShowDialog();
Этот ответ был вдохновлен в руководстве по Добавить элемент управления полем изображения.
Трехмерная гистограмма
Image<Bgr, Byte>[] inp = new Image<Bgr, byte>("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<Tuple<Bgr, int>> histVal = new List<Tuple<Bgr, int>>(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<Bgr, int>(new Bgr(i, j, k), Convert.ToInt32(hist.MatND.ManagedArray.GetValue(i, j, k))));
Одномерная гистограмма
int nBins = 256;
float[] valHist = new float[nBins];
Image<Gray, Byte>[] inp = new Image<Gray, byte>("fileName.jpg");
DenseHistogram hist = new DenseHistogram(nBins, new RangeF(0, 255));
hist.Calculate(new Image<Gray, Byte>[] { inp }, true, null);
hist.MatND.ManagedArray.CopyTo(valHist,0);