5

我有一个功能可以修剪图像周围的白色区域,类似于

if(imagecolorat($img, $x, $top) != 0xFFFFFF) {
    //sets where the top part of the image is trimmed
}

问题是一些图像偶尔会有一个非常接近白色的杂散像素,以至于它不引人注意,但由于它不完全是 0xFFFFFF 而是 0xFFFEFF 或其他东西,所以会破坏裁剪。我怎么能重写上面的语句,以便它对那些接近白色的图像进行评估,比如低至 0xFDFDFD,显然没有测试任何可能的值。

4

5 回答 5

6
$color = imagecolorat($img, $x, $top);
$color = array(
    'red'   => ($color >> 16) & 0xFF,
    'green' => ($color >>  8) & 0xFF,
    'blue'  => ($color >>  0) & 0xFF,
);
if ($color['red']   >= 0xFD
 && $color['green'] >= 0xFD
 && $color['blue']  >= 0xFD) {
    //sets where the top part of the image is trimmed
}

有关使用的运算符的说明,请阅读:

于 2012-10-31T13:24:21.303 回答
3

要正确检测这些灰白色,您应该将 RGB 颜色坐标转换为HSV;在 HSV 中,所有灰白色的 S 接近 0,V 接近 100(归一化)。This question has an answer with PHP code to do the conversion,因此使用该代码您将拥有:

$rgb = imagecolorat($img, $x, $top);
$hsv = RBG_TO_HSV(($rgb >> 16) & 0xFF, ($rgb >> 8) & 0xFF, $rgb & 0xFF);
if ($hsv['S'] < .05 && $hsv['V'] > .95) {
    // color is off-white
}

您可以根据需要调整常量.05.95放宽或收紧标准;您还可以使用交互式颜色选择器(例如this)来感受不同 和 值下颜色与白色的接近S程度V

于 2012-10-31T13:25:19.467 回答
0

我认为这应该做的工作:

$range = 0xFFFFFF - 0xFFFEFF;

if((0xFFFEFF - imagecolorat($img, $x, $top)) < $range){
    // do
}
于 2012-10-31T13:23:13.207 回答
0

这是执行此操作的一种方法。将你的颜色拆分成它的 RGB 分量,这样$color = 0xFFFEEF你最终会得到$red = 0xff; $green =0xfe;$蓝色 = 0xef'。然后将每个组件与您的阈值进行比较。如果这三个都在您的阈值之内,那么它就是“近乎白色”。所以你的函数将类似于(伪代码):

function is_nearly_white($r, $g, $b) {
    $threshold = 0xfd;
    return ($r > $threshold && $g > $threshold && $b > $threshold);
}
于 2012-10-31T13:25:44.553 回答
0

您可以通过对 RGB 整数应用“与”来检测接近白色。基本上与 Alin Roman 所说的相同,但更简单一点,一行。

if ((imagecolorat($img, $x, $top) & 0xF0F0F0) != 0xF0F0F0) {
    //sets where the top part of the image is trimmed
}

它应该检测从 0xFFFFFF 到 0xF0F0F0 的颜色。

于 2015-10-15T13:20:05.437 回答