2006 年 2 月 17 日 22 時 32 分

利用頻度を調べる


このアーカイブは同期化されません。 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

明日はもう少し分析しやすくしてみよう。



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