我有一个“windows控件”的图像让我们说一个文本框,我希望通过像素颜色比较找到该图片中出现的最大颜色,从而获得文本框中写入的文本的背景颜色。 我在谷歌搜索,我发现每个人都在谈论直方图,并且还给出了一些代码来找出图像的直方图,但没有人在找到直方图后描述过程。
我在某些网站上找到的代码就像
// 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);
目前我使用的代码从图像中获取一个线段并找到最大颜色,但这不是正确的方法。 目前使用的代码如下
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;
如果有人知道如何获得它,请帮助我。将此图像作为输入==&gt;
答案 0 :(得分:1)
Emgu.CV的DenseHistogram
公开了方法MinMax()
,它找到了直方图的最大和最小区间。
所以在计算你的直方图后,就像你的第一个代码片段一样:
// 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);
...使用此方法找到直方图的峰值:
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;
答案 1 :(得分:0)
我在stackoverflow中找到了一个代码片段来完成我的工作。 代码就像这样
{{1}}