【第1回】Perlで画像処理 -ポスタリゼーション-
ある一定量の階層ごとに
画素値を決めて処理することを
ポスタリゼーションと呼ぶ。
というわけで、
出力結果
もうチョイ上手くやればイラストのようにできるらしい?
画素値を決めて処理することを
ポスタリゼーションと呼ぶ。
というわけで、
use strict;
use warnings;
use Imager;
use Image::Size;
my $img = Imager->new;
$img->read(file => 'test.png') or die $img->errstr;
my ($max_width, $max_heigth) = imgsize('test.png');
for (my $x = 0; $x < $max_width; $x++) {
for (my $y = 0; $y < $max_heigth; $y++) {
my $before_color = $img->getpixel(x => $x, y => $y);
my $after_color = posterization($before_color);
$img->setpixel(x => $x, y => $y, color => $after_color);
}
}
$img->write( file => 'after_test.png') or die $img->errstr;
sub posterization {
my ($before_color) = @_;
my ($red, $green, $blue, $alpha) = $before_color->rgba();
my @rgb = (\$red, \$green, \$blue);
my $lv0 = 0;
my $lv1 = 51;
my $lv2 = 102;
my $lv3 = 153;
my $lv4 = 204;
my $lv5 = 255;
foreach my $data (@rgb) {
if ($$data < $lv1) {
$$data = $lv0;
}
elsif ($$data < $lv2) {
$$data = $lv1;
}
elsif ($$data < $lv3) {
$$data = $lv2;
}
elsif ($$data < $lv4) {
$$data = $lv3;
}
else {
$$data = $lv4;
}
}
my $after_color = Imager::Color->new($red, $green, $blue);
return $after_color;
}
__END__
出力結果
もうチョイ上手くやればイラストのようにできるらしい?