2006 年 2 月 8 日 20 時 47 分

バランスを考えた 2 値化


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


[写真] [写真]


昨日は全体的に黒くなってしまった。
できれば白と黒のバランスをとりたい。

昨日は、127 と 128 を境界に決めうちだったが、
これを値の分布を考えて決めてみよう。
なるべく白と黒の値が等しくなるように。

まず、グレースケール化して、色を明るさで 256 段階にし、
ヒストグラムを作るときのように、
それぞれの値のピクセルがどれくらいあるか数える。
そして、大体半分半分になる境界を探し出し、
その値を閾として、白と黒に分けるのだ。

my $data = read_bmp;

# 分布計算用。
my @distribution = (0) x 256;

foreach my $line (@$data) {
    foreach my $pixel (@$line) {
        my ($red, $green, $blue) = unpack_rgb($pixel);

        no integer;

        $pixel = $red * 0.299 + $green * 0.587 + $blue * 0.114;
        $pixel = limit(int($red + 0.5), 0, 255);

        # 値を数える。
        $distribution[$pixel]++;
    }
}

# 幅と高さを取得
my $height = @$data;
my $width  = @{$data->[0]};

# 閾値を最初は 0 としておく。
my $threshold = 0;

# 全ピクセル数の半分を目標とする。
my $rest = $width * $height / 2;

# 下から順に累算し、目標を超える場所を探す。
$rest -= $distribution[$threshold++] while $rest >= 0;

# 閾値 $threshold を使って 2 値化。
foreach my $line (@$data) {
    foreach my $pixel (@$line) {
        $pixel = $pixel >= $threshold ? 1 : 0;
    }
}

my @colors = (0x00000000, 0x00ffffff);

write_bmp($data, 1, \@colors);

結果は、白黒のバランスは取れているが……
昨日と比較しても微妙な差だ。
でも、明るさが偏っている画像ならば、
昨日よりは見やすくはなるはずだ。

でも、やはりまだ満足がいかない結果となった。
これ以上の性能を望むには、
新たな考え方を取り入れる必要がありそうだ。



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