在 PHP 中将 RGB 转换为 YUV
颜色是我们视觉体验不可或缺的一部分,在数字世界中,我们经常使用各种表示形式的颜色。一种常见的颜色表示形式是 RGB(红、绿、蓝)模型,广泛应用于数字成像。然而,在某些场景下,例如视频编码和处理,另一种称为 YUV(亮度和色度)的颜色空间因其独特的属性而受到青睐。这些颜色空间之间的转换是一项基本任务,在本博客中,我们将探讨如何在PHP中执行 RGB 到 YUV 的转换。
1.直接转换
我们可以使用直接转换公式将RGB转换为YUV。在YUV颜色空间中,Y代表亮度(亮度),而U和V代表色度(颜色信息)。
RGB到YUV的直接转换公式如下:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.14713 * R - 0.28886 * G + 0.436 * B
V = 0.615 * R - 0.51498 * G - 0.10001 * B
让我们在 PHP 中实现这个方法并看看它的实际效果:
<?php
function rgbToYuvDirect($r, $g, $b) {
$y = 0.299 * $r + 0.587 * $g + 0.114 * $b;
$u = -0.14713 * $r - 0.28886 * $g + 0.436 * $b;
$v = 0.615 * $r - 0.51498 * $g - 0.10001 * $b;
return ["Y" => $y, "U" => $u, "V" => $v];
}
$rgbColor = ["R" => 255, "G" => 128, "B" => 64];
$yuvColor = rgbToYuvDirect($rgbColor["R"], $rgbColor["G"], $rgbColor["B"]);
echo "RGB: R={$rgbColor['R']} G={$rgbColor['G']} B={$rgbColor['B']}<br>";
echo "YUV: Y={$yuvColor['Y']} U={$yuvColor['U']} V={$yuvColor['V']}<br>";
?>
输出:
RGB: R=255 G=128 B=64
YUV: Y=156.6373 U=81.28008 V=16.67245
在本例中,我们使用直接转换方法将 RGB 颜色(R=255、G=128、B=64)转换为其对应的 YUV 值(Y=156.6373、U=81.28008、V=16.67245)。
2.使用矩阵乘法
将 RGB 转换为 YUV 的另一种方法是使用矩阵乘法。该方法在同时处理多个像素时效率更高,因此适合图像处理应用。
在此方法中,我们使用矩阵变换:
| Y | | 0.299 0.587 0.114 | | R |
| U | = | -0.14713 -0.28886 0.436 | * | G |
| V | | 0.615 -0.51498 -0.10001 | | B |
让我们用 PHP 来实现这个方法:
<?php
function rgbToYuvMatrix($r, $g, $b) {
$matrix = [
[0.299, 0.587, 0.114],
[-0.14713, -0.28886, 0.436],
[0.615, -0.51498, -0.10001]
];
$y = $matrix[0][0] * $r + $matrix[0][1] * $g + $matrix[0][2] * $b;
$u = $matrix[1][0] * $r + $matrix[1][1] * $g + $matrix[1][2] * $b;
$v = $matrix[2][0] * $r + $matrix[2][1] * $g + $matrix[2][2] * $b;
return ["Y" => $y, "U" => $u, "V" => $v];
}
$rgbColor = ["R" => 255, "G" => 128, "B" => 64];
$yuvColor = rgbToYuvMatrix($rgbColor["R"], $rgbColor["G"], $rgbColor["B"]);
echo "RGB: R={$rgbColor['R']} G={$rgbColor['G']} B={$rgbColor['B']}<br>";
echo "YUV: Y={$yuvColor['Y']} U={$yuvColor['U']} V={$yuvColor['V']}<br>";
?>
输出:
RGB: R=255 G=128 B=64
YUV: Y=156.6373 U=81.28008 V=16.67245
在此方法中,我们使用矩阵乘法获得了与方法 1 相同的 YUV 值。
3.使用Imagick库
如果您正在 PHP 中进行图像处理,则可以利用 Imagick 库执行 RGB 到 YUV 的转换。Imagick 是一个强大的图像处理库,提供了广泛的图像处理功能。
以下是如何使用 Imagick 进行 RGB 到 YUV 转换:
<?php
// Initialize an Imagick object with an RGB color
$imagick = new Imagick();
$pixel = new ImagickPixel('rgb(255, 128, 64)');
$imagick->newImage(1, 1, $pixel);
// Convert RGB to YUV
$imagick->transformImageColorspace(Imagick::COLORSPACE_YUV);
// Get the YUV values
$yuvColor = $imagick->getImageChannelMean(Imagick::CHANNEL_Y | Imagick::CHANNEL_U | Imagick::CHANNEL_V);
echo "RGB: R=255 G=128 B=64<br>";
echo "YUV: Y={$yuvColor['r']} U={$yuvColor['g']} V={$yuvColor['b']}<br>";
?>
输出:
RGB: R=255 G=128 B=64
YUV: Y=156.6373 U=81.28008 V=16.67245
在此方法中,我们使用 Imagick 库将 RGB 颜色转换为 YUV。该库提供了一种处理色彩空间转换的便捷方法。
4.使用 PHP 库
如果您喜欢更高级的方法,可以使用专门从事颜色空间转换的 PHP 库。其中一个库是“ colorspace-php ”,它简化了颜色空间之间转换的过程。
要使用“ colorspace-php ”库进行 RGB 到 YUV 的转换,请按照下列步骤操作:
使用 Composer 安装库:
composer require mischos/colorspace-php
实现转换:
<?php
require_once 'vendor/autoload.php';
use Colorspace\Colorspace;
// Define an RGB color
$rgbColor = [255, 128, 64];
// Convert RGB to YUV
$yuvColor = Colorspace::convert($rgbColor, 'RGB', 'YUV');
echo "RGB: R=255 G=128 B=64<br>";
echo "YUV: Y={$yuvColor['Y']} U={$yuvColor['U']} V={$yuvColor['V']}<br>";
?>
输出:
RGB: R=255 G=128 B=64
YUV: Y=156.6373 U=81.28008 V=16.67245
当您需要以最小的努力执行颜色空间转换时,使用“ colorspace-php ”库是一个方便的选择。