从C#中的图像中检索平衡调色板

时间:2014-11-28 17:05:13

标签: c# asp.net asp.net-mvc

我正在尝试从图像中检索平衡的颜色调色板(前五种颜色);我发现了一些基于像素颜色获取图像中最流行颜色的解决方案,但这并不总是图像的平衡表示,因为照片往往有很多不同色调的相似颜色。

例如,如果我检索此图像中最常用的颜色:

enter image description here

在你看到结果之前,你会发现黄色会接近顶部,但由于天空颜色相当一致,天蓝色的变化数量高于图像中的任何其他颜色(黄色不是甚至出现在结果中,直到第30种最流行的颜色!)。

是否可以检索更平衡的颜色集?我应该使用什么方法?

以下是展示我问题的代码:

@using System.Drawing;
@using System.Drawing.Imaging;
@using System.Collections.Generic;
@using System.Linq;

var img = "/myimage.jpg";
using (var bitmap = new Bitmap(img))
{
    var colorsWithCount =
        GetPixels(bitmap)
            .GroupBy(color => color)
            .Select(grp =>
                new
                {
                    Color = grp.Key,
                    Count = grp.Count()
                })
            .OrderByDescending(x => x.Count)
            .Take(5);

            foreach (var colorWithCount in colorsWithCount)
            {
                string hex = colorWithCount.Color.R.ToString("X2") + colorWithCount.Color.G.ToString("X2") + colorWithCount.Color.B.ToString("X2");

                <p>@hex: @colorWithCount.Count</p>
            }
}

public static IEnumerable<Color> GetPixels(Bitmap bitmap)
{
    for (int x = 0; x < bitmap.Width; x++)
    {
        for (int y = 0; y < bitmap.Height; y++)
        {
            Color pixel = bitmap.GetPixel(x, y);
            yield return pixel;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我认为黄色并不会出现在第30个位置之前,因为此图像中有几种黄色,其中蓝色更均匀。

首先,在彩色图像上进行图像处理很复杂,因为有很多参数来定义颜色。 可能是第一步是以灰度变换图像,以便更容易在灰度级而不是颜色上工作。 在此之后,您可以对图像灰度级进行滞后阈值处理:通过将图像光谱除以16,可以在图像中具有16个灰度范围。 在那之后,你可以计算5个以上的灰色等级。 通过位置,您将能够知道彩色图像上的相应像素,并知道5种主要颜色。

你可能会得到一系列黄色,而不是简单的颜色。