Как найти 5-й и 95-й процентили в гистограмме
Я пытаюсь реализовать функцию растяжения контраста в php gd, и я хочу установить 5-й процент изображения в качестве минимального значения и 95-й в качестве максимального значения. Кто-нибудь знает, как получить гистограмму и эти значения с помощью php gd?
Спасибо.
2 ответа
Решение
Боюсь, вам нужно посчитать пиксели один за другим.
$gd = // Create image of same size, copy original image into $gd
// Make grayscale
imageFilter($gd, IMG_FILTER_GRAYSCALE);
$pre = array_fill(0, 256, 0);
for ($y = 0; $y < ImageSY($gd); $y++)
{
for ($x = 0; $x < ImageSX($gd); $x++)
{
$luma = (imageColorAt($x, $y) & 0xFF); // Grayscale, so R=G=B=luma
$pre[$luma]++;
}
}
// Then you need to build the cumulative histogram:
$max = $pre[0];
$hist[0] = $pre[0];
for ($i = 1; $i < 256; $i++)
{
$hist[$i] = $hist[$i-1]+$pre[$i];
if ($max < $pre[$i])
$max = $pre[$i];
}
// Now scale to 100%
for ($i = 0; $i < 256; $i++)
{
$hist[$i] = ($hist[$i]*100.0)/((float)$hist[255]);
if ($hist[$i] >= 5)
if ((0 == $i) || ($hist[$i-1] < 5))
print "Fifth percentile ends at index $i (not included)\n";
if ($hist[$i] >= 95)
if ($hist[$i-1] < 95)
print "Ninety-fifth percentile begins at index $i (included)\n";
}
// Create graphics, just to check.
// Frequency is red, cumulative histogram is green
$ck = ImageCreateTrueColor(255, 100);
$w = ImageColorAllocate($ck, 255, 255, 255);
$r = ImageColorAllocate($ck, 255, 0, 0);
$g = ImageColorAllocate($ck, 0, 255, 0);
ImageFilledRectangle($ck, 0, 0, 255, 100, $w);
for ($i = 0; $i < 256; $i++)
{
ImageLine($ck, $i, 100-$hist[$i], $i, 100, $g);
ImageLine($ck, $i, 100.0-100.0*((float)$pre[$i]/$max), $i, 100, $r);
}
ImagePNG($ck, 'histograms.png');
Получить отсортированный список всех значений (по возрастанию для 5-го процентиля, по убыванию для 95-го). Затем просматривайте все значения до тех пор, пока длина подсписка от начала до этого индекса не станет равной 5% длины полного списка. Значение текущего индекса - это процентиль, который вы ищете. Даже не включает гистограмму.