« 2009年3月 | トップページ | 2009年5月 »

24bit → 8bit 減色


リンク
画像の変換(目次ページ)
ディザ関連
パターン・ディザ
誤差拡散法
・24bit→8bit減色

24bit の画像を 8bit (256 color) にする方法について、です。

《元データ (24bit RGB)》
source data (24 bit color)

この絵の色分布(ヒストグラム)を調べると下記のようになります。
白っぽい背景の面積が大きいので、その部分にピークが出ます。

色の分布を3次元表示すると下記のようになります。
(横:Green,縦:Red,奥行:Blue)
分布がある領域に固まっている事がわかります。


別の画像のヒストグラムを調べると下記のようになります。
《元データ (24bit RGB)》
source data (24 bit color)



このように、通常の絵のヒストグラムは、ある領域に分布が集まったもの、
あるいは、幾つかの分布領域が組み合わさったものになります。


さて、24bit の画像を 8bit (256色) に減色する事について考えましょう。

『24bit → 8bit 減色』というのは、
最近ではほとんど必要性が無くなってしまったのかもしれません。
昔は・・・
ディスプレイ(モニター)が 256 色にしか対応していなかったりで、
より奇麗に見せるための技術として、
あるいは、インターネット回線が細いために、
Web ページを少しでも軽くする、という目的で有用な技術でした。


まずは、例によって、最も簡単なアイデアからです。
最も簡単な減色方法の考え方は、
R,G,B それぞれを等分割する。
というものです。
下記は、「RとGを7分割、Bを5分割」したものです。
R = { 0, 43, 85, 128, 170, 213, 255 };
G = { 0, 43, 85, 128, 170, 213, 255 };
B = { 0, 63, 127, 191, 255 };
の組み合わせでパレットを作成し、
元絵のそれぞれのピクセル値を一番近いパレット値に置き換えたものです。

《固定パレット》
(24bit→8bit (245 color))》
reduced color into fixed palette by threshold

《固定パレット》
(24bit→8bit (245 color))》
reduced color into fixed palette by threshold

芸術的な感じに仕上がりました。
ですが、元々の画像からは遠くなっています。

元絵に近づけるために『誤差拡散法』を利用できないでしょうか?

元絵のピクセル値(R:G:B) と選択したパレット値 (R':G':B')の差分を
「誤差拡散法」で拡散する。
つまり、
  ⊿R = R - R'
  ⊿G = G - G'
  ⊿B = B - B'
の (⊿R,⊿G,⊿B)を 7/16, 3/16, 5/16, 1/16 の比率で誤差拡散。


このやり方で作ったのが下記です。
「誤差拡散なし」よりも「誤差拡散あり」の方が奇麗だと思います。
(あくまで、個人的な感想ですが。)

《固定パレット》
(24bit→8bit (245 color))
+誤差拡散(Floyd-Steinberg)》
reduced color into fixed palette with error diffusion

《固定パレット》
(24bit→8bit (245 color))
+誤差拡散(Floyd-Steinberg)》
reduced color into fixed palette with error diffusion

誤差拡散のお陰で、質感は上がりましたが、
やはり「誤差拡散」特有の点々があるために、表面がザラザラした感じがします。
(言い方が抽象的だなぁ)

もう少しリアルな表面のスベスベ感、フワフワ感を出せないでしょうか?

考えてみると、固定パレットには無駄なエントリ(=パレット要素)が多すぎます。
たとえば、金魚の絵では、緑色のパレットは要りません。
その代わりに、赤と黄色の中間色を追加した方が奇麗になりそうです。
そうやってパレットを最適化したものが下記です。
《最適化パレット》
(24bit→8bit)
+誤差拡散(Floyd-Steinberg)》
reduced color into adaptive palette(generate by median cut) with error diffusion

《最適化パレット》
(24bit→8bit)
+誤差拡散(Floyd-Steinberg)》
reduced color into adaptive palette(generate by median cut) with error diffusion


では、『最適化パレットの作り方』です。

「メディアン・カット(Median Cut,中央値分割)」という方法を用います。

それぞれの画像でヒストグラムを求めると下記のようになったとします。
(実際には R-G-B の3次元です。)


メディアン・カットは、まずピクセル領域を絞り込む事から始めます。
これがコツっぽいです。

次に、領域に含まれるピクセル数が半々になるように分割します。
分割したら、それぞれの領域を絞り込みます。

これを何度か繰り返します。

「何度か」という表現が曖昧ですが、
終了条件としては、
・領域の大きさがある一定値よりも小さくなったらそれ以上分割しない。
・領域に含まれるピクセル数が一定値よりも少なくなったら分割しない。
というやり方でよさそうです。
分割が終わったら、領域(=立方体、Cube )の端点をパレットに追加します。

この時、外側の点(上図の赤い)はパレット登録した方が奇麗になります。
密集点(上図の緑の)はどれか1つを登録します。

最後に画像を比較しておきましょう。(見た目の比較)
《元データ (24bit RGB)》
source data (24 bit color)

《固定パレット》
(24bit→8bit (245 color))》
reduced color into fixed palette by threshold

《固定パレット》
(24bit→8bit (245 color))
+誤差拡散(Floyd-Steinberg)》
reduced color into fixed palette with error diffusion

《最適化パレット》
(24bit→8bit)
+誤差拡散(Floyd-Steinberg)》
reduced color into adaptive palette(generate by median cut) with error diffusion

注)実は、このメディアン・カット、
RGB ではなく、YCbCr に変換してからカットを行っています。
(「その方が良さそうな気がする」というだけの理由です。)
しかし、如何せん、プログラマが私ですから、パレットの選択がまだまだ甘い。
そんな訳で、ちゃんとした「最適化パレット」というよりは、
「最適化パレット(なんちゃって)」というのが本当のところです。

