以编程方式确定图像的人类可读颜色(例如红色、绿色等)

2024-02-09

我正在尝试编写一个脚本,该脚本将以编程方式运行图像并告诉我它的原色。

目前该脚本获取每个像素的 RGB 值。将它们与预定义的规则进行比较,并尝试计算每种颜色的像素数。

我的问题是剧本有点碰运气。有谁知道更好的方法(也许使用更容易翻译成英语的不同颜色编码系统)或通过 RGB 定义颜色的现有规则集?

<?php
$file = "8629.jpg";

$colors = array("Red" => array("rel" => true, "r" => 0.65, "g" => 0.09, "b" => 0.25, "var" => 0.3),
                "Blue" => array("rel" => true, "r" => 0.21, "g" => 0.32, "b" => 0.46, "var" => 0.3),
                "Green" => array("rel" => true, "r" => 0, "g" => 0.67,"b" =>  0.33, "var" => 0.3),
                "Black" => array("rel" => false, "r" => 0, "g" => 0,"b" =>  0, "var" => 30),
                "White" => array("rel" => false, "r" => 255, "g" => 255,"b" =>  255, "var" => 30));                 

$total = 0;

$im = imagecreatefromjpeg($file);
$size = getimagesize($file);

if (!$im) {
    exit("No image found.");
}

