このアーカイブは同期化されません。 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);
結果は、白黒のバランスは取れているが……
昨日と比較しても微妙な差だ。
でも、明るさが偏っている画像ならば、
昨日よりは見やすくはなるはずだ。
でも、やはりまだ満足がいかない結果となった。
これ以上の性能を望むには、
新たな考え方を取り入れる必要がありそうだ。