Как нарисовать гистограмму с помощью EmguCV и C#

Мне нужно нарисовать два типа гистограммы, а именно одномерную и трехмерную. Я новичок в EMGU, и все примеры, которые я нашел в сети, написаны на C++ или C. Есть ли примеры с использованием C# и Emgucv?

Спасибо за помощь.


person Ibtissem Ben Aicha    schedule 20.11.2011    source источник


Ответы (4)


Следующий код будет сегментировать данные гистограммы 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

Ваше здоровье

Крис

person Chris    schedule 21.11.2011
comment
Первый параметр Calculate — это массив изображений. Означает ли это, что я могу дать ему {img2Blue,img2Red,img2Green} и он все рассчитает? Можете ли вы продемонстрировать это использование? Спасибо большое. - person Gqqnbig; 18.10.2012
comment
Просто быстрое исправление в сообщении Криса 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();
person john ktejik    schedule 06.06.2013

Важно следовать процедуре добавления Emgu.CV.UI.dll на панель инструментов в Windows Forms, чтобы использовать все элементы управления Windows Forms, которые предоставляет Emgu CV (включая HistogramBox).

Прежде всего, вам нужно открыть форму в режиме конструктора. В панели инструментов щелкните правой кнопкой мыши пустое место в столбце «Общие». Это должно открыть меню выбора, где доступен выбор «Выбрать элементы», см. изображение ниже.

Представление дизайнерской формы

После этого нажмите «Выбрать элементы»; вы увидите диалоговое окно «Выбрать элемент панели инструментов». Оттуда нажмите кнопку «Обзор..» в правом нижнем углу диалогового окна.

введите здесь описание изображения

Выберите файл «Emgu.CV.UI.dll» в диалоговом окне «Открыть», нажмите кнопку «Открыть». Теперь вы должны заметить, что элемент управления ImageBox был добавлен в диалоговое окно «Выбрать элементы панели инструментов». Нажмите «ОК». Затем вы должны отметить следующие элементы управления, добавленные в вашу панель инструментов (применимо к версии 3.10 Emgu. Некоторые другие версии Emgu могут иметь другие элементы управления или не иметь элементов управления, упомянутых ниже).

  • Гистограмма
  • ImageBox
  • МатрицаБокс
  • PanAndZoomPictureBox.

ToolBoxControls

Затем вы должны иметь возможность перетаскивать в свою форму элементы управления 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(); 

Этот ответ был вдохновлен в руководстве по Добавить элемент управления полем изображения.

person Amadeus Sánchez    schedule 19.05.2016

Трехмерная гистограмма

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);
person nisssal    schedule 18.07.2013