ちなみに、上記《固定パレット》で用いたパレットを表したものが下記です。

上記、金魚の《最適化パレット》で用いたパレットは下記です。

《元データ (24bit RGB)》
source data (24 bit color)

《固定パレット》
(24bit→8bit (245 color))》
reduced color into fixed palette by threshold

《固定パレット》
(24bit→8bit (245 color))
+誤差拡散(Floyd-Steinberg)》
reduced color into fixed palette with error diffusion

《最適化パレット》
(24bit→8bit)
+誤差拡散(Floyd-Steinberg)》
reduced color into adaptive palette(generate by median cut) with error diffusion

上記、フルーツ盛り合わせの《最適化パレット》のパレットは下記です。

| | コメント (0) | トラックバック (0)

誤差拡散法


リンク
画像の変換(目次ページ)
ディザ関連
パターン・ディザ
・誤差拡散法
24bit→8bit減色

【誤差拡散法 (Error Diffusion Method)】
誤差拡散法について理解する前に、
それよりも単純な『繰り越し法 (Carry Over Method)』について理解しましょう。
注)『繰り越し法』, "Carry Over Method" といのは、
私が勝手に名付けたので、世の中で通用するかどうかは知りません。


繰り越し法は次のようなアイデアです。
・累積が 255 になったらプロットする。
・プロットできなかったら次のピクセルに持ち越す。


実際には、プロットする条件を “128 以上”とした方が原画に近くなります。
すなわち、
・累積値(A)が 128 以上になったらプロットする。
・A<128 の場合は、次のピクセルに貯金(A)を繰り越す。
・A≧128 の場合は、次のピクセルに借金(255ーA)を繰り越す。

この方法によって得られたのが次の絵です。
《繰り越し法 (256色→2色)》
convert to monochrome by carry over method

《繰り越し法》
(R,G,Bそれぞれ256色→2色)
256 color to 2 color for each R,G,B by carry over method

『パターン・ディザ法』に比べて幾何学模様は無くなりましたが、
代わりに、点と点が波模様になってウネウネっとしていますね。
これを『モアレ』と呼びます。

この『繰り越し法』ではモアレがひどすぎて使用に堪えません。
『誤差拡散法』はこれを改良したものです。



