Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add PerceptualHash2 #58

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
207 changes: 207 additions & 0 deletions src/Implementations/PerceptualHash2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
<?php
declare(strict_types=1);

namespace Jenssegers\ImageHash\Implementations;

use Intervention\Image\Image;
use Jenssegers\ImageHash\Hash;
use Jenssegers\ImageHash\Implementation;
use LogicException;

/**
* This is an optimised version of the original {@see PerceptualHash}
b1rdex marked this conversation as resolved.
Show resolved Hide resolved
* based on some R&D. You can read more at the issue page.
*
* @see https://github.com/jenssegers/imagehash/issues/52
*/
final class PerceptualHash2 implements Implementation
{
const DCT_11_16 = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0.99518473, 0.95694034, 0.88192126, 0.77301045, 0.63439328, 0.47139674, 0.29028468, 0.09801714, -0.09801714, -0.29028468, -0.47139674, -0.63439328, -0.77301045, -0.88192126, -0.95694034, -0.99518473],
[0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528],
[0.95694034, 0.63439328, 0.09801714, -0.47139674, -0.88192126, -0.99518473, -0.77301045, -0.29028468, 0.29028468, 0.77301045, 0.99518473, 0.88192126, 0.47139674, -0.09801714, -0.63439328, -0.95694034],
[0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953, 0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953],
[0.88192126, 0.09801714, -0.77301045, -0.95694034, -0.29028468, 0.63439328, 0.99518473, 0.47139674, -0.47139674, -0.99518473, -0.63439328, 0.29028468, 0.95694034, 0.77301045, -0.09801714, -0.88192126],
[0.83146961, -0.19509032, -0.98078528, -0.55557023, 0.55557023, 0.98078528, 0.19509032, -0.83146961, -0.83146961, 0.19509032, 0.98078528, 0.55557023, -0.55557023, -0.98078528, -0.19509032, 0.83146961],
[0.77301045, -0.47139674, -0.95694034, 0.09801714, 0.99518473, 0.29028468, -0.88192126, -0.63439328, 0.63439328, 0.88192126, -0.29028468, -0.99518473, -0.09801714, 0.95694034, 0.47139674, -0.77301045],
[0.70710678, -0.70710678, -0.70710678, 0.70710678, 0.70710678, -0.70710678, -0.70710678, 0.70710678, 0.70710678, -0.70710678, -0.70710678, 0.70710678, 0.70710678, -0.70710678, -0.70710678, 0.70710678],
[0.63439328, -0.88192126, -0.29028468, 0.99518473, -0.09801714, -0.95694034, 0.47139674, 0.77301045, -0.77301045, -0.47139674, 0.95694034, 0.09801714, -0.99518473, 0.29028468, 0.88192126, -0.63439328],
[0.55557023, -0.98078528, 0.19509032, 0.83146961, -0.83146961, -0.19509032, 0.98078528, -0.55557023, -0.55557023, 0.98078528, -0.19509032, -0.83146961, 0.83146961, 0.19509032, -0.98078528, 0.55557023],
];
const DCT_11_32 = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0.99879546, 0.98917651, 0.97003125, 0.94154407, 0.90398929, 0.85772861, 0.80320753, 0.74095113, 0.67155895, 0.5956993, 0.51410274, 0.42755509, 0.33688985, 0.24298018, 0.14673047, 0.04906767, -0.04906767, -0.14673047, -0.24298018, -0.33688985, -0.42755509, -0.51410274, -0.5956993, -0.67155895, -0.74095113, -0.80320753, -0.85772861, -0.90398929, -0.94154407, -0.97003125, -0.98917651, -0.99879546],
[0.99518473, 0.95694034, 0.88192126, 0.77301045, 0.63439328, 0.47139674, 0.29028468, 0.09801714, -0.09801714, -0.29028468, -0.47139674, -0.63439328, -0.77301045, -0.88192126, -0.95694034, -0.99518473, -0.99518473, -0.95694034, -0.88192126, -0.77301045, -0.63439328, -0.47139674, -0.29028468, -0.09801714, 0.09801714, 0.29028468, 0.47139674, 0.63439328, 0.77301045, 0.88192126, 0.95694034, 0.99518473],
[0.98917651, 0.90398929, 0.74095113, 0.51410274, 0.24298018, -0.04906767, -0.33688985, -0.5956993, -0.80320753, -0.94154407, -0.99879546, -0.97003125, -0.85772861, -0.67155895, -0.42755509, -0.14673047, 0.14673047, 0.42755509, 0.67155895, 0.85772861, 0.97003125, 0.99879546, 0.94154407, 0.80320753, 0.5956993, 0.33688985, 0.04906767, -0.24298018, -0.51410274, -0.74095113, -0.90398929, -0.98917651],
[0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528],
[0.97003125, 0.74095113, 0.33688985, -0.14673047, -0.5956993, -0.90398929, -0.99879546, -0.85772861, -0.51410274, -0.04906767, 0.42755509, 0.80320753, 0.98917651, 0.94154407, 0.67155895, 0.24298018, -0.24298018, -0.67155895, -0.94154407, -0.98917651, -0.80320753, -0.42755509, 0.04906767, 0.51410274, 0.85772861, 0.99879546, 0.90398929, 0.5956993, 0.14673047, -0.33688985, -0.74095113, -0.97003125],
[0.95694034, 0.63439328, 0.09801714, -0.47139674, -0.88192126, -0.99518473, -0.77301045, -0.29028468, 0.29028468, 0.77301045, 0.99518473, 0.88192126, 0.47139674, -0.09801714, -0.63439328, -0.95694034, -0.95694034, -0.63439328, -0.09801714, 0.47139674, 0.88192126, 0.99518473, 0.77301045, 0.29028468, -0.29028468, -0.77301045, -0.99518473, -0.88192126, -0.47139674, 0.09801714, 0.63439328, 0.95694034],
[0.94154407, 0.51410274, -0.14673047, -0.74095113, -0.99879546, -0.80320753, -0.24298018, 0.42755509, 0.90398929, 0.97003125, 0.5956993, -0.04906767, -0.67155895, -0.98917651, -0.85772861, -0.33688985, 0.33688985, 0.85772861, 0.98917651, 0.67155895, 0.04906767, -0.5956993, -0.97003125, -0.90398929, -0.42755509, 0.24298018, 0.80320753, 0.99879546, 0.74095113, 0.14673047, -0.51410274, -0.94154407],
[0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953, 0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953, 0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953, 0.92387953, 0.38268343, -0.38268343, -0.92387953, -0.92387953, -0.38268343, 0.38268343, 0.92387953],
[0.90398929, 0.24298018, -0.5956993, -0.99879546, -0.67155895, 0.14673047, 0.85772861, 0.94154407, 0.33688985, -0.51410274, -0.98917651, -0.74095113, 0.04906767, 0.80320753, 0.97003125, 0.42755509, -0.42755509, -0.97003125, -0.80320753, -0.04906767, 0.74095113, 0.98917651, 0.51410274, -0.33688985, -0.94154407, -0.85772861, -0.14673047, 0.67155895, 0.99879546, 0.5956993, -0.24298018, -0.90398929],
[0.88192126, 0.09801714, -0.77301045, -0.95694034, -0.29028468, 0.63439328, 0.99518473, 0.47139674, -0.47139674, -0.99518473, -0.63439328, 0.29028468, 0.95694034, 0.77301045, -0.09801714, -0.88192126, -0.88192126, -0.09801714, 0.77301045, 0.95694034, 0.29028468, -0.63439328, -0.99518473, -0.47139674, 0.47139674, 0.99518473, 0.63439328, -0.29028468, -0.95694034, -0.77301045, 0.09801714, 0.88192126],
];
const DCT_11_64 = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0.99969882, 0.99729046, 0.99247953, 0.98527764, 0.97570213, 0.96377607, 0.94952818, 0.9329928, 0.91420976, 0.8932243, 0.87008699, 0.84485357, 0.81758481, 0.78834643, 0.75720885, 0.72424708, 0.68954054, 0.65317284, 0.61523159, 0.57580819, 0.53499762, 0.49289819, 0.44961133, 0.40524131, 0.35989504, 0.31368174, 0.26671276, 0.21910124, 0.17096189, 0.12241068, 0.07356456, 0.02454123, -0.02454123, -0.07356456, -0.12241068, -0.17096189, -0.21910124, -0.26671276, -0.31368174, -0.35989504, -0.40524131, -0.44961133, -0.49289819, -0.53499762, -0.57580819, -0.61523159, -0.65317284, -0.68954054, -0.72424708, -0.75720885, -0.78834643, -0.81758481, -0.84485357, -0.87008699, -0.8932243, -0.91420976, -0.9329928, -0.94952818, -0.96377607, -0.97570213, -0.98527764, -0.99247953, -0.99729046, -0.99969882],
[0.99879546, 0.98917651, 0.97003125, 0.94154407, 0.90398929, 0.85772861, 0.80320753, 0.74095113, 0.67155895, 0.5956993, 0.51410274, 0.42755509, 0.33688985, 0.24298018, 0.14673047, 0.04906767, -0.04906767, -0.14673047, -0.24298018, -0.33688985, -0.42755509, -0.51410274, -0.5956993, -0.67155895, -0.74095113, -0.80320753, -0.85772861, -0.90398929, -0.94154407, -0.97003125, -0.98917651, -0.99879546, -0.99879546, -0.98917651, -0.97003125, -0.94154407, -0.90398929, -0.85772861, -0.80320753, -0.74095113, -0.67155895, -0.5956993, -0.51410274, -0.42755509, -0.33688985, -0.24298018, -0.14673047, -0.04906767, 0.04906767, 0.14673047, 0.24298018, 0.33688985, 0.42755509, 0.51410274, 0.5956993, 0.67155895, 0.74095113, 0.80320753, 0.85772861, 0.90398929, 0.94154407, 0.97003125, 0.98917651, 0.99879546],
[0.99729046, 0.97570213, 0.9329928, 0.87008699, 0.78834643, 0.68954054, 0.57580819, 0.44961133, 0.31368174, 0.17096189, 0.02454123, -0.12241068, -0.26671276, -0.40524131, -0.53499762, -0.65317284, -0.75720885, -0.84485357, -0.91420976, -0.96377607, -0.99247953, -0.99969882, -0.98527764, -0.94952818, -0.8932243, -0.81758481, -0.72424708, -0.61523159, -0.49289819, -0.35989504, -0.21910124, -0.07356456, 0.07356456, 0.21910124, 0.35989504, 0.49289819, 0.61523159, 0.72424708, 0.81758481, 0.8932243, 0.94952818, 0.98527764, 0.99969882, 0.99247953, 0.96377607, 0.91420976, 0.84485357, 0.75720885, 0.65317284, 0.53499762, 0.40524131, 0.26671276, 0.12241068, -0.02454123, -0.17096189, -0.31368174, -0.44961133, -0.57580819, -0.68954054, -0.78834643, -0.87008699, -0.9329928, -0.97570213, -0.99729046],
[0.99518473, 0.95694034, 0.88192126, 0.77301045, 0.63439328, 0.47139674, 0.29028468, 0.09801714, -0.09801714, -0.29028468, -0.47139674, -0.63439328, -0.77301045, -0.88192126, -0.95694034, -0.99518473, -0.99518473, -0.95694034, -0.88192126, -0.77301045, -0.63439328, -0.47139674, -0.29028468, -0.09801714, 0.09801714, 0.29028468, 0.47139674, 0.63439328, 0.77301045, 0.88192126, 0.95694034, 0.99518473, 0.99518473, 0.95694034, 0.88192126, 0.77301045, 0.63439328, 0.47139674, 0.29028468, 0.09801714, -0.09801714, -0.29028468, -0.47139674, -0.63439328, -0.77301045, -0.88192126, -0.95694034, -0.99518473, -0.99518473, -0.95694034, -0.88192126, -0.77301045, -0.63439328, -0.47139674, -0.29028468, -0.09801714, 0.09801714, 0.29028468, 0.47139674, 0.63439328, 0.77301045, 0.88192126, 0.95694034, 0.99518473],
[0.99247953, 0.9329928, 0.81758481, 0.65317284, 0.44961133, 0.21910124, -0.02454123, -0.26671276, -0.49289819, -0.68954054, -0.84485357, -0.94952818, -0.99729046, -0.98527764, -0.91420976, -0.78834643, -0.61523159, -0.40524131, -0.17096189, 0.07356456, 0.31368174, 0.53499762, 0.72424708, 0.87008699, 0.96377607, 0.99969882, 0.97570213, 0.8932243, 0.75720885, 0.57580819, 0.35989504, 0.12241068, -0.12241068, -0.35989504, -0.57580819, -0.75720885, -0.8932243, -0.97570213, -0.99969882, -0.96377607, -0.87008699, -0.72424708, -0.53499762, -0.31368174, -0.07356456, 0.17096189, 0.40524131, 0.61523159, 0.78834643, 0.91420976, 0.98527764, 0.99729046, 0.94952818, 0.84485357, 0.68954054, 0.49289819, 0.26671276, 0.02454123, -0.21910124, -0.44961133, -0.65317284, -0.81758481, -0.9329928, -0.99247953],
[0.98917651, 0.90398929, 0.74095113, 0.51410274, 0.24298018, -0.04906767, -0.33688985, -0.5956993, -0.80320753, -0.94154407, -0.99879546, -0.97003125, -0.85772861, -0.67155895, -0.42755509, -0.14673047, 0.14673047, 0.42755509, 0.67155895, 0.85772861, 0.97003125, 0.99879546, 0.94154407, 0.80320753, 0.5956993, 0.33688985, 0.04906767, -0.24298018, -0.51410274, -0.74095113, -0.90398929, -0.98917651, -0.98917651, -0.90398929, -0.74095113, -0.51410274, -0.24298018, 0.04906767, 0.33688985, 0.5956993, 0.80320753, 0.94154407, 0.99879546, 0.97003125, 0.85772861, 0.67155895, 0.42755509, 0.14673047, -0.14673047, -0.42755509, -0.67155895, -0.85772861, -0.97003125, -0.99879546, -0.94154407, -0.80320753, -0.5956993, -0.33688985, -0.04906767, 0.24298018, 0.51410274, 0.74095113, 0.90398929, 0.98917651],
[0.98527764, 0.87008699, 0.65317284, 0.35989504, 0.02454123, -0.31368174, -0.61523159, -0.84485357, -0.97570213, -0.99247953, -0.8932243, -0.68954054, -0.40524131, -0.07356456, 0.26671276, 0.57580819, 0.81758481, 0.96377607, 0.99729046, 0.91420976, 0.72424708, 0.44961133, 0.12241068, -0.21910124, -0.53499762, -0.78834643, -0.94952818, -0.99969882, -0.9329928, -0.75720885, -0.49289819, -0.17096189, 0.17096189, 0.49289819, 0.75720885, 0.9329928, 0.99969882, 0.94952818, 0.78834643, 0.53499762, 0.21910124, -0.12241068, -0.44961133, -0.72424708, -0.91420976, -0.99729046, -0.96377607, -0.81758481, -0.57580819, -0.26671276, 0.07356456, 0.40524131, 0.68954054, 0.8932243, 0.99247953, 0.97570213, 0.84485357, 0.61523159, 0.31368174, -0.02454123, -0.35989504, -0.65317284, -0.87008699, -0.98527764],
[0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023, 0.19509032, -0.19509032, -0.55557023, -0.83146961, -0.98078528, -0.98078528, -0.83146961, -0.55557023, -0.19509032, 0.19509032, 0.55557023, 0.83146961, 0.98078528],
[0.97570213, 0.78834643, 0.44961133, 0.02454123, -0.40524131, -0.75720885, -0.96377607, -0.98527764, -0.81758481, -0.49289819, -0.07356456, 0.35989504, 0.72424708, 0.94952818, 0.99247953, 0.84485357, 0.53499762, 0.12241068, -0.31368174, -0.68954054, -0.9329928, -0.99729046, -0.87008699, -0.57580819, -0.17096189, 0.26671276, 0.65317284, 0.91420976, 0.99969882, 0.8932243, 0.61523159, 0.21910124, -0.21910124, -0.61523159, -0.8932243, -0.99969882, -0.91420976, -0.65317284, -0.26671276, 0.17096189, 0.57580819, 0.87008699, 0.99729046, 0.9329928, 0.68954054, 0.31368174, -0.12241068, -0.53499762, -0.84485357, -0.99247953, -0.94952818, -0.72424708, -0.35989504, 0.07356456, 0.49289819, 0.81758481, 0.98527764, 0.96377607, 0.75720885, 0.40524131, -0.02454123, -0.44961133, -0.78834643, -0.97570213],
[0.97003125, 0.74095113, 0.33688985, -0.14673047, -0.5956993, -0.90398929, -0.99879546, -0.85772861, -0.51410274, -0.04906767, 0.42755509, 0.80320753, 0.98917651, 0.94154407, 0.67155895, 0.24298018, -0.24298018, -0.67155895, -0.94154407, -0.98917651, -0.80320753, -0.42755509, 0.04906767, 0.51410274, 0.85772861, 0.99879546, 0.90398929, 0.5956993, 0.14673047, -0.33688985, -0.74095113, -0.97003125, -0.97003125, -0.74095113, -0.33688985, 0.14673047, 0.5956993, 0.90398929, 0.99879546, 0.85772861, 0.51410274, 0.04906767, -0.42755509, -0.80320753, -0.98917651, -0.94154407, -0.67155895, -0.24298018, 0.24298018, 0.67155895, 0.94154407, 0.98917651, 0.80320753, 0.42755509, -0.04906767, -0.51410274, -0.85772861, -0.99879546, -0.90398929, -0.5956993, -0.14673047, 0.33688985, 0.74095113, 0.97003125],
];

