Skip to content

Instantly share code, notes, and snippets.

@justincarlson
Created March 14, 2019 02:46
Show Gist options
  • Save justincarlson/70ee8574c774c3b69e2532c7b276312c to your computer and use it in GitHub Desktop.
Save justincarlson/70ee8574c774c3b69e2532c7b276312c to your computer and use it in GitHub Desktop.
Estimate an Imagick image's sharpness based on average color similarity between pixels in a grid.
<?php
**
* Estimate image sharpnes based on color
* similarity in pixels in a grid.
*
* @param Imagick $img
* @return float
*/
function GetImageSharpness($img)
{
$w = $img->getImageWidth();
$h = $img->getImageHeight();
$grid = $w / 9;
$maximum = 0;
for ($x = $grid / 2; $x <= $w - $grid / 2; $x += $grid) {
$pixel = $img->getImagePixelColor($x, $grid / 2)->getColor();
$r = $pixel['r'];
$g = $pixel['g'];
$b = $pixel['b'];
$v0 = floor(0.35 * $r + 0.50 * $g + 0.15 * $b);
for ($y = $grid / 2 + 1; $y <= $h - $grid / 2; $y++) {
$pixel = $img->getImagePixelColor($x, $y)->getColor();
$r = $pixel['r'];
$g = $pixel['g'];
$b = $pixel['b'];
$v = floor(0.35 * $r + 0.50 * $g + 0.15 * $b);
if ($maximum < abs($v - $v0)) {
$maximum = abs($v - $v0);
$xmax = $x;
$ymax = $y;
}
$v0 = $v;
}
}
for ($y = $grid / 2; $y <= $h - $grid / 2; $y += $grid) {
$pixel = $img->getImagePixelColor($grid / 2, $y)->getColor();
$r = $pixel['r'];
$g = $pixel['g'];
$b = $pixel['b'];
$v0 = floor(0.35 * $r + 0.50 * $g + 0.15 * $b);
for ($x = $grid / 2 + 1; $x <= $w - $grid / 2; $x++) {
$pixel = $img->getImagePixelColor($x, $y)->getColor();
$r = $pixel['r'];
$g = $pixel['g'];
$b = $pixel['b'];
$v = floor(0.35 * $r + 0.50 * $g + 0.15 * $b);
if ($maximum < abs($v - $v0)) {
$maximum = abs($v - $v0);
$xmax = $x;
$ymax = $y;
}
$v0 = $v;
}
}
$maxv = 0;
$minv = 255;
for ($x = $xmax - 4; $x <= $xmax + 4; $x++) {
for ($y = $ymax - 4; $y <= $ymax + 4; $y++) {
$pixel = $img->getImagePixelColor($x, $y)->getColor();
$r = $pixel['r'];
$g = $pixel['g'];
$b = $pixel['b'];
$v = floor(0.35 * $r + 0.50 * $g + 0.15 * $b);
if ($v > $maxv) $maxv = $v;
if ($v < $minv) $minv = $v;
}
}
return round(($maximum / (15 + $maxv - $minv)) * 27000 / 255, 2);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment