颜色检测算法 - 我应该怎么做?

2024-01-01

我在设计颜色检测系统方面有点陷入困境 - 我不太想出一种轻松完成它的方法。

-

基本上,我有一个图像库,我想按颜色排序。因此,如果用户指定“按蓝色排序”,则蓝色最多的图像将出现在结果的顶部,蓝色最少的图像将出现在底部。

问题是图像并不全是一种颜色,所以它同时做两件事:

1- 找到图像中最蓝的部分
2- 对该蓝色进行排名(基于色调和该颜色的数量)。

我尝试了大约 3 或 4 种不同的方法,但结果各不相同 - 但没有一个能很好地工作,其中 2 种是相当数学的算法(它们在纸上的效果都比实践中好得多,哈哈)。

-

我可以采取哪些不同的方式来完成整个过程?我可能错过了一些非常明显的工作方式 - 任何帮助或想法将不胜感激:)

-

EDIT:感谢您的所有回复 - 这是我迄今为止尝试过的:

  • 获取整个图像的平均 RGB 值并将其与蓝色进行比较。使用归一化的 RGB 3 空间向量进行比较并查找它们之间的距离。这种方法效果最差,没有蓝色的图像很容易出现在带有部分非常强的蓝色的图像上方。

  • 找到主色并将其与蓝色进行比较(再次使用 3 个空间矢量距离)。这不起作用,因为图像中可能有一大块蓝色部分不是最多(或在顶部的几个)主色部分。

  • 找到接近蓝色的像素,对所有这些进行平均并将答案与实际蓝色进行比较。

  • 查找所有接近蓝色的像素,增加计数并根据计数/总像素查找百分比。


我想到了两个想法:

廉价版本:将图像转换为 HSV 颜色空间,并对每个像素进行计算cos(H - target_hue)或合理的近似值(对于蓝色,target_hue将为 240 度),乘以饱和度,然后对图像中所有像素的数值进行平均。高值是最好的。请注意,比蓝色更接近黄色的颜色具有“负蓝色度”,黑色、白色和纯灰色同样具有“零蓝色度”。请注意,在这种情况下,您确实需要 HSV,而不是 HSL,因为 HSL 中的“S”不能很好地映射到感知饱和度。例如,颜色 #f8f8ff(RGB 248、248、255)在 HSL 中的饱和度为 100%(即纯蓝色),但它看起来接近白色。 HSV中相同颜色的“S”坐标只有3%,这是合理的。

不太便宜的版本:将图像转换为 CIELAB 颜色空间,丢弃 L,并计算 a*b* 空间中每个像素与目标颜色之间的距离,然后对每个像素求平均值或 RMS。低值是最好的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

颜色检测算法 - 我应该怎么做? 的相关文章

  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • C++:避免​​在重载中将字符串自动转换为布尔值

    我想创建一组方法 这些方法将根据其类型输出具有特殊格式的值 当我这样做时 到目前为止看起来还不错 static void printValue std ostringstream out int value out lt lt value
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 在 C++ 中,为什么 const 也可以工作时编译器选择非常量函数? [复制]

    这个问题在这里已经有答案了 例如 假设我有一堂课 class Foo public std string Name m maybe modified true return m name const std string Name cons
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 检测 JSON 数组中没有重复项的最快正确方法是什么?

    我需要检查数组中的所有项目是否都是唯一的serde json Value 由于该类型没有实现Hash我想出了以下解决方案 use serde json json Value use std collections HashSet fn is
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 如何使用 itextsharp 更改 PDF 公式的按钮图标?

    我目前正在尝试使用 itextsharp 填写预定义的表单 除了添加图像之外 一切正常 这之前已经在 Adob e 的 FDF 工具包中运行过 该工具包已编译为 NET 1 1 这不再适用于 NET 4 0 我改用了 itextsharp
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • 括号内声明的对象的范围

    如果我声明一个这样的对象 void main myclass objectA anotherclass true true 0 即 我通过直接调用后者的构造函数来创建一个 objectA 和另一个对象 anotherclass anothe
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • Microsoft Visual Studio 2017 中的 wxWidgets 设置

    我花了大约 20 个小时试图弄清楚如何在 Microsoft Visual Studio 2017 中设置 wxWidgets 我遵循 https wiki wxwidgets org Microsoft Visual C 2B 2B Gu
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