R,G,B レタッチ・アルゴリズム




更新履歴
2002年09月05日:Java プログラム CLASS 構造変更
2002年08月29日:Java プログラムマイナー改修
2002年08月25日:Java プログラム開発
2002年05月28日:アルゴリズム開発


インデックス





はじめに

自転車でツーリングに行って デジカメで写真をいっぱい撮るのだが、撮った写真は どれもこれもイマイチなのだ。 生で見た生き生きとした感じが失われている。 そこで色々とレタッチ・ソフトを探して色の修正をかけてみたのだが、どれもこれも使い物にならん!! みんなあんなん使って満足しているのだろうか?
満足できなかった俺は、自分でレタッチ・アルゴリズムを作る事にした。 たったの2日でチャチャッと作ったのだが、なかなか良い感じのアルゴリズムが完成した。 そういうわけで、ここに発表する事にする。

アルゴリズムの著作権があるのかどうか知らないが、あるのならば基本的に著作権は私 豊住洋之 に帰属する。 権利の範囲は、下記アルゴリズムの欄に記述された範囲である。 使用は営利、無償を問わず自由だが、使用する場合「へっ、使ってやるぜぇ〜」とメールしてもらえると 作者としてはとっても嬉しい。

HIROYUKI TOYOZUMI



アルゴリズム概説

基本的なアイデアは

  1. 独立にレタッチ出来る事。
  2. より明るいはよりく、より明るいはよりく、より明るいはよりになるようにする。
  3. 色に対するレタッチの場合、っぽい所だけにレタッチがかかり、他の部分にはかからないようにする。 の場合も同様。
  4. レタッチを極端に強く行った場合でも 細かいパターンが飛んでしまわないようにする。

上記条件を満足するため、以下の様なアルゴリズムを考えた。 以下色に対するレタッチの場合に限って説明する。

r, g, b, は一つのピクセルの それぞれの成分及びレタッチ後の b の値であり、取り得る最小値が 0.0、最大値が bmax の実数値である。 については、最大値が bmax を越えた場合 bmax にセットするものとする。 s以外の色成分の代表値、β色成分と以外の色成分の代表値との比、X色成分の最大値との比(0.0<X<1.0)をあらわす。 Y は 少し特殊な関数だが、β の値により以下の様な数値を取る。

この Y は レタッチのかかり具合をコントロールする項であり、このレタッチ・アルゴリズムの心臓部と言っても過言ではない。 この関数のポイントは、β<1.0 ではほぼ b/s で変化し、β>1.0 ではフラットになっていくという点だ。 β がいくら大きくなっても Y の値が高々 2.0 にしかならないと言う事が 極端なレタッチのかかり過ぎを抑制している。

式を眺めるとすぐに分かるが、条件 2. の「より明るいはよりく」の「より明るい」は X が受け持つ。 また条件 3. の「っぽい所だけにレタッチがかかり、他の部分にはかからない」は条件 b>F2s が担っている。

式の中に、3つのファクター 1.5、12 が含まれているが、ファクター 1.5 は、1 の値が 0.0〜1.0 の間で レタッチがほど良く働くように適当につけた値である。 1 は レタッチの強さを決定するパラメータであり、負の値を指定しても、1.0 より大きな値を指定しても適当に動作する。 2 は 条件 3. の「っぽい所だけにレタッチがかかり、他の部分にはかからない」の「っぽい所」を決定するパラメータであり、レタッチを行うか行わないかを判断するための色成分の最低値をコントロールする。 取り得る値は 0.0〜1.0 で、小さい値ほど「っぽい所」を判断する(他の色成分に対する相対的な)下限値が下がることになり、レタッチがより強く働くようになる。

当然だが、のレタッチに関しては、変数 r, g, b をサイクリックに入れ替えれば良い。



サンプル画像

下のイメージは レタッチのかかり方が 1 によりどれくらい変わるかを試した物である。 ここで、以下の全ての場合において、2 は 0.8 固定としている。

かなり強めの 1=1.0 の場合でも、雲の模様や、海の波の模様がそのまま残っているのが分かると思う。 また、以外の部分には 殆ど影響がでていないことにも注意して見て欲しい。

1
オリジナル画像
0.2
0.5
1.0


以下のイメージは、ちょっと暗めのにレタッチを行った例である。 違和感なくの部分が強調されているのが分かる。

オリジナル画像
レタッチ後の画像
1=0.6


以下のイメージは、以外の例である。

色に対するレタッチの例
オリジナル画像
レタッチ後の画像
1=0.4

色に対するレタッチの例
オリジナル画像
レタッチ後の画像
1=0.5


さらに、このアルゴリズムでは 各色成分に殆ど独立にレタッチを行う事が出来る。 以下のイメージはのレタッチを同時に行ったもの。

オリジナル画像
レタッチ後の画像
1()=0.6
1()=0.35




プログラム (2002年08月25日追記)

アルゴリズムを開発して3ヶ月が過ぎた。 今までは、コマンドラインのC言語テストプログラムで色々実験を重ねて来たのだが、今回 Java の勉強も兼ねて、GUI で使いやすくした。 念の為に言っておくが、私は Java の初心者だ。 しかもがつく。 Class の作り方とか目茶苦茶に違いない。 分かっているッ! だから DLしたプログラムを見て、「ここが悪い、あそこが変だ! ださすぎる!」と言うメールを出すのは遠慮してほしい。(^^)

今回の Java 版のプログラムには、RGB レタッチアルゴリズム以外に、Histogram Equalization Method (日本語では「ヒストグラム平滑化方」とでも言うのか?) を使った自動明るさ調整機能も組み入れた。 そこそこに使えるんじゃないかと思っている。 とは言え、所詮自動調整。 プロが求めるようなクオリティーにはちょっと遠い。 どうしても部分的に暗すぎたり、明るすぎて飛んでしまったりする所がでてしまうのだ。 まぁ、素人には気にならないけど。

また、今回の Java 版のプログラムでは、1点だけ、上記「アルゴリズム概説」と違うところがある。 それは、12 の与え方だ。 「アルゴリズム概説」では 12 は 0.0〜1.0 の間の値を取るとあるが、今回のプログラムでは、スライダーを使って 0〜100 の間の値を指定する様になっている。 ただ単に値が100倍になっているだけで、機能は変わり無い。 さらに、色の抑制もできるように、1 のスライダーは 0〜 ではなく -100〜 から値を取れるようになっている。

プログラムの変更は無制限。 使用は営利、無償を問わず自由だが、使用する場合「へっ、だっせーーーけど使ってやるぜぇ〜」とメールしてもらえると 作者としてはとっても嬉しい。

それから、画像形式は JPEG にしか対応していない。 申し訳ない。



プログラムのダウンロード

ダウロードは

メインのクラス名は RGBRetouch.class で、

$ java RGBRetouch

で起動できるはずだ。



スクリーンショット
起動画面
輝度調整画面
RGBレタッチ画面