『誤差拡散法』では、貯金を次の1ピクセルだけに渡すのでは無くて、
周囲のピクセルにばらまきます(押しつけます)。

『誤差拡散法』の中で代表的な Floyd-Steinberg 法では、
・直後のピクセルに 7/16 渡す。
・1ライン下の3ピクセルに それぞれ 3/16, 5/16, 1/16 で分配する。
という方法をとります。
「誤差」を「まき散らす(拡散する)」ので『誤差拡散法』と呼ばれます。
注)「Floyd-Steinberg 法」以外の方法は、
分配率がいろいろと変えられています。
分配率を変える事で、画質が変わったり、計算処理スピードが変わります。


この『誤差拡散法』によって得られたのが次の絵です。
《誤差拡散法(Floyd-Steinberg)》
(256色→2色)
convert to monochrome by error diffusion method

《誤差拡散法(Floyd-Steinberg)》
(R,G,Bそれぞれ256色→2色)
256 color to 2 color for each R,G,B by error diffusion method

パターン・ディザに比べても、ずっと金魚っぽいですね。
とても8色とは思えません。
しかし、よくよく見てみると、
(背景部分などに)波線模様『モアレ』が出ています。

この『モアレ』を低減するために、
奇数ラインと偶数ラインとで走査方向を入れ替える手法が取られます。

『モアレ』を完全に取り除く事はできませんが、低減できます。
《誤差拡散法(Floyd-Steinberg)》
(走査線を左から右、右から左)
256 color to 2 color for each R,G,B by error diffusion method

走査線を「右から左」「左から右」だけではなく、
もっと複雑(ジグザグ)にする方法もあるらしいです。
『ヒルベルト曲線』や『ペアノ曲線』という曲線で行うらしいです。

「しかし、その場合はどのピクセルに誤差を押し付けるんだろう?」
疑問です。


最後に、画質を比較しておきましょう。
(とは言っても主観比較ですが。)
「客観的評価について」
画質の比較を定量的に行う方法が無いわけでもなさそうです。
しかし、単純に PSNR を求める事を考えても、
色の階調が違うので、
エッジ検出したり、ガンマ補正掛けたりと、とんでもなく大変そう。
知覚特性もあるだろうし。
(そんな理由で、主観比較のみです。)
《元データ (24bit RGB)》
source data (24 bit color)

《パターン・ディザ》
(R,G,Bそれぞれ256色→2色)
256 color to 2 color for each R,G,B by pattern dither

《誤差拡散法(Floyd-Steinberg)》
(走査線を左から右、右から左)
256 color to 2 color for each R,G,B by error diffusion method

代表的な誤差拡散パターン
【Floyd-Steinberg】
  curr 7/16
3/16 5/16 1/16

【JaJuNi (Jarvis, Judice & Ninke)】
    curr 7/48 5/48
3/48 5/48 7/48 5/48 3/48
1/48 3/48 5/48 3/48 1/48

【Stucki】
    curr 8/42 4/42
2/42 4/42 8/42 4/42 2/42
1/42 2/42 4/42 2/42 1/42

【Burkes】
    curr 4/16 2/16
1/16 2/16 4/16 2/16 1/16

| | コメント (2) | トラックバック (0)

ディザリング(パターン・ディザ)

ディザリング(dithering)

リンク
画像の変換(目次ページ)
ディザ関連
・パターン・ディザ
誤差拡散法
24bit→8bit減色

ディザリング(ディザ法)というのは、デジタル Audio の量子化や
デジタル静止画の減色方法の事です。

静止画に関しては、元々は、印刷機やプリンターで
「いかに本物らしく表現できるか」
という事から発達した技術です。

古くは、印刷機は白と黒の2色(2階調)しかありませんでした。
カラードットプリンタではインクの色数が増えていますが、
それでも数色です。

最近のモニター(PCではグラフィックカード)ではフルカラー(true color)
に対応しているのは当たり前ですが、
windows 出だしの頃は 256 色しか対応していないものが多くありました。

ディザ法が発達した背景にはこのような歴史があります。

