How to find the max occurred color in the picture using EMGU CV in C#?

送分小仙女□ 提交于 2021-02-19 08:17:07

问题


I have an image of a "windows control" lets say a Text-box and I want to get background color of the text written within the text box by finding max color occurred in that picture by pixel color comparison. I searched in google and I found that every one is talking about histogram and also some code is given to find out histogram of an image but no one described the procedure after finding histogram.

the code I found on some sites is like

        // Create a grayscale image
        Image<Gray, Byte> img = new Image<Gray, byte>(bmp);
        // Fill image with random values
        img.SetRandUniform(new MCvScalar(), new MCvScalar(255));
        // Create and initialize histogram
        DenseHistogram hist = new DenseHistogram(256, new RangeF(0.0f, 255.0f));
        // Histogram Computing
        hist.Calculate<Byte>(new Image<Gray, byte>[] { img }, true, null);

Currently I have used the code which takes a line segment from the image and finds the max color but which is not the right way to do it. the currently used code is as follows

        Image<Bgr, byte> image = new Image<Bgr, byte>(temp);
        int height = temp.Height / 2;
        Dictionary<Bgr, int> colors = new Dictionary<Bgr, int>();
        for (int i = 0; i < (image.Width); i++)
        {
            Bgr pixel = new Bgr();
            pixel = image[height, i];
            if (colors.ContainsKey(pixel))
                colors[pixel] += 1;
            else
                colors.Add(pixel, 1);                
        }
        Bgr result = colors.FirstOrDefault(x => x.Value == colors.Values.Max()).Key;

please help me if any one knows how to get it. Take this image as input ==>


回答1:


Emgu.CV's DenseHistogram exposes the method MinMax() which finds the maximum and minimum bin of the histogram.

So after computing your histogram like in your first code snippet:

// Create a grayscale image
Image<Gray, Byte> img = new Image<Gray, byte>(bmp);
// Fill image with random values
img.SetRandUniform(new MCvScalar(), new MCvScalar(255));
// Create and initialize histogram
DenseHistogram hist = new DenseHistogram(256, new RangeF(0.0f, 255.0f));
// Histogram Computing
hist.Calculate<Byte>(new Image<Gray, byte>[] { img }, true, null);

...find the peak of the histogram with this method:

float minValue, maxValue;
Point[] minLocation;
Point[] maxLocation;
hist.MinMax(out minValue, out maxValue, out minLocation, out maxLocation);

// This is the value you are looking for (the bin representing the highest peak in your
// histogram is the also the main color of your image).
var mainColor = maxLocation[0].Y;



回答2:


I found a code snippet in stackoverflow which does my work. code goes like this

        int BlueHist;
        int GreenHist;
        int RedHist;

        Image<Bgr, Byte> img = new Image<Bgr, byte>(bmp);
        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);

        double[] minV, maxV;
        Point[] minL, maxL;
        Histo.MinMax(out minV, out  maxV, out minL, out maxL);

        BlueHist = maxL[0].Y;

        Histo.Clear();

        Histo.Calculate(new Image<Gray, Byte>[] { img2Green }, true, null);           

        Histo.MinMax(out minV, out  maxV, out minL, out maxL);

        GreenHist = maxL[0].Y;
        Histo.Clear();

        Histo.Calculate(new Image<Gray, Byte>[] { img2Red }, true, null);

        Histo.MinMax(out minV, out  maxV, out minL, out maxL);

        RedHist = maxL[0].Y;


来源:https://stackoverflow.com/questions/36077051/how-to-find-the-max-occurred-color-in-the-picture-using-emgu-cv-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!