zoukankan      html  css  js  c++  java
  • 获取图片的主色调

    有时候我们需要找出一张图片中的主色调,这里的主色调并不是指颜色最多的,而是指最“醒目”的。

    例如 win8 在更换桌面壁纸后,会将任务栏的背景色改为该壁纸的主色调。

    看下面几张图可以更直观的明白“醒目”的意思。

    (这张图里面最醒目的无疑是紫红色的小花,而不是颜色占大多数的淡青色背景)

    (这张图也一样,最醒目的颜色应该是深红色,而不是深蓝色)

    我想了一个简单的办法,就是根据图片中每个像素的色调值去判断哪些像素符合“醒目”这个特性。

    分三步进行

    1.计算整个图片的色调的平均值 (avg_hue)

    2.遍历每个像素,计算该像素的色调值与 avg_hue 的色差(即将二者相减后取绝对值),如果该色差大于一个阈值(本文中取 30),

       则将该像素加入到“醒目像素”的列表

    3.计算整个“醒目像素列表”的颜色均值,得到的结果即为该图片的主色调。

    下面看看该算法的效果如何

    我将计算出的主色调画在原图的左上角,以方便对比。结果如下

    可以看到基本上达到了我想要的效果。

    下面给出具体代码,代码未经任何优化,速度比较慢。

    Color get_major_color(Bitmap bitmap)
    {
        //色调的总和
        var sum_hue = 0d;
        //色差的阈值
        var threshold = 30;
        //计算色调总和
        for (int h = 0; h < bitmap.Height; h++)
        {
            for (int w = 0; w < bitmap.Width; w++)
            {
                var hue = bitmap.GetPixel(w, h).GetHue();
                sum_hue += hue;
            }
        }
        var avg_hue = sum_hue / (bitmap.Width * bitmap.Height);
    
        //色差大于阈值的颜色值
        var rgbs = new List<Color>();
        for (int h = 0; h < bitmap.Height; h++)
        {
            for (int w = 0; w < bitmap.Width; w++)
            {
                var color = bitmap.GetPixel(w, h);
                var hue = color.GetHue();
                //如果色差大于阈值,则加入列表
                if (Math.Abs(hue - avg_hue) > threshold)
                {
                    rgbs.Add(color);
                }
            }
        }
        if (rgbs.Count == 0)
            return Color.Black;
        //计算列表中的颜色均值,结果即为该图片的主色调
        int sum_r = 0, sum_g = 0, sum_b = 0;
        foreach (var rgb in rgbs)
        {
            sum_r += rgb.R;
            sum_g += rgb.G;
            sum_b += rgb.B;
        }
        return Color.FromArgb(sum_r / rgbs.Count,
            sum_g / rgbs.Count,
            sum_b / rgbs.Count);
    }
    
  • 相关阅读:
    “王者对战”之 MySQL 8 vs PostgreSQL 10
    PostgreSQL 进程结构
    Linux core dump 诊断进程奔溃退出
    linux下core dump--转载
    2.4 等比数列
    2.3 等差数列的前n项和
    2.2 等差数列
    1.1.1 三角形正弦定理
    调整颜色
    去括号法则
  • 原文地址:https://www.cnblogs.com/michaelhuwei/p/3701535.html
Copyright © 2011-2022 走看看