このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
昨日作った読み取りルーチンを利用して、
カラーテーブルの利用頻度を調べてみよう。
まずは、カラーテーブルと同じ数の要素を持つ
カウンタ配列を用意し、0 で初期化しておく。
そして、ピクセルを全て調べて、
該当するカウンタ配列に 1 を加算する。
これで利用回数が算出できることになる。
そして、ついでに使用している色の数も数えよう。
一昨日はツールを使って調べたが、
やっぱり自分で作ってみたい。
これも簡単で、カウンタ配列を調べて、
値が 1 以上の(=使われている)要素の数を数えればいい。
では、やってみよう。
# ctable_freq.pl
use strict;
use warnings;
use integer;
# 昨日作った関数が入ったモジュールを取り込む。
# read_bmp, write_bmp をエクスポートしている。
# bmp_io って名前は規則に反してるけど、変えるの面倒。
use bmp_io;
# 昨日作った拡張版。
my ($data, $bit_count, $colors) = read_bmp;
# 8 ビット以下でなければ死んでいただく。
$bit_count <= 8 or die 'Too large bit count.';
# カウンタ配列を準備し、0 で初期化。
my @freq = (0) x @$colors;
# 全ピクセルを調査して数え上げる。
foreach my $line (@$data) {
foreach my $pixel (@$line) {
$freq[$pixel]++;
}
}
# 色を数える。
my $unique = grep { $_ } @freq;
# テスト出力。
print "$unique unique colors used.\n";
print join("\n", @freq);
とりあえず、これで数えることができた。
grep はリストの各要素に対して {} 内を評価し、
true となった要素だけの配列を返す。
リストコンテキストでは、配列をフィルタするのに使えるし、
今日のようなスカラコンテキストでは、
条件を満たす要素数を数えるのに利用できる。
my $unique = grep { $_ > 0 } @freq; でも同じ。
2 つの画像で試してみると、利用頻度がずらっと表示された。
8 色の方は全ての色がうまく使われているようだが、
216 色のほうは、結構ばらばらみたいだ。
8 色の方の出力結果を下に示しておく。
$ perl ./ctable_freq.pl < decreased_8_with_errdiff.bmp
8 unique colors used.
29331
6113
8414
4652
6680
2472
3633
6205
0
0
0
0
0
0
0
0
明日はもう少し分析しやすくしてみよう。