Her zaman olduğu gibi, a-built-in PHP function for this yoktur. Sadece şaka. =)
Onlar oldukça monokromatik vardır Gördüğüm tüm kat planları, ben oldukça iyi bir tahmin resim, logo veya bir kat planı olduğunu için renk sayısı ve renk doygunluğu ile oynayabilirsiniz düşünüyorum.
Örn: is the image has less than 2 or 3 colors is a floor plan.
Örn: if the sum / average of the saturation is less than X it's a floor plan.
Logolar görsel olarak daha çekici olma eğilimi ise siyah ve beyaz (kat planları kullanılır ve diğer benzer renkler) dolayısıyla daha doygun renkler kullanın, sıfır ya da sıfıra çok yakın bir doygunluk var.
Burada bir Hex RGB renk doygunluğu hesaplamak için basit bir fonksiyonudur:
function Saturation($color)
{
$color = array_map('hexdec', str_split($color, 2));
if (max($color) > 0)
{
return (max($color) - min($color)) / max($color);
}
return 0;
}
var_dump(Saturation('000000')); // black 0.0000000000000000
var_dump(Saturation('FFFFFF')); // white 0.0000000000000000
var_dump(Saturation('818185')); // grey 0.0300751879699249
var_dump(Saturation('5B9058')); // green 0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink 0.8738738738738738
var_dump(Saturation('FE7A15')); // orange 0.9173228346456692
var_dump(Saturation('FF0000')); // red 1.0000000000000000
var_dump(Saturation('80FF80')); // --- 0.4980392156862745
var_dump(Saturation('000080')); // --- 1.0000000000000000
Kullanımı imagecolorat() ve imagecolorsforindex() Eğer görüntü ve tutarların her piksel / doygunluk ortalamasını hesaplar oluk döngüler basit bir işlevi uygulayabilirsiniz. Görüntü tanımladığınız özel bir eşiğin üstünde bir doygunluk düzeyi varsa resim bir logo olduğunu varsayabiliriz.
Unutmamanız gereken tek şey, bu algoritmanın uğruna ve aynı zamanda sunucu performansı uğruna tüm boyutlandırmak için akıllıca olacaktır böylece daha yüksek bir çözünürlüğe sahip görüntüler normal, daha fazla doygunluk (Özetle daha fazla piksel) sahip olmasıdır ortak bir karara (diyelim 100x100 veya 50x50) için görüntüleri onları sınıflandırmak ve bir kez sınıflandırılmış orijinal (non-resized) görüntüleri kullanabilirsiniz.
Ben burada kullanılan kod, sağlanan görüntüleri ile basit bir test yaptı:
$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');
foreach ($images as $image)
{
$sat = 0;
$image = ImageCreateFromString(file_get_contents($image));
for ($x = 0; $x < ImageSX($image); $x++)
{
for ($y = 0; $y < ImageSY($image); $y++)
{
$color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));
if (is_array($color) === true)
{
$sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
}
}
}
echo ($sat / (ImageSX($image) * ImageSY($image)));
echo '<hr />';
}
Ve işte sonuçlar:
green floor plant: 0.0151028053
black floor plant: 0.0000278867
black and white logo: 0.1245559912
stackoverflow logo: 0.0399864136
google logo: 0.1259357324
Using only these examples, I would say the image is a floor plant if the average saturation is less than 0.03 or 0.035, you can tweak it a little further by adding extra examples.