ここでは静止画の減色方法の内、有名な2つの方法を紹介します。
・パターンディザ (Pattern Dither)
・誤差拡散法 (Error Diffusion Method)
減色方法はこれ以外にもありますし、この2つにアレンジを加えた亜種も
多数存在します。
このリンク先(英語)が詳しい

【パターンディザ (Pattern Dither)】
まず、このモノクロ(256階調)の絵を白黒(2階調)にする事を考えましょう。

《元データ (256階調)》
source data (256color)

もっとも単純なアイデアは、
 0~127 を 0 に
 128~255 を 255 に
する事です(2値化)


こうやって得られた結果は、

《単純2値化 (256色→2色)》
convert to monochrome by threshold

失敗した魚拓のようです。
これでは、ちょっと使えないです。

では、パターン・ディザ法です。
パターン・ディザでは、
4x4 のマトリックス(=行列,テーブル)を用いて処理を行います。
注) 2x2 や 16x16 が用いられる場合もあります。
(さらに変形したものもあります。)


《良く使われる 4x4 ディザ・マトリックス》
0 8 210
12 414 6
311 1 9
15 713 5
0~15の数字を、縦横それぞれランダムになるように配置したものです。

次に、変換対象の画像を 4x4 ピクセルの大きさで格子状に切っていきます。
この金魚の写真の場合は、320x240ピクセルです。80個x60個 に切る事になります。

パターン・ディザの基本的な考え方は、
『4x4 ピクセルの元データをマトリックスの 4x4 それぞれと比較して、
 マトリックス値以上なら点を打つ(プロットする)』
というものです。
元絵が256階調の場合は、マトリックスが16階調なので、16倍して
階調を合わせてから用います。

注) 上図では、
 黒い■がプロットされたピクセル、
 白い□がプロットされないピクセルを表しています。
 (黒=0x00,白=0xFF と紛らわしくってスイマセン)

注2)正確には、
ディザ・マトリックス x16 (16倍)ではなく
ディザ・マトリックス x16 +8 とすべきなのかもしれません。

このようにしてパターン・ディザによって作られた絵が下記です。
《パターン・ディザ (256色→2色)》
convert to monochrome by pattern dither

グラデーション部分に幾何学模様が目立ちます。
これが、パターン・ディザの特徴です。

それでは、元絵がカラーの場合はどうでしょうか。
《元データ (24bit RGB)》
source data (24 bit color)

元 BMP ファイル

R,G,B 分解すれば、それぞれは 256 階調ですから
同じアルゴリズムが適用できます。
《パターン・ディザ》
(R,G,Bそれぞれ256色→2色)
256 color to 2 color for each R,G,B by pattern dither

色が付いただけで、モノクロより金魚っぽくなりますが、
モノクロが2色なのに比べ、こちらは8色なので、
色数による表現力の違いでしょう。

同じように単純2値化を使って変換してみましょう。
《単純2値化》
(R,G,Bそれぞれ256色→2色)
256 color to 2 color for each R,G,B by threshold

単純2値化に比べると、パターン・ディザの方が
ずっと質感が出ているようです。

実際のプリンタではピクセル単位よりも細かく dpi (dot per inch)
を設定する事によって、より質感が出せそうです。

注) プリンタのインクは RGB ではなく、CMYK が一般的です。
(シアン、マジェンタ、イエロー、ブラック)
なので、C,M,Y,K に分解してからディザを掛ける事になります。
また、それぞれの色をちょっとだけずらすと発色が良くなったり
とか、細かいノウハウが沢山あるらしいです。

| | コメント (2) | トラックバック (0)

画像の変換(目次ページ)

RGB⇔YCbCr変換
ディザリング
画像の拡大縮小
エッジ強調
アウトラインフォントとアンチエイリアシング

| | コメント (0) | トラックバック (0)

食器棚


引っ越してから1年と4ヶ月経って、ようやく食器棚の設置。

なかなか踏ん切りが付かずに後手後手になってしまった訳ですが。

