2006 年 2 月 26 日 23 時 35 分

近傍法による画像の拡大


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真] [写真] [写真]


近傍法について考えてみよう。

基本は間引きによる処理を拡張したものであるため、
単純間引きと同じ特徴をもつ。

単純間引きとの違いは、任意のサイズに変更が可能なことだ。
実は、近傍法は近傍補間法とも呼ばれ、
拡大に使用することもできるのである。

アルゴリズム自体は、拡大に適用することもできるが、
昨日書いたコードは、縮小にしか使えない。
なぜならば、元のデータをそのまま置き換えているからだ。

まずは、近傍法のアルゴリズムを写真で示す。
縮小後の座標から対応する縮小前の座標を求め、
その座標位置に最も近い画素の色を使用する。

では、昨日のコードを少し訂正してみよう。

# BMP 読み込み。
my $src = read_bmp;

# 画像の幅と高さを取得。
my $scx = @{$src->[0]};
my $scy = @$src;

# 新しい画像の幅と高さを決める。
my $dcx = 105;
my $dcy = 90;

# 新しい画像のデータを準備する。
my $dest = [ map { [ (0) x $dcx ] } 1 .. $dcy ];

# 近い位置のピクセルを
# 画素を左上に持ってくる。
for (my $dy = 0; $dy < $dcy; ++$dy) {
    for (my $dx = 0; $dx < $dcx; ++$dx) {

        no integer;

        # 新しい座標に対応する元の座標を求める。
        my $sx = int($dx / ($dcx - 1) * ($scx - 1) + 0.5);
        my $sy = int($dy / ($dcy - 1) * ($scy - 1) + 0.5);

        $dest->[$dy][$dx] = $src->[$sy][$sx];
    }
}

# BMP を書き出す。
write_bmp($dest, 24);



Copyright (c) 1994-2007 Project Loafer. All rights reserved.