PHP可以检测图像是否“太轻”?

时间:2014-02-05 14:34:52

标签: php

在教育网站的某个区域,学生会扫描并提交作业。

问题:当学生使用铅笔时,扫描结果非常轻,难以阅读。

可以使用PHP来检测扫描是否过轻?我想知道是否有类似的东西 可以使用Detecting colors for an Image using PHPHow to detect "light" colors with PHP,但我不确定。因此问题。

我不是必须要求代码,只是看看它是否可能以及是否存在某种已存在的功能。

根据h2ooooooo的接受答案进行更新

我想知道PNG位深度是否会导致问题。使用他的(她?)解决方案,请考虑以下内容......

此图片(“1.png”)返回 97.8456638355 ,深度为 32 ......

但是,此图片(“2.png”)会返回 98.4853859241 ,其深度为 24 ......

这是小于1%的差异,似乎1.png应该以较低的数字返回,因为它显着“更加清晰”并且总体上比2.png更暗。

是否有人知道位深度是否导致脚本无法正常工作?

4 个答案:

答案 0 :(得分:9)

如下所示的简单操作应该可行,只需浏览每个像素并使用HSL algorithm in the thread you linked即可。为了您的目的,您可以简单地获取值并将其与阈值进行比较(测试各种文档!)。

<强>代码:

<?php
    function getBrightness($gdHandle) {
        $width = imagesx($gdHandle);
        $height = imagesy($gdHandle);

        $totalBrightness = 0;

        for ($x = 0; $x < $width; $x++) {
            for ($y = 0; $y < $height; $y++) {
                $rgb = imagecolorat($gdHandle, $x, $y);

                $red = ($rgb >> 16) & 0xFF;
                $green = ($rgb >> 8) & 0xFF;
                $blue = $rgb & 0xFF;

                $totalBrightness += (max($red, $green, $blue) + min($red, $green, $blue)) / 2;
            }
        }

        imagedestroy($gdHandle);

        return ($totalBrightness / ($width * $height)) / 2.55;
    }
?>

<强>用法

<?php
    var_dump( getBrightness( imagecreatefrompng('pic1.png') ) ); 
    // 22.626517105341

    var_dump( getBrightness( imagecreatefrompng('pic2.png') ) ); 
    // 60.289981746452

    var_dump( getBrightness( imagecreatefrompng('pic3.png') ) ); 
    // 77.183088971324
?>

<强>结果:

pic1.png( 22.62%明亮):

enter image description here

pic2.png( 60.28%明亮):

enter image description here

pic3.png( 77.18%明亮):

enter image description here

注意

如果文档很大(这将遍历每个像素),这将花费很长时间。如果您希望它更快,您可以随时将调整大小的GD资源传递给该函数。

答案 1 :(得分:0)

鉴于你的解释,这确实是要走的路。 您现在处于图像处理领域。 PHP可能不是这里最好的解决方案,但通常它会在检测图像中的对比度方面愚蠢。

您实际上也可以增强对比度。这是关于此的一篇论文:http://www.cs.utexas.edu/~bajaj/cs384R10/lectures/2010_11_10_GeoModViz-Lec19a.pdf

编辑:ImageMagick可以帮助您做到这一点。

答案 2 :(得分:0)

您可以使用第一个示例中的代码并找到使用的“峰值”颜色(最暗)。如果它不够黑,你可以扔回警告。你也可以切出白色和浅灰色(假设那些是纸张颜色),然后找到颜色的平均值,如果不够深,请回复警告。 PHP虽然不是最好的语言;我见过使用ASP.NET和Javascript来执行此类操作的解决方案,并在检测到“坏”图像时自动提高对比度。

答案 3 :(得分:0)

我做了一个小调整,添加了精确选项。即使使用 precision=10,每 10 个像素检查一次,结果也没有太大差异。

function getBrightness($gdHandle) {
    $width = imagesx($gdHandle);
    $height = imagesy($gdHandle);

    $totalBrightness = 0;
    $precise=5; //lower is more precise but slower
    
    for ($x = 0; $x < $width; $x+=$precise) {
        for ($y = 0; $y < $height; $y+=$precise) {
            $rgb = imagecolorat($gdHandle, $x, $y);

            
            
            $red = ($rgb >> 16) & 0xFF;
            $green = ($rgb >> 8) & 0xFF;
            $blue = $rgb & 0xFF;
            
            $totalBrightness += (max($red, $green, $blue) + min($red, $green, $blue)) / 2;
        }
    }

    imagedestroy($gdHandle);
    return ($totalBrightness / (($width/$precise) * ($height/$precise))) / 2.55;

 // USAGE $var=getBrightness(imagecreatefromjpeg('pic1.jpg'));