1ヶ月程前に「さぁ購入するぞ」と決めて、振込みを行った後に
(不景気のため)年間の収入が減る事が決定的になる始末。

しかも、天板はこだわって人工大理石をチョイスしたのですが、
この大理石、近所の駅の公衆トイレに使われている人工大理石の色違いでした。

時折り、思い出すんだろうなぁ。

| | コメント (0) | トラックバック (0)

ボルトやナットではつまらない。

ノーベル物理学賞の南部陽一郎さんが東大入学式の祝辞として
「人はボルトやナットのような規格品ではつまらない。」
と言葉を贈ったそうだ。

この言葉そのものは大賛成なのだが、
今の若い人達を取り巻く環境はどうだろう。

社会構造そのものが、彼らに規格品化を強制しているところが
あるんじゃないだろうか。

そんな背景を見越しての祝辞だろうか。


以前、脳科学者の茂木健一郎さんが『プロフェッショナル仕事の流儀』
という番組の中でこんな事を言っていました。
「人間がチャレンジするためには安全基地が必要」

たとえ失敗しても戻る事ができる安全基地(ホーム)があれば、
人は失敗を恐れずにチャレンジする事ができる。

しかし、失敗ができない状態、
人生アウェイ状態では萎縮してチャレンジすらできない。

今の若い人達はどうなのだろうか。


という事を書いていたら、日テレの『深イイ話』という番組で
石原都知事が卒業する中学生に送った言葉が紹介されていた。
「親も先生もオール5を取れと言うかもしれないが、
 それは優秀な人間とはいえない。
 それでは役に立たない役人ぐらいにしかなれない。
 社会が求めている優秀な人間とは、
 他の誰にも考えつかないことを考え、
 それを実行できる人間である。」

石原さんに対する好き嫌いは大きく分かれる人ではあるが、
この言葉は南部さんの言葉よりも重いんじゃないだろうか。
中学生と言わず、東大生に対しての言ったとしても
十分重みがある言葉だろう。

| | コメント (0) | トラックバック (0)

フレックス廃止

富士通(2002)、シャープ(2002)、
キャノン(2003)、
三洋(2005)、
NEC(2009)

企業でフレックスタイム制度を廃止する動きが続いている。
(正確には“廃止”ではなく“休止”という言い方をしている。)

雇用者側はきまって「コミュニケーションを円滑にするために」という言い方。
「出社時間、退社時間がバラバラだと会議を調整するだけでも大変でしょう」
みたいな言い方をする。

しかしその実態は、従業員を締め付ける事が目的のようだ。

たいていの組合はログインにパスワードが必要になっているようだが、
そうでない所もある。
日立関連労働者懇談会(日立の組合?)
NEC&関連労働者ネットワーク(NECの組合?)
F2(富士通の“裏”組合?)
愚痴ともボヤキとも思える書き込みが見られる。
(ただし、従業員の総意ではなく偏った意見である可能性を否定できない。)

これらの愚痴から、実態が垣間見えるようだ。

「フレックス休止」がなぜ固定費(人件費)の圧縮につながるのか。
まず、「フレックス休止」は「残業ゼロ」と必ずセットになっている。
やむを得ない場合に限り残業する事になるが、
残業を行うためのハードルを上げる事で会社側の支出を抑える事ができる。

今まで残業代目当てでダラダラ仕事をしていた従業員を締め出す事ができる。

(注) フレックス制度のままだと上司が部下に早出残業指示ができない、
という法律解釈がある。

もう1つは「裁量性労働者への逆ワークシェアリング」
「裁量性」は「年俸制」と言った方が分かりやすいかもしれない。
「名ばかり管理職」というのを聞いたことがあるかもしれないが、
「裁量性」というのは管理職でない担当者でも残業代カットできる仕組み。

日立では「HIワーク」、NECでは「Vワーク」と呼んでいる。
東芝や松下にも類似の仕組みが存在する。
これらの裁量性労働者には残業代を払う必要が無い。
(特別な場合(深夜や休日出勤など)を除く。)
つまり会社から見れば、彼らに仕事を集中させ死ぬほど働いてもらえば
人件費が削減できる仕組みだ。

