我的数据库中有缩小图片的RGB值,并希望使用imagemagick来处理转换为Lab。但我无法为此找到代码示例。
如何使用Perl Imagemagick API将RGB颜色值转换为Lab?这甚至可能吗?
答案 0 :(得分:3)
如果它不适用于ImageMagick - 这里有一个CPAN模块,我第一次尝试搜索RGB Lab
给了我Graphics::ColorObject。
my $color = Graphics::ColorObject->new_RGB([0.5, 0.42, 0.17]);
my ($L, $a, $b) = @{ $color->as_Lab() };
答案 1 :(得分:1)
我不确定,但似乎没有办法使用Perl imagemagick API。 相反,我正在使用Perl Monks中的一些函数(用户未知):
# I do not do the linear approximation for $u/$un <= 0.008859
sub RGB2Lab {
my ($red, $green, $blue) = @_;
my ($x, $y, $z) = _RGB2XYZitu($red, $green, $blue);
my ($xn, $yn, $zn) = _RGB2XYZitu(1,1,1);
my $fx = _cuberoot($x/$xn);
my $fy = _cuberoot($y/$yn);
my $fz = _cuberoot($z/$zn);
return ( 116*$fy-16, 500*($fx - $fy), 200*($fy - $fz) );
}
sub Lab2RGB {
my ($L, $a, $b) = @_;
my ($xn, $yn, $zn) = _RGB2XYZitu(1,1,1);
my $fL = _cube(($L+16)/116);
my $fa = _cube($a/500);
my $fb = _cube($b/200);
my $y = _cube( ($L+16)/116) * $yn;
my $x = _cube( ($L+16)/116 + $a/500 ) * $xn;
my $z = _cube( ($L+16)/116 - $b/200 ) * $zn;
return _XYZitu2RGB($x, $y, $z);
}
sub _RGB2XYZitu {
my ($r, $g, $b) = @_;
return (
0.431*$r + 0.342*$g + 0.178*$b,
0.222*$r + 0.707*$g + 0.071*$b,
0.020*$r + 0.130*$g + 0.939*$b
);
}
sub _XYZitu2RGB {
my ($x, $y, $z) = @_;
return map { $_ > 1 ? 1 : $_ } (
3.063*$x - 1.393*$y - 0.476*$z,
-0.969*$x + 1.876*$y + 0.042*$z,
0.068*$x - 0.229*$y + 1.069*$z
);
}
sub _cuberoot {
my $x = shift;
return 0 if $x == 0;
my $sign = ($x < 0) ? -1 : 1;
$x *= $sign;
return $sign * exp( log($x)/3.0 );
}
sub _cube {
my $x = shift;
return 0 if $x == 0;
my $sign = ($x < 0) ? -1 : 1;
$x *= $sign;
return $sign * exp( 3 * log($x) );
}