想要做一个工具,自动化把贴图中的所有主色调区域区分开,以便逐步为各个主色调区域单独上色。所以需要将贴图中颜色近似的区域区分开,看似非常简单,其实不然。常用的RGB或HSV颜色模型,由三个变量共同控制着颜色,如何合并成一个因子呢?经过查阅资料最终选用了一个效率和准确度相对平衡的算法。

最简单的方式就是转化为颜色空间的距离,即:distance² = (R2 - R1)² + (G2 - G1)² + (B2 - B1)²

但是人类的眼睛对于红、绿、蓝的敏感度也是不同的,这就可能造成数值上distance很小,但肉眼识别颜色感觉色差很大。因此就引入了一个RGB权重的问题,人眼越敏感的颜色权重值越大。麻烦的是在不同的色值下人类对RGB的敏感权重不同,比如R < 128 和 R ≥ 128时的敏感权重就不同:

取两个颜色R的平均值,计为averageR:

averageR = (R1 + R2) / 2

averageR < 128时:distance² = 2 * (R2 - R1)² + 4 * (G2 - G1)² + 3 * (B2 - B1)²

averageR ≥ 128时:distance² = 3 * (R2 - R1)² + 4 * (G2 - G1)² + 2 * (B2 - B1)²

还可以把两种情况的权重平滑过度,变成一个公式:

distance² = (2 + averageR / 255f) * (R2 - R1)² + 4 * (G2 - G1)² + (2 + (255 - averageR) / 255f) * (B2 - B1)²

最后最终的结果distance归一化到0-1

下面是C#实现,需要做后处理可以照搬shader中实现:

    public class ColorExt{public static float Difference(Color c1, Color c2){c1 *= 255; c2 *= 255;var averageR = (c1.r + c2.r) * 0.5f;return Mathf.Sqrt((2 + averageR / 255f) * Mathf.Pow(c1.r - c2.r, 2) + 4 * Mathf.Pow(c1.g - c2.g, 2) + (2 + (255 - averageR) / 255f) * Mathf.Pow(c1.b - c2.b, 2)) / (3 * 255f);}}

返回值为色差,取值范围0-1。颜色越近似返回值越小,比如相同颜色返回值为0,白色与黑色返回值为1.

算法参考:

https://en.wikipedia.org/wiki/Color_difference

【Unity】计算颜色色差,近似颜色识别,实现油漆桶工具相关推荐

  1. 颜色和移动物体识别系统

    颜色和移动物体识别系统 1.开发工具 Python版本:Anaconda 的python环境3.8版本 开发软件:Pycharm社区版 识别模型:深度学习模型,普通学习模型 相关模块:opencv-p ...

  2. idea中java项目显示不对_Intellj Idea中的maven工程Java文件颜色不对,未被识别的解决...

    Intellj Idea中的maven工程Java文件颜色不对,未被识别的解决,模块,工程,给大家,文件,灰色 Intellj Idea中的maven工程Java文件颜色不对,未被识别的解决 易采站长 ...

  3. 图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

    本文主要是为了更好地理解图像特征,理解各方法的原理. 转载请注明出处 https://mp.csdn.net/console/editor/html/105090183 图像模式识别的一般步骤为:输入 ...

  4. MATLAB | 有关数值矩阵、颜色图及颜色列表的技巧整理

    这是一篇有关数值矩阵.颜色矩阵.颜色列表的技巧整合,会以随笔的形式想到哪写到哪,可能思绪会比较飘逸请大家见谅,本文大体分为以下几个部分: 数值矩阵用颜色显示 从颜色矩阵提取颜色 从颜色矩阵中提取数据 ...

  5. [html] HTML采用的是RGB颜色还是CMYK颜色?为什么?

    [html] HTML采用的是RGB颜色还是CMYK颜色?为什么? 用在电脑或者手机上显示的大部分都是RGB,用于需要印刷的都用CMYK 并且不同的显示器色域不同会导致色差,不同浏览器也有自己的调色板 ...

  6. OpenGL学习笔记:颜色(RGBA颜色,颜色索引模式)

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数据. 不同的是,RGBA模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表 ...

  7. css——font 样式和对照表 颜色格式和颜色渐变

    1.font 常用字体:宋体(SimSon).黑体(SimHei).微软雅黑 {font:italic bold 12px/20px arial,sans-serif;} font简写中size和fa ...

  8. RGB 空间颜色量化 - 减少颜色数目

    很多图像处理算法是以颜色为原理展开的, 因此颜色数目很大程度上决定了算法的运行效率. 如果可以大大降低图像中的颜色数目, 将可以轻松地优化特定的图像处理算法. 1. 简单方法 - 像素除法 使用以下的 ...

  9. 一本正经的聊聊手机主题颜色随手机壳颜色变化的几种方案

    最近几天某公司产品提出了一个需求:"手机主题颜色随手机壳颜色变化",但是程序猿大哥不答应了,你这个触及到我的知识盲区了! 本着能动手不吵吵的原则, 最终产品和程序猿双双被开除了.虽 ...

最新文章

  1. Python装饰器的神奇功能:自动打印每个方法耗时
  2. Nature综述:噬菌体的百年研究
  3. Nginx配置https,反向代理多实例tomcat的操作记录
  4. java 方法 变量_Java-变量和方法
  5. 27.13. flock - manage locks from shell scripts
  6. vscode / ubuntu 下编译和调试 C/C++ 方法
  7. C++实现系统性能检测工具
  8. VBA中对内存地址的操作
  9. mysql时间返回整小时_MySql 时间处理
  10. unity3d的uGUI基本操作
  11. 小写的tensor接受数据,大写的Tensor()接受的是shape,数据的维度
  12. 武汉大学计算机学院徐霜,物联网工程专业建设与实践教学研究_余琍
  13. 计算n阶行列式的C语言实现
  14. 【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)
  15. JMeter工具:场景设计,场景设置,场景运行,性能参数配置,测试监控
  16. DBF文件初步了解(二)——DBF数据导出代码实现
  17. Unity 计算角度和方向
  18. c语言编写词库_C语言课程设计--电子生词库软件
  19. 计算机win10分区软件,如何利用Win10系统DiskPart工具进行GPT硬盘分区
  20. Virtualbox centos虚拟机网络互联总结

热门文章

  1. Spring 与 Log4J 进行动态日志配置切换
  2. ArcEngine9.3编辑工具条的实现
  3. linux上归档文件无法提取,在Deepin 20中归档管理器提示装入归档文件时出现了一个错误的原因...
  4. java中如何获取字符的ASCII码
  5. RHEL8 学习记录 #1 从官网下载 RHEL 8 镜像真的很快
  6. yolov5安全帽检测、反光衣检测、抽烟检测
  7. Tarjan算法超超超详解(ACM/OI)(强连通分量/缩点)(图论)(C++)
  8. Win7+theano+CUDA+Keras血泪史
  9. 系统架构设计笔记(102)—— 反不正当竞争法
  10. ScordCard in Business