惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
B
Blog
WordPress大学
WordPress大学
Project Zero
Project Zero
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
F
Full Disclosure
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News: Ask HN
Hacker News: Ask HN
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
O
OpenAI News
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
IT之家
IT之家
U
Unit 42
腾讯CDC
S
Security Affairs
C
Cisco Blogs
Schneier on Security
Schneier on Security
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss

博客园 - 在天空飞翔

asp net core 跨平台初体验 U盘启动安装 window server 2003 简单的中文姓名生成器 扩展 DataGridView 的功能(五) WebBrowser - 想说爱你不容易 表白 天涯宝盒-天涯看贴脚本-只看楼主-自动翻页 使用 asp.net 编写的一些大中型的网站 PrecompiledApp.config 的惨剧 [音乐] the dream catcher csv 文件的读取 扩展DataGridView 的功能(四) 三八节快乐 将MP3文件嵌入到exe中并播放 [音乐] 下个路口见 雷人的面试 发现不明飞行物 扩展 DataGridView 的功能(三) 扩展 DataGridView 的功能(二)
获取图片的主色调
在天空飞翔 · 2014-04-30 · via 博客园 - 在天空飞翔

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

例如 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);
}