[Delphi:90933] 画像の明るさを補正

125 views
Skip to first unread message

seizo

unread,
Nov 29, 2008, 10:06:28 PM11/29/08
to Del...@ml.users.gr.jp
槻 誠三(けやき せいぞう)です。

いつもこの 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

unread,
Nov 30, 2008, 7:10:58 AM11/30/08
to Del...@ml.users.gr.jp
槻さん

c-yan です.

私の場合は RGB を YCbCr か YPbPr に変換して、Yを10%上げて、RGB に戻すと思います.

> (ひょっとしたらテレビの画面の明るさなんかは、こんな感じでやっているんでしょうか?)
アナログテレビであれば、色空間が YIQ で明るさが分離されているので、Yを補正して終わりだと思います.
# 白黒テレビは IQ を認識せず、Y だけ認識するので、カラーテレビと混在できたとか.

最近のデジタル放送は YPbPr なんですかね.
うちはアナログから切替えていないので良く知りません.

しかし、もはや Delphi の話題じゃないと思います.

以上です.

高木太郎

unread,
Nov 30, 2008, 7:32:41 AM11/30/08
to Del...@ml.users.gr.jp
 こんにちは、イマジオムの高木です。 いつもお世話になっております。

槻 誠三さん:


> 画像の明るさを補正する場合に、この画像は少し暗いので 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/

seizo

unread,
Dec 1, 2008, 8:07:45 AM12/1/08
to Del...@ml.users.gr.jp
イマジオムの高木さん、c-yan さん。

詳細なアドバイス、ありがとう御座います。

> 結論を言うと、画像の用途や表示するべき内容によってやり方が
>変わるのです。 たとえば光沢(ハイライト)のある画像では、前者の
>やり方で変換しても問題ない(不自然にならない)場合が多いのですが、
>人の顔だったりすると、のっぺりした印象に変わってしまうので、
>肌色付近の色を明るくして、他の色はあまり変化させないという
>非線形的な変換をすることがよくあります。
>
> また印刷に回す場合には、一番暗い部分(シャドウ)と一番明るい
>部分(ハイライト)の輝度が、それぞれ5~95%の範囲に入るのが
>望ましいので、そのような補正をかけたりします。

明るさひとつ取っても非常に奥の深い事がよくわかりました。
わたしの場合は、デジカメ等でとった趣味の画像を補正する程度の
用途ですので前者の方法を取ろうと思います。

c-yan さんのコメントは難解で、素人のわたしにはよく解かりません。
申し訳ありません。

>しかし、もはや Delphi の話題じゃないと思います.

すいません。おっしゃる通りです。


> 2008.12.01(Mon) 22:00
>
> 槻 誠三(けやき せいぞう)

Takuo Nakamura

unread,
Dec 6, 2008, 1:54:39 PM12/6/08
to Del...@ml.users.gr.jp
ちわす。中村@ブレーンです。

"[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 |
+---------------------------------------------+

Reply all
Reply to author
Forward
0 new messages