いつもこの ML には、いつも大変お世話になっています。
画像の明るさを補正する場合に、この画像は少し暗いので 10% 程
明るくしよう。・・・という感覚でこれまでは、
OutPixel := InPixel * 110 div 100;
の様な感じで明るさの補正をやっていました。
InPixel はもとの、OutPixel は補正後の各ビクセルの R, G, B
いずれかの階調値で、0 ~ 255 の範囲です。
ところが、検索サイトで画像補正を検索したところ明るさ調整で
以下の様な説明を見つけました。
OutPixel := InPixel + b; // b は明るさの増分値(-255 ~ 255)
というものです。
最初のアプローチは、グラフの式で表現すると、
Y = aX // a は明るさの比率(a >= 0.00)
後のアプローチは、
Y = X + b // b は明るさの増分値(-255 <= b <= 255)
の様な感じになると思います。(X: 入力値, Y: 出力値)
いずれも直線のグラフですが、最初のアプローチでは、黒は
あくまでも黒のままですが、後のアプローチでは、黒の部分
でも明るくなってしまいます。(ひょっとしたらテレビの画面の
明るさなんかは、こんな感じでやっているんでしょうか?)
どちらのアプローチがいいのか迷っています。
基本的な質問で大変恐縮です。どなたかアドバイスを頂けない
でしょうか。
2008.11.30(Sun) 12:00
槻 誠三(けやき せいぞう)
c-yan です.
私の場合は RGB を YCbCr か YPbPr に変換して、Yを10%上げて、RGB に戻すと思います.
> (ひょっとしたらテレビの画面の明るさなんかは、こんな感じでやっているんでしょうか?)
アナログテレビであれば、色空間が YIQ で明るさが分離されているので、Yを補正して終わりだと思います.
# 白黒テレビは IQ を認識せず、Y だけ認識するので、カラーテレビと混在できたとか.
最近のデジタル放送は YPbPr なんですかね.
うちはアナログから切替えていないので良く知りません.
しかし、もはや Delphi の話題じゃないと思います.
以上です.
槻 誠三さん:
> 画像の明るさを補正する場合に、この画像は少し暗いので 10% 程
> 明るくしよう。
> 最初のアプローチは、グラフの式で表現すると、
> Y = aX // a は明るさの比率(a >= 0.00)
> 後のアプローチは、
> Y = X + b // b は明るさの増分値(-255 <= b <= 255)
> どちらのアプローチがいいのか迷っています。
直接 Delphi と関係しませんが、Delphi とグラフィックは仲がいいと
思いますので……
「10%明るくする」という言葉のとおりですと、前者になります。
しかしディスプレイの表示は実世界と異なり、輝度に上限があります
(印刷もそうですが……)。 そのため多くの表示は、うまくその輝度の
中に納まるように調整されなければなりません。 これがお書きの
問題の本質です。
結論を言うと、画像の用途や表示するべき内容によってやり方が
変わるのです。 たとえば光沢(ハイライト)のある画像では、前者の
やり方で変換しても問題ない(不自然にならない)場合が多いのですが、
人の顔だったりすると、のっぺりした印象に変わってしまうので、
肌色付近の色を明るくして、他の色はあまり変化させないという
非線形的な変換をすることがよくあります。
また印刷に回す場合には、一番暗い部分(シャドウ)と一番明るい
部分(ハイライト)の輝度が、それぞれ5~95%の範囲に入るのが
望ましいので、そのような補正をかけたりします。
輝度を変えたい目的を教えていただければ、もう少し具体的に回答
できると思います。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/
詳細なアドバイス、ありがとう御座います。
> 結論を言うと、画像の用途や表示するべき内容によってやり方が
>変わるのです。 たとえば光沢(ハイライト)のある画像では、前者の
>やり方で変換しても問題ない(不自然にならない)場合が多いのですが、
>人の顔だったりすると、のっぺりした印象に変わってしまうので、
>肌色付近の色を明るくして、他の色はあまり変化させないという
>非線形的な変換をすることがよくあります。
>
> また印刷に回す場合には、一番暗い部分(シャドウ)と一番明るい
>部分(ハイライト)の輝度が、それぞれ5~95%の範囲に入るのが
>望ましいので、そのような補正をかけたりします。
明るさひとつ取っても非常に奥の深い事がよくわかりました。
わたしの場合は、デジカメ等でとった趣味の画像を補正する程度の
用途ですので前者の方法を取ろうと思います。
c-yan さんのコメントは難解で、素人のわたしにはよく解かりません。
申し訳ありません。
>しかし、もはや Delphi の話題じゃないと思います.
すいません。おっしゃる通りです。
> 2008.12.01(Mon) 22:00
>
> 槻 誠三(けやき せいぞう)
"[Delphi:90935] Re: 画像の明るさを補正" において
c-yan <neko...@gmail.com> さんは書きました
>私の場合は RGB を YCbCr か YPbPr に変換して、Yを10%上げて、RGB に戻すと思います.
>
これ、やってみると判りますがうまく行きません。
いわゆるビデオ信号系の色空間は基本的にどれも同じで
1) R,G,B の明るさに対する寄与率を目の特性からから決め
R=G=B のとき Y=R=G=B となるように Y(輝度) の式を決める。
2) 1)の式で Y を求める。
2) R-Y, B-Y (色差)を求める。
3) R-Y, B-Y は Y よりレンジが大きくなるので、
Yと同じくらいのレンジになるように係数を掛けてから伝送する。
という非常に単純な方式で伝送のこと(白黒との共存)しか考えておりません。
色差は輝度に密接に関係していて輝度のみを単独で変更すると
色バランスが崩れます。
元画像の露出が足りなくて、輝度を上げたいという話ならば、
R, G, B に均等に係数を掛けるのがよいと思います。
+---------------------------------------------+
|Takuo Nakamura from Hino City, Tokyo JAPAN |
+---------------------------------------------+