【第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__

出力結果
after_test















もうチョイ上手くやればイラストのようにできるらしい?