0

データベースに縮小画像の RGB 値があり、 imagemagick を使用してLabへの変換を処理したいと考えています。しかし、これに関するコード サンプルを見つけることができませんでした。

Perl Imagemagick API を使用して RGB カラー値を Lab に変換するにはどうすればよいですか? これは可能ですか?

4

2 に答える 2

3

ImageMagick で動作しない場合 - これには CPAN モジュールがあり、最初に少し検索してみたところ、RGB LabGraphics ::ColorObjectが得られました。

my $color = Graphics::ColorObject->new_RGB([0.5, 0.42, 0.17]);
my ($L, $a, $b) = @{ $color->as_Lab() };
于 2012-09-18T09:08:05.407 に答える
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) );
}
于 2012-09-18T08:45:38.840 に答える