このような締め付けが横行すると、従業員同士の関係はギスギスしたものになる。
「言われた事はちゃんとやる。しかし言われていない事は一切やらない。」
チームワークなど望めるわけもないし、
技術やノウハウの伝承など、うまく行くはずがない。

もっとひどいのは「会社や上司に媚(こび)を売る」のが増える事。
会議をやって議事録を書いてれば、あるいは電話しまくっていれば、
さも忙しそうに働いているように見える。
しかしアピールに必死になっても生産性には寄与しない。
こういう人達を「会社の犬」「社畜」という。


企業であれば、物を製造したりサービスを提供したりして対価を得ている。
物やサービスを享受しお金を払ってくれるのはお客様だから、
お客様の方を向いて仕事をするのが本来あるべき姿。当たり前の姿である。

ところが上司にアピールすることばかり考えていると、
向いている方向が全く違う、お客様に意識が向いていない。
仕事に対する姿勢の問題なのです。


数年前のことですが、
富士通というメーカーの人事部が鳴り物入りで『成果主義』を導入したそうです。
「成果を出した人間がより多くの給料をもらえる仕組みを作れば
 モチベーション(=やる気)がアップ」
というキャッチフレーズでした。
本当にそれで「会社が良くなる」と信じてやったのか、
それとも「人件費削減のための詭弁」だったのかはわかりませんが、
他メーカーに先駆けて導入して、鼻高々だった事でしょう。

その結果、会社の経営は傾いたそうです。

どいつもこいつも、自己アピールのための『成果報告書』作りに夢中になってしまった、
というのが真相のようです。
お客様そっちのけでゲームを始めてしまった会社に、市場競争力はありません。

もっとも、『成果報告書作成ゲーム』にならないように『評価原理』をちゃんと
導入できるような優れた人事部だったらそうはならなかったのでしょうが、
ゲームが始まる事を見抜けなかった程度の思考回路にそれができるはずもなく。
所詮ソロバンを弾いて費用計算しかしない人事総務部ですから、経営哲学、理念
を期待する方が無茶な話なのでしょう。
頭の中には悪知恵、悪巧みしか詰まっていないのかもしれません。


今回の『フレックス休止』という名の『従業員締め付け』にも
『成果主義導入』に似たリスクを感じます。

普段大人しい人間が急に声高に叫び始めると、
たいていの場合、裏に何か策略があると思ってよいでしょう。
何かきっかけがあるから動き出す訳ですね。


生産現場に居ると、
企業の生産性(『現場力』や『社員力』という言い方をしますが、)
それが日に日に落ちていくのをヒシヒシと感じます。

『天空の城ラピュタ』が『バルス』の一言でバラバラと崩壊し始めたように、
従業員のモラルやプロ意識、責任感が音を立てて崩れていくようです。


ところが『固定費削減』という『従業員締め付け』を社外発表したりすると
株価が上がったりするから不思議です。
株主というのはサディストなんでしょうか。
長期的な事業成長よりも、
短期的な収支にしか興味が無い株主が多いからそうなるのでしょうが、
それにしても困ったものです。


問題の本質は、
不景気や赤字について経営者が(ポーズはするものの)責任を取らず、
ほぼ全てを従業員に押し付け、構造改革に着手しようとしない事です。

無駄なものはいっぱいあります。
・無駄な会議
・無駄な資料作成
・日和見の製品展開
・(言いたくないですが)無駄な人間

そういった『経営改革』の声が聞こえてこないで『締め付け』ばかりが目に付く
会社であれば、すでに終わっているのかもしれません。

日本人の良さを忘れないようにしないといけませんね。
日本人の良さって何だったのでしょうね。


学生で現在就職活動されている方は、
会社の従業員に対する扱いを、会社の将来性を計るバロメーターのひとつとして
考慮されると良いかもしれません。

| | コメント (0) | トラックバック (0)

« 2009年3月 | トップページ | 2009年5月 »