【发布时间】:2023-03-19 19:00:01
【问题描述】:
我正在尝试编写一个脚本,该脚本将以编程方式运行图像并告诉我它是原色。
目前脚本获取每个像素的 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));
?>
【问题讨论】:
-
嗯,很有趣。恐怕我唯一的贡献是 this warning 关于定义“人类可读”的颜色!
-
考虑到真彩色图像可能使每个像素都是唯一的,除非您开始将相似的颜色“组合”在一起,否则您不会获得太多收益。也许将图像缩小到 1x1 像素并找出其主要颜色会更简单。
-
RGB 看起来像 least useful choice of color model here。 @Widor,脚本肯定会采用 IsGuy 参数。 ;)
-
在我看来HSL 将是最有用的模型,因为您可以将色相与饱和度和亮度分开。 H:0-120 = 红色,120-240 = 绿色,240-360 = 蓝色。 L:0% = 黑色,L:100% S:100% = 白色。
-
很高兴我能帮助丹。我已经使用各种颜色模型完成了一些工作。 HSL/HSV 是一种比 RGB 更自然的颜色分量思考方式。 HSL 还具有额外的优势,您可以使用它将颜色转换为等效的灰度,甚至计算 相关 和补充颜色。用 RGB 试试。 :-)