2012-09-18 5 views
0

내 데이터베이스에서 축소 된 그림의 RGB 값을 가지고 있으며 imagemagick을 사용하여 Lab으로 변환 처리하고 싶습니다. 하지만이 코드 샘플을 찾을 수 없었습니다.어떻게 RGB를 실험실로 변환 할 수 있습니까?

Perl Imagemagick API를 사용하여 RGB 색상 값을 Lab으로 변환하려면 어떻게해야합니까? 이것은 가능한가?

+0

이 질문이 진짜 질문이 아닌 이유를 알고 싶습니다. 나는 내가 원하는 것을 분명히 정의했다. – Thariama

+0

일부 고객 설치에서는 사용하지 못할 수도 있습니다. 다른 패키지를 사용하지 않고도 해결책을 찾고있었습니다. 우리는 많은 작업에 imagemagick을 사용하고 있습니다. 나는 이것을 위해 perl imagemagick API를 사용할 방법이 있는지를 알기 위해 interessted되었다. – 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 기본적으로 설치되지 않습니다. 2005 년 이후로 업데이트되지 않았다는 것을 고려하면 매우 많은 [버그] (https://rt.cpan.org/Public/Dist/Display.html?Name=Graphics-ColorObject)가 없다. 또한 순수하다. 펄, 그래서 당신이 그것을 설치하는 데 어려움이 없어야합니다. (프로젝트 디렉터리에 복사해야하는 경우에도 마찬가지입니다.) –

관련 문제