在教育网站的某个区域,学生会扫描并提交作业。
问题:当学生使用铅笔时,扫描结果非常轻,难以阅读。
可以使用PHP来检测扫描是否过轻?我想知道是否有类似的东西 可以使用Detecting colors for an Image using PHP或How to detect "light" colors with PHP,但我不确定。因此问题。
我不是必须要求代码,只是看看它是否可能以及是否存在某种已存在的功能。
根据h2ooooooo的接受答案进行更新
我想知道PNG位深度是否会导致问题。使用他的(她?)解决方案,请考虑以下内容......
此图片(“1.png”)返回 97.8456638355 ,深度为 32 ......
但是,此图片(“2.png”)会返回 98.4853859241 ,其深度为 24 ......
这是小于1%的差异,似乎1.png应该以较低的数字返回,因为它显着“更加清晰”并且总体上比2.png更暗。
是否有人知道位深度是否导致脚本无法正常工作?
答案 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%明亮):
pic2.png( 60.28%明亮):
pic3.png( 77.18%明亮):
注意强>:
如果文档很大(这将遍历每个像素),这将花费很长时间。如果您希望它更快,您可以随时将调整大小的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'));