2012-09-18 71 views
0

我在我的數據庫中有縮減圖片的RGB值,並且想使用imagemagick來照顧到Lab的轉換。但是我一直無法找到代碼示例。如何將RGB轉換爲Lab?

如何將RGB顏色值轉換爲使用Perl Imagemagick API的Lab?這甚至有可能嗎?

+0

我想知道爲什麼這個問題似乎沒有真正的問題?我清楚地定義了我想要的。 – Thariama

+0

因爲它們可能不適用於某些客戶安裝。我正在尋找一個解決方案,而不使用另一個軟件包。我們正在使用imagemagick執行許多任務。我深入瞭解是否有辦法使用perl imagemagick API。 – Thariama

+1

@pmakholm:這是一個關閉問題的荒謬基礎。 OP甚至沒有說他不會接受另一個模塊 – Borodin

回答

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)); 
} 
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() }; 
+0

,這完全是一個在所有代碼應該運行的系統上都不可用的程序包(但是對於工作方法而言是+1) – Thariama

+1

對不起聽說。 – memowe

+1

@Thariama它默認沒有安裝。但它沒有很多[bug](https://rt.cpan.org/Public/Dist/Display.html?Name=Graphics-ColorObject),考慮到它自2005年以來沒有更新過。它也是純粹的Perl,所以你不應該有任何安裝它的困難。 (即使您必須將其複製到您的項目目錄中。) –