检查颜色是否为蓝色(ish)、红色(ish)、绿色(ish)、

2023-11-21

我想实现一个可以按颜色过滤图像的搜索。我的图像模型最多包含该特定图像中出现的 10 个 UIColor,现在我想要一个过滤器,例如蓝色,绿色,红色,黄色。如何检查(使用指定的容差)该特定图像是否包含蓝色/绿色/...?

我尝试使用 CIE94 差异,但这与人眼感知的相似性不符。我还尝试比较色调和饱和度值,但这也不起作用。

举个例子:

`#23567E` should be blue
`#7A010B` should be red as well as `#FD4E57`
`#0F8801` should be found for green as well as `#85FE97`

我有一个具体的实例UIColor, e.g.

[UIColor colorWithRed:0.137 green:0.337 blue:0.494 alpha:1] // #23567E

这应该“等于”.blue

[UIColor colorWithRed:0.478 green:0.00392 blue:0.0431 alpha:1] // #7A010B

应该“等于”.red

等等...


如果您只想检查哪种颜色是您的 UIColor,您可以简单地获取 HSB 颜色分量并比较其色调值:

您将需要一个帮手来转换您的十六进制字符串转 UIColor

extension UIColor {
    convenience init?(hexString: String) {
        var chars = Array(hexString.hasPrefix("#") ? hexString.dropFirst() : hexString[...])
        switch chars.count {
        case 3: chars = chars.flatMap { [$0, $0] }; fallthrough
        case 6: chars = ["F","F"] + chars
        case 8: break
        default: return nil
        }
        self.init(red: .init(strtoul(String(chars[2...3]), nil, 16)) / 255,
                green: .init(strtoul(String(chars[4...5]), nil, 16)) / 255,
                 blue: .init(strtoul(String(chars[6...7]), nil, 16)) / 255,
                alpha: .init(strtoul(String(chars[0...1]), nil, 16)) / 255)
    }
}

还有一些提取其色调成分的助手:

extension UIColor {
    enum Color {
        case red, orange, yellow, yellowGreen, green, greenCyan, cyan, cyanBlue, blue, blueMagenta, magenta, magentaRed
    }
    func color(tolerance: Int = 15) -> Color? {
        precondition(0...15 ~= tolerance)
        guard let hsb = hsb else { return nil }
        if hsb.saturation == 0 { return nil }
        if hsb.brightness == 0 { return nil }
        let hue = Int(hsb.hue * 360)
        switch hue {
        case 0 ... tolerance: return .red
        case 30 - tolerance ... 30 + tolerance: return .orange
        case 60 - tolerance ... 60 + tolerance: return .yellow
        case 90 - tolerance ... 90 + tolerance: return .yellowGreen
        case 120 - tolerance ... 120 + tolerance: return .green
        case 150 - tolerance ... 150 + tolerance: return .greenCyan
        case 180 - tolerance ... 180 + tolerance: return .cyan
        case 210 - tolerance ... 210 + tolerance: return .cyanBlue
        case 240 - tolerance ... 240 + tolerance: return .blue
        case 270 - tolerance ... 270 + tolerance: return .blueMagenta
        case 300 - tolerance ... 300 + tolerance: return .magenta
        case 330 - tolerance ... 330 + tolerance: return .magentaRed
        case 360 - tolerance ... 360 : return .red
        default: break
        }
        return nil
    }
    var hsb: (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat)? {
        var hue: CGFloat = 0, saturation: CGFloat = 0, brightness: CGFloat = 0, alpha: CGFloat = 0
        guard getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) else {
            return nil
        }
        return (hue, saturation, brightness, alpha)
    }
}

游乐场测试:

let blue: UIColor.Color? = UIColor(hexString: "#23567E").color()    // r 0.137 g 0.337 b 0.494 a 1.0
let red1: UIColor.Color? = UIColor(hexString: "#7A010B").color()    // r 0.478 g 0.004 b 0.043 a 1.0
let red2: UIColor.Color? = UIColor(hexString: "#FD4E57").color()    // r 0.992 g 0.306 b 0.341 a 1.0
let green1: UIColor.Color? = UIColor(hexString: "#0F8801").color()  // r 0.059 g 0.533 b 0.004 a 1.0
let green2: UIColor.Color? = UIColor(hexString: "#85FE97").color()  // t 0.522 g 0.996 b 0.592 a 1.0

UIColor(hue: 90/360, saturation: 0, brightness: 1, alpha: 1).color()  // nil
UIColor(hue: 90/360, saturation: 1, brightness: 0, alpha: 1).color()  // nil
UIColor(hue: 90/360, saturation: 0, brightness: 0, alpha: 1).color()  // nil
UIColor.black.color()       // nil
UIColor.white.color()       // nil
UIColor.lightGray.color()   // nil
UIColor.darkGray.color()    // nil

UIColor.red.color()     // 0...15 && 346...360 = red
UIColor.orange.color()  // 16...45 = orange
UIColor.yellow.color()  // 46...75 = yellow
UIColor(hue: 90/360, saturation: 1, brightness: 1, alpha: 1).color()   // 76...105 yellowGreen
UIColor.green.color()   // 106...135 = green
UIColor(hue: 150/360, saturation: 1, brightness: 1, alpha: 1).color()  // 136...165 greenCyan
UIColor.cyan.color()    // 166...195 = cyan
UIColor(hue: 210/360, saturation: 1, brightness: 1, alpha: 1).color()  // 196...225 cyanBlue
UIColor.blue.color()    // 226...255 = blue
UIColor(hue: 270/360, saturation: 1, brightness: 1, alpha: 1).color() // 256...285 blueMagenta
UIColor.magenta.color()  // 286...315 = magenta
UIColor(hue: 330/360, saturation: 1, brightness: 1, alpha: 1).color()  // 316...345 = magentaRed
 

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

检查颜色是否为蓝色(ish)、红色(ish)、绿色(ish)、 的相关文章

随机推荐

  • Microsoft.Reporting.* 与 XML/XSLT

    我想向 NET 应用程序添加报告功能 我的数据源只是应用程序的数据模型 即可能从任何东西 不一定从数据库 生成或加载的一堆对象 最初的计划是从这些对象生成报告数据 XML 文件 然后使用 XSLT 将其转换为 XHTML 报告文件 然后可以
  • Spring Security 并发控制

    我已经使用了 spring security 3 0 7 并且正在我的项目中实现并发控制 但它不起作用 我用过
  • 如何以编程方式获取 OS X 上给定 PID 的打开文件描述符列表?

    我所看到的一切都说要使用lsof p 但我正在寻找不需要 fork exec 的东西 例如 在 Linux 上 人们可以简单地步行 proc pid fd You can use proc pidinfo与PROC PIDLISTFDS枚举
  • iOS16+ 横向显示 UIViewController 仅适用于单屏无法工作 [Swift 5.7]

    在 iOS 16 之前 横向呈现单屏对于纵向应用来说是可以的 工作代码如下 Remark 整个应用程序仅处于纵向模式 override public var shouldAutorotate Bool return false overri
  • 按下按钮即可在听筒和扬声器之间切换

    我试图通过在扬声器和耳机之间切换按钮来播放两者的音频 问题是我试图默认从耳机播放音频 但没有任何结果 然后 当我按下按钮切换到扬声器时 仍然没有音频播放 我正在从本地原始文件播放 我在清单中也有 android permission MOD
  • Internet Explorer 忽略某些域上的 cookie(无法读取或设置 cookie)

    我有一个网站 例如example com 用户可以在其中设置自己的子域 一个用户 一个子域 并上传自己的脚本 例如http somedomain example com xyzzy php将映射到 www somedomain xyzzy
  • Knockout.js 在半大型数据集下非常慢

    我刚刚开始使用 Knockout js 一直想尝试一下 但现在我终于有了借口 但是 当将表绑定到相对较小的一组表时 我遇到了一些非常糟糕的性能问题 数据 大约 400 行左右 在我的模型中 我有以下代码 this projects ko o
  • EditText 自定义字符串格式

    我搜索了与我的问题类似的每个问题 但没有成功 我的问题是这样的 我想格式化一个字符串EditText打字时 格式是这样的 它始终是一个 19 位数字 012345 01 0123456789 0 正如您所看到的 我想在用户打字时需要时添加空
  • 判断状态栏是在顶部还是底部?

    我想弄清楚如何判断状态栏的位置 顶部或底部 我尝试检查HierarchyViewer但没有看到状态栏视图 我真正需要弄清楚的是 在给定上下文的情况下 返回一种方法boolean 如果栏位于顶部则为 true 如果不在顶部则为 false 就
  • 如何确定 System.Diagnostics.Process 是 32 位还是 64 位?

    I tried process MainModule FileName Contains x86 但它引发了 x64 进程的异常 Win32Exception 仅完成了 ReadProcessMemory 或 WriteProcessMem
  • 在页面加载时重复并添加列到标题和项目模板

    除了显示数据表中的数据之外 我没有使用中继器 我正在构建一个网格 它显示用户列表和用户已分配的角色列 用复选框显示 下面用 true false 显示 但假装它们是复选框 ex 代表姓名 呼叫者 结案者 经理 超级用户 鲍勃 真实 真实 假
  • 如何使用 Nokogiri 将嵌套哈希转换为 XML

    我有很多级别的嵌套哈希 例如 foo gt bar foo1 gt foo2 gt bar2 foo3 gt bar3 foo4 gt foo5 gt bar5 我怎样才能将它们转换成这样的XML
  • 如何选择 nHibernate 子查询结果的 Count(*)

    为了在 nHibernate 中分页查询 我需要执行以下操作 Select count from Select e ID e Name from Object as e where 我尝试过以下方法 select count from Ob
  • C# 将字符串“0”解析为整数

    我有一台新笔记本电脑在工作 本周早些时候运行的代码今天不起作用 之前工作的代码经过简化 while dr Read int i int Parse dr GetString 1 现在 当数据库值为 0 时 它会失败 有时 但不可靠 这会起作
  • 使用 pandas 创建矩阵结构

    我已将包含代码和系数数据的以下 CSV 文件加载到以下数据框 df 中 CODE COEFFICIENT A 0 5 B 0 4 C 0 3 import pandas as pd import numpy as np df pd read
  • PHP 中的 A* 搜索算法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有实施A 算法在 PHP 中 我知道维基百科有一个伪代码和一个 C 伪代码的链接 但我似乎找不到已经用 PHP 编写的伪代码 我也在寻找一种高效的书面 A 算法 None
  • 理解java 8流的过滤方法

    我最近了解到StreamJava 8 中的 s 并看到了这个示例 IntStream stream IntStream range 1 20 现在 假设我们想要找到第一个既能被 3 又能被 5 整除的数字 我们可能会filter两次并且fi
  • 具有特定类型的 Backbone.Js 集合

    我有一个名为 History 的 BackboneJS 集合 它可以包含多个 Backbone JS 模型之一 从 HistoryItem 扩展 而 HistoryItem 又从 Backbone Model 扩展 我试图找到一种在加载时重
  • 身份“iPhone Developer”与钥匙串中任何有效、未过期的证书/私钥对不匹配

    我想在设备中测试我的应用程序 但我被这个错误困扰了几个小时 身份 iPhone Developer 与钥匙串中任何有效 未过期的证书 私钥对不匹配 我已经关注了本指南 我在 stackoverflow 上搜索了类似的问题 这可能会有所帮助
  • 检查颜色是否为蓝色(ish)、红色(ish)、绿色(ish)、

    我想实现一个可以按颜色过滤图像的搜索 我的图像模型最多包含该特定图像中出现的 10 个 UIColor 现在我想要一个过滤器 例如蓝色 绿色 红色 黄色 如何检查 使用指定的容差 该特定图像是否包含蓝色 绿色 我尝试使用 CIE94 差异