for ($x = 1; $x <= $size[0]; $x++) {
    for($y = 1; $y <= $size[1]; $y++) {
        $rgb = imagecolorat($im, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;

        $colorTotal = $r + $g + $b;

        $rRatio = $r > 0 ? $r / $colorTotal : 0;
        $gRatio = $g > 0 ? $g / $colorTotal : 0;
        $bRatio = $b > 0 ? $b / $colorTotal : 0;

        foreach($colors as $key => $color) {
            if ($color["rel"]) {
                if ((($color["r"] - $color["var"]) <= $rRatio && $rRatio <= ($color["r"] + $color["var"])) &&
                    (($color["g"] - $color["var"]) <= $gRatio && $gRatio <= ($color["g"] + $color["var"])) &&
                    (($color["b"] - $color["var"]) <= $bRatio && $bRatio <= ($color["b"] + $color["var"]))) {

                    $colourCount[$key]++;
                    $total++;
                }
            } else {
                if ((($color["r"] - $color["var"]) <= $r && $r <= ($color["r"] + $color["var"])) &&
                    (($color["g"] - $color["var"]) <= $g && $g <= ($color["g"] + $color["var"])) &&
                    (($color["b"] - $color["var"]) <= $b && $b <= ($color["b"] + $color["var"]))) {

                    $colourCount[$key]++;
                    $total++;
                }
            }
        }
    }
}

var_dump($colourCount);

foreach($colourCount as $key => $color) {
    $colourPrecent[$key] = $color / $total;
}

arsort($colourPrecent);
var_dump($colourPrecent);

foreach($colourPrecent as $key => $color) {
    if ($prevVal) {
        if ($color < ($prevVal - 0.1)) {
            break;
        }
    }

    $primary[] = $key;
    $prevVal = $color;
}

echo("The primary colours in this image are " . implode(" and ", $primary));

?>

解决方案是按照 Herbert 的建议将 RGB 转换为 HSL。转换为人类的功能仍然需要一些调整/完成,但这里是:

function hslToHuman($h, $s, $l) {

$colors = array();

// Gray
if ($s <= 10 && (9 <= $l && $l <= 90)) {
    $colors[] = "gray";
}

$l_var = $s / 16;

// White
$white_limit = 93;
if (($white_limit + $l_var) <= $l && $l <= 100) {
    $colors[] = "white";
}

// Black
$black_limit = 9;
if (0 <= $l && $l <= ($black_limit - $l_var)) {
    $colors[] = "black";
}

// If we have colorless colors stop here
if (sizeof($colors) > 0) {
    return $colors;
}

// Red
if (($h <= 8 || $h >= 346)) {
    $colors[] = "red";
}

// Orange && Brown
// TODO

// Yellow
if (40 <= $h && $h <= 65) {
    $colors[] = "yellow";
}

// Green
if (65 <= $h && $h <= 170) {
    $colors[] = "green";
}

// Blue
if (165 <= $h && $h <= 260) {
    $colors[] = "blue";
}

// Pink && Purple
// TODO

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

以编程方式确定图像的人类可读颜色(例如红色、绿色等) 的相关文章

  • 从浏览器中删除cookie?

    有什么方法可以指示网络浏览器完全delete一个人的cookie是用PHP设置的吗 我不想expiry或者等待浏览器closed 对于删除 我的意思是实际上不再将其列在 cookie 列表中 尝试这样删除所有 cookie foreach
  • Laravel 5 清除视图缓存

    我注意到 Laravel 缓存视图存储在 storage framework views 随着时间的推移 他们会吃掉我的空间 我该如何删除它们 有什么命令可以吗 我试过php artisan cache clear 但它并没有清除视图缓存
  • Laravel 模型访问器从缓存中获取 - 性能增强

    我在数据库中有一个项目列表 每个项目都可以选择被否决或赞成 这些投票与其他项目字段一起存储在 MySql 中 例如这样的事情 Schema create items function table table gt increments id
  • 使用 PHP 和 xpath 中的抓取功能提取 HTML 页面中的字符串

    我需要抓取这个 HTML 页面 https www sanita puglia it monitorpo aslfg monitorps web monitorps monitorPSperASL do codNazionale 16011
  • Cakephp 在 Bluehost 上安装

    如何设置 Cakephp 才能在 Bluehost 上正常工作 我应该将我的应用程序 cake 和供应商文件夹以及 htaccess 和 index php 文件放在 public html 目录中吗 我按照这里的说明进行操作 http b
  • 将多个单词类别显示为带破折号的 1 个单词

    我有一些具有与其关联的类别的子页面 对于超过 1 个单词的类别 例如 测试类别 我需要输出为 1 个单词 空格用破折号分隔 例如 测试类别 如何重写函数来处理这个问题 public function CategoriesList if th
  • 使用 PHP 发送器和 Swift 在后台未收到 IOS GCM 推送通知

    我正在努力让后台通知在带有 GCM 的 IOS 上工作 非后台通知已经可以工作了 以下是我集成后台通知的步骤 在 UIBackgroundmodes 中启用远程通知标签 将内容可用密钥添加到我的通知负载中 在我的委托中编写 applicat
  • Laravel中间件获取路由参数

    我正在编写诸如 学校俱乐部管理系统 之类的东西 并遇到一些资源授权问题 假设有club and club有经理 我想检查用户是否是经理club在他可以使用中间件管理它之前 使用 Laravel 5 2 My router看起来像这样 Rou
  • 尝试跟踪错误,了解为何在 woocommerce 中触发 Webhook 后未发送电子邮件

    我试图了解为什么有时 webhook 似乎会触发 有时在 Woocommerce 中购买后不会触发 有一个自定义插件应该添加到custom topic我的理解是 woocommerce 插件 webhook 添加了以下代码 我将把整个代码放
  • PHP:使用 DateTime 类转换日期

    我从 PayPal IPN 获得了此日期 payment date 20 12 59 Jan 13 2009 PST 我如何转换Y m d TH i s Z 我确实尝试过 date new DateTime POST payment dat
  • 获取客户在 WooCommerce 中最后订单的产品

    我想获取客户最近一次购买的产品数据或最近一次购买的产品数据 目前我有这个 但数组的结果给了我随机购买的结果 它甚至没有给我已完成购买的数据 它为我提供了暂停购买的详细信息 我在这里需要一些帮助 这是代码 Get the current us
  • 获取 Woocommerce 单一产品页面中的产品类别名称和描述

    我一直在使用 WooCommerce Codex 但我似乎无法显示数据 我只想显示产品类别和描述 以在我自己的自定义布局的单个产品页面上显示 如下所示 由于一个产品可以有多个产品类别 因此您需要使用 foreach 循环 这 term变量是
  • PHP:CURL 可以遵循元重定向吗

    CURL 可以使用 CURLOPT FOLLOWLOCATION 遵循标头重定向 但是否可以遵循元刷新重定向 Thanks 是的 但您必须自己解析响应并查找类似以下内容 Obeying 刷新请求是浏览器端的事情 使用DOM解析来查找cURL
  • 如何限制注册用户尝试投票两次[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 php 编码和网站设计非常陌生 我正在尝试开发一个在线投票系统 只允许注册用户投票 已完成所有操作并且工作正常 但我需要的帮助是
  • 如果 CodeIgniter 方法不存在,则重定向到默认方法。

    我正在使用 CodeignIter 并且正在寻找一种在被调用方法不存在时为单个控制器编写自定义处理例程的方法 假设你打电话www website com components login In the components控制器 没有一个方
  • 在 Woocommerce 结帐中启用特定状态的交货时间选项

    基于 在 WooCommerce 结帐中添加自定义复选框 其值显示在管理员编辑订单中 https stackoverflow com questions 45905237 add a custom checkbox in woocommer
  • Laravel 自定义授权

    我在这里进行登录验证 LoginData Input except array token if Auth attempt LoginData return success 我的表不同 所以这里我更改表名称auth php table gt
  • 如何使用 php $row 检索 sql 日期时间对象?

    例如 sql SELECT FROM db query sqlsrv query conn sql while row sqlsrv fetch array query echo row date column 会崩溃 我找到的大多数答案都
  • print_r 的替代方案(仅显示最多 2 3 个键)

    我有一个multi dimensional array有 200 个键 每个键有 3 到 5 个数组 我想知道有什么方法可以只看到有限的部分 即最多 3 或 4 个键 因为如果我使用print r desiredArray 然后花费了太多时
  • 如何使用 PHP 读取/显示 XML

    有没有办法使用 PHP 读取 external xml 来自不同网站的 xml 文件 我知道有一种方法可以使用 JavaScript 读取 XML 但前提是它们都位于同一根目录中 您能否提供有关如何获取 xml 文件的示例 然后阅读以下内容

随机推荐

  • C# 中的线程安全属性

    我正在尝试在 C 中创建线程安全属性 并且我想确保我处于正确的路径上 这是我所做的 private readonly object AvgBuyPriceLocker new object private double AvgBuyPric
  • JavaFX 中的动态/即时调整大小

    如何创建一个 立即 动态调整大小的 JavaFX 应用程序 现在 我已经编写了一个简单的应用程序 可以动态调整大小 但布局更改只有在拖动鼠标按钮后才会显示 我希望在此按钮释放之前立即看到结果 布局更改 我假设这是通过将正确的值 控件与反向绑
  • 如何在java中转换为CRTP?

    我有一个非常简单的案例 我做了一些基本的通用分配 final Detail detail field getAnnotation Detail class final String example detail example final
  • OLAP 处理时出错

    我是 OLAP 新手 并且弄清楚了如何制作立方体并处理它 然而 当我玩得太多时 我最终遇到了这个错误 OLAP存储引擎中的错误 找不到属性键 表 dbo v MYEntities 列 uniqueId 值 2548 OLAP 中的错误 存储
  • 如何根据行的“属性”将数据帧行乘以数组?

    我有一个大熊猫数据框 DF 它几乎占用了我所有的 RAM 它的索引始终是以下之一 c1 c2 c3 0 1 2 n i c1 1 8 15 c2 2 9 16 c1 3 10 17 c3 4 11 18 c2 5 12 19 c1 6 13
  • 为什么 Numpy 数组中的第二个维度为空?

    为什么输出在这里 array np arange 3 array shape is 3 and not 1 3 缺失的维度意味着什么或等于什么 万一出现混乱 3 并不意味着缺少维度 逗号是单元素元组的标准 Python 表示法的一部分 形状
  • 我可以知道 char 指针变量指向的 char-array-size 吗? [复制]

    这个问题在这里已经有答案了 我必须知道 char 指针变量指向的数组大小 但你知道 sizeof 操作不起作用 char a 5 char b a int c sizeof b printf d sizeof b 8 64 bit cpu
  • != 和 !== 之间的区别[重复]

    这个问题在这里已经有答案了 就我而言 我应该使用 如下 还是 更合适 有什么区别 private function authenticateApi ip sentKey mediaServerIp 62 80 198 226 mediaSe
  • 从数组中的 COUNT 中排除空值

    如何从数组的计数中排除空值 因为计数中始终包含空值 count array filter array function x return is null x
  • 在 C# 中模拟可变参数模板

    是否有一种众所周知的方法来模拟 C 中的可变参数模板功能 例如 我想编写一个方法 该方法采用带有任意参数集的 lambda 这是我想要的伪代码 void MyMethod
  • 如何创建自定义 UIButton(带图像)但仍使用 setTitle?

    我尝试使用 UIButtonTypeCustom 创建 UIButton 然后使用以下方法调整它的外观 sendButton setImage UIImage imageNamed sendButtonOff png forState UI
  • 批处理文件最大化当前窗口

    我构建了一个批处理程序 目前正在对其进行调整 以使其更具可读性 用户友好性 我想要我的 bat文件自动设置为最大化 bat文件本身 我读到START MAX在线 但这只是打开命令提示符窗口的一个新实例 我不想有两个 bat文件只是为了最大化
  • Typescript:如何设置方法返回值=>子类

    我有一个带有两个子类的父类 abstract class Point public readonly x number public readonly y number constructor x number y number this
  • 多对多关联的 POST 请求

    我有两个具有多对多关联的实体 class User extends BaseUser and class Calendar var integer ORM Column name id type integer ORM Id ORM Gen
  • 从ggplot2中的误差条中删除端点

    我的目标是在 R 中创建箱线图 不一定要使用 ggplot2 但这就是我现在使用的 其风格与我在某处找到的示例相似 减去文本 这是我到目前为止的代码 dat lt read table file https www dropbox com
  • 如何从 HttpSessionListener 访问 JSF 应用程序范围的托管 bean? [复制]

    这个问题在这里已经有答案了 我正在运行一个JSF应用程序并声明了一些应用程序范围的支持 bean 在common beans xml或使用 ManagedBean and ApplicationScoped注释 我如何从内部访问这些bean
  • 扩展 Selenium:如何调用命令?

    我读到用户扩展 http seleniumhq org docs 02 selenium ide html user extensions and 扩展硒 http release seleniumhq org selenium core
  • 切换到特定片段会产生奇怪的 java.lang.NullPointerException

    这是我目前面临的问题 我最近从带有 ADT 插件的 Eclipse 切换到 Android Studio 并且 Android Studio 出现了一个我在 Eclipse 上从未遇到过的错误 当我切换到名为 LineFragment 的特
  • 从特定目录运行 Cronjob

    我创建了一个用于生成 RSS 提要的 php 脚本 该脚本最终将通过 Cronjob 运行 所有 php 文件和生成的 RSS xml 将位于网站的子文件夹中 如果我在本地开发计算机上的同一目录中使用终端或浏览器 则 php 脚本可以在本地
  • 以编程方式确定图像的人类可读颜色(例如红色、绿色等)

    我正在尝试编写一个脚本 该脚本将以编程方式运行图像并告诉我它的原色 目前该脚本获取每个像素的 RGB 值 将它们与预定义的规则进行比较 并尝试计算每种颜色的像素数 我的问题是剧本有点碰运气 有谁知道更好的方法 也许使用更容易翻译成英语的不同