php 如何检测PNG图像是亮还是暗[已关闭]

xuo3flqw  于 2023-02-21  发布在  PHP
关注(0)|答案(2)|浏览(162)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

昨天关门了。
Improve this question
我一直在寻找一个解决方案来检测PNG图像的主要亮度是亮还是暗。这个概念是为所有PNG图像添加背景,但如果太亮,则添加暗背景
我通过搜索找到了一些解决方案,但似乎它们与透明背景图像配合得不太好。你能给我一些建议吗?
一些图像和预期结果:

预期结果为深色:

cvxl0en2

cvxl0en21#

很有意思。您能试试这个吗?看它适合您吗?

// Load the image using ImageMagick
$image = new \Imagick('path/to/image.png');

// Get the image dimensions
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// Create a new Imagick object with a white background of the same size as the image
$background = new \Imagick();
$background->newImage($width, $height, 'white', 'png');

// Add the image to the background
$background->compositeImage($image, \Imagick::COMPOSITE_OVER, 0, 0);

// Convert the image to grayscale
$background->modulateImage(100, 0, 100);

// Get the histogram of the image
$histogram = $background->getImageHistogram();

// Count the number of pixels at each intensity level
$count = array_fill(0, 256, 0);
foreach ($histogram as $pixel) {
    $color = $pixel->getColor();
    $intensity = round(($color['r'] + $color['g'] + $color['b']) / 3);
    $count[$intensity] += $pixel->getColorCount();
}

// Calculate the total number of pixels
$totalPixels = $width * $height;

// Calculate the total number of dark pixels (intensity < 128)
$darkPixels = array_sum(array_slice($count, 0, 128));

// Calculate the total number of light pixels (intensity >= 128)
$lightPixels = array_sum(array_slice($count, 128));

// Determine if the image is light or dark
$isLight = ($lightPixels / $totalPixels) > 0.5;

// Output the result
if ($isLight) {
    echo 'The image is light';
} else {
    echo 'The image is dark';
}

请注意,这种方法可能不适用于具有大量透明区域的图像,因为这些区域可能会使直方图向一端或另一端倾斜。在这种情况下,您可能需要使用更复杂的算法来考虑每个像素的透明度。

lkaoscv7

lkaoscv72#

1 -使用ImageMagick加载PNG图像并检索其颜色直方图。颜色直方图将给予我们图像中颜色的分布。

$image = new \Imagick('path/to/image.png');
$histogram = $image->getImageHistogram();

2 -计算图像中的像素总数。这将用于计算图像的平均亮度。

$total_pixels = $image->getImageWidth() * $image->getImageHeight();

3 -循环通过颜色直方图并计算每种颜色的亮度值之和。

$sum_brightness = 0;

foreach ($histogram as $pixel) {
    $color = $pixel->getColor();
    $brightness = ($color['r'] + $color['g'] + $color['b']) / 3;
    $sum_brightness += $brightness * $pixel->getColorCount();
}

4 -通过将亮度值之和除以像素总数来计算图像的平均亮度。

$average_brightness = $sum_brightness / $total_pixels;

5 -根据平均亮度确定图像是亮还是暗。您可以使用阈值来确定图像是亮还是暗。例如,如果平均亮度小于128(共255个),则认为图像是暗的。如果平均亮度大于或等于128,则认为图像是亮的。

if ($average_brightness < 128) {
    // Image is dark
} else {
    // Image is light
}

您可以根据需要调整阈值,具体取决于您希望如何对亮图像和暗图像进行分类。
请注意,此算法假定PNG图像具有透明背景。如果图像具有非透明背景,则可能需要修改算法以考虑背景颜色。

相关问题