/**
* @var int
*/
private $size;
/**
* @var int[][]|float[][]
*/
private $dct11;
/**
* @var float
*/
private $sizeSqrt;

public function __construct(int $size = 32)
{
switch ($size) {
case 16:
$this->dct11 = self::DCT_11_16;
break;
case 32:
$this->dct11 = self::DCT_11_32;
break;
case 64:
$this->dct11 = self::DCT_11_64;
break;
default:
throw new LogicException('$size must be 16, 32 or 64');
}

$this->size = $size;
$this->sizeSqrt = sqrt(2 / $size);
}

public function hash(Image $image): Hash
{
// Resize the image.
$resized = $image->resize($this->size, $this->size);

$matrix = [];
$row = [];
$rows = [];
$col = [];

$matrixSize = 11;

for ($y = 0; $y < $this->size; $y++) {
for ($x = 0; $x < $this->size; $x++) {
$rgb = $resized->pickColor($x, $y);
$row[$x] = (int)floor(($rgb[0] * 0.299) + ($rgb[1] * 0.587) + ($rgb[2] * 0.114));
b1rdex marked this conversation as resolved.
Show resolved Hide resolved
}
$rows[$y] = $this->calculateDCT($row, $matrixSize);
}

$rowMatrixSize = $matrixSize;

for ($x = 0; $x < $matrixSize; $x++) {
for ($y = 0; $y < $this->size; $y++) {
$col[$y] = $rows[$y][$x];
}
$matrix[$x] = $this->calculateDCT($col, $rowMatrixSize);
$rowMatrixSize--;
}

$pixels = $this->diagonalMatrix($matrix, $matrixSize);

$pixels = array_slice($pixels, 1, 64); // discard first and cut to size

$compare = $this->average($pixels);

// Calculate hash.
$bits = [];
foreach ($pixels as $pixel) {
$bits[] = (int)($pixel > $compare);
b1rdex marked this conversation as resolved.
Show resolved Hide resolved
}

return Hash::fromBits($bits);
}

/**
* Perform a 1 dimension Discrete Cosine Transformation.
*
* @param int[]|float[] $matrix
*
* @return float[]
*/
private function calculateDCT(array $matrix, int $partialSize): array
{
$dctCos = $this->dct11;
$transformed = [];

for ($i = 0; $i < $partialSize; $i++) {
$sum = 0;
for ($j = 0; $j < $this->size; $j++) {
$sum += $matrix[$j] * $dctCos[$i][$j];
}
$sum *= $this->sizeSqrt;
if ($i === 0) {
$sum *= 0.70710678118655;
}
$transformed[$i] = $sum;
}

return $transformed;
}

private function diagonalMatrix(array $mat, int $size = 11, bool $half = true)
{
$mode = 0;
$it = 0;
$lower = 0;
$result = [];
$max = ($half ? ceil((($size * $size) / 2) + ($size * 0.5)) : 0);
for ($t = 0; $t < (2 * $size - 1); $t++) {
$t1 = $t;
if ($t1 >= $size) {
$mode++;
$t1 = $size - 1;
$it--;
$lower++;
} else {
$lower = 0;
$it++;
}
for ($i = $t1; $i >= $lower; $i--) {
if ($half && count($result) >= $max) {
return $result;
}
if (($t1 + $mode) % 2 == 0) {
$result[] = $mat[$i][$t1 + $lower - $i];
} else {
$result[] = $mat[$t1 + $lower - $i][$i];
}
}
}

return $result;
}

/**
* Get the average of the pixel values.
*/
private function average(array $pixels): float
{
// Calculate the average value from top 8x8 pixels, except for the first one.
$n = count($pixels) - 1;

return array_sum(array_slice($pixels, 1, $n)) / $n;
}
}
4 changes: 4 additions & 0 deletions tests/ImplementationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Jenssegers\ImageHash\Implementations\BlockHash;
use Jenssegers\ImageHash\Implementations\DifferenceHash;
use Jenssegers\ImageHash\Implementations\PerceptualHash;
use Jenssegers\ImageHash\Implementations\PerceptualHash2;
use PHPUnit\Framework\TestCase;

class ImplementationTest extends TestCase
Expand All @@ -27,6 +28,9 @@ public function provideImplementations()
[new DifferenceHash()],
[new PerceptualHash(32, PerceptualHash::AVERAGE)],
[new PerceptualHash(32, PerceptualHash::MEDIAN)],
[new PerceptualHash2(16)],
[new PerceptualHash2(32)],
[new PerceptualHash2(64)],
[new BlockHash(8, BlockHash::QUICK)],
[new BlockHash(8, BlockHash::PRECISE)],
];
Expand Down