SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで学ぶグラフィックス処理

ヒストグラムの拡張・平坦化によるカラー画像の補正

ヒストグラムを補正して画像を鮮明にする


  • X ポスト
  • このエントリーをはてなブックマークに追加

ヒストグラムは画像の明るさの分布を表わすものですが、これを補正すると、より鮮明な画像に変換できます。本稿では、ヒストグラムの拡張と平坦化の2種類の補正方法を選んで実行できるようにし、カラー画像の改善を図りました。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 ヒストグラムは画像の明るさの分布を表わすものですが、これを補正すると、より鮮明な画像に変換できます。ヒストグラムの拡張と平坦化の2種類の補正方法を選んで実行できるようにし、カラー画像の改善を図りました。

対象読者

 画像のヒストグラムに興味を持ち、レタッチソフトなどにあるヒストグラム補正機能の原理を知りたい人。

必要な環境

 J2SE 5.0を使っていますが、それより古いバージョンでも大丈夫です。

ヒストグラムとは

 ヒストグラム(Histogram)とは分布図のことで、レタッチソフトなどに用いられるヒストグラムは、横軸に左から0~255のレベルを示し、縦軸にはLuminosity(輝度)、RGB(R、G、Bの平均)、R、G、Bを切り替えて表示します。

 ヒストグラムが左に偏っていると暗い画像、右の場合は明るすぎる画像で、中心に集中しているとコントラストの低い眠い画像になります。

ヒストグラムの補正

 原画像のヒストグラムをとり、これを補正してから、画像を表示すると、コントラストが改善された画像が得られます。ヒストグラムの補正方法には、ヒストグラムの拡張(Histogram SpreadingまたはHistogram Stretching)と、ヒストグラムの平坦化(Histogram Equalization)の2種類があります。ヒストグラムの拡張のみを行ない、これを平坦化と称している場合もあります。

 補正の対象とするヒストグラムは、Luminosity(輝度)、またはRGB(R、G、Bの平均)が一般的です。

ヒストグラムの拡張

 図1の左に示すような、分布範囲が狭く単峰性のヒストグラムを持った画像を補正するのに適した方法です(例は暗い画像)。原画像のminレベルを補正画像の0レベルに、原画像のmaxレベルを補正画像の255レベルになるように、比例的にレベルを拡張すると、図の右のようなヒストグラムができます。全ピクセル数(この場合は面積)は同じですから、拡張すると、ヒストグラムに隙間が生じます(図はイメージを表していますので、実際とはやや異ります)。

図1 ヒストグラム拡張の原理
図1 ヒストグラム拡張の原理

 本稿で紹介するプログラムでは、濃度レベルは、0から255までの256レベルとし(プログラムではLEVEL=256で定義)、全体のピクセル数(SIZE=76800で定義)の0レベルから数えて1%に当るレベルをmin、99%をmax、50%レベルをmid(ヒストグラムの拡張には使用しませんが参考値として)としています。1%から99%は一例で、既存ソフトでは、これを任意に変更できるものもあります。

 ヒストグラムの拡張は、minレベルをレベル0に、maxレベルをレベル255に変換し、中間レベルは比例配分で変換して行ないます。具体的には、原画像の任意のレベルをdとしたとき、補正後のレベルd1は、下の式で表わされます。

dの範囲d1の値

 これは、図2のトーンカーブでレベル変換するのと同じ意味を持ち、コントラストの向上に役立つことが分かります。暗い原画像の場合には、傾斜部分が左に、明るい場合は右に移動します。

図2 ヒストグラムの拡張と等価なトーンカーブ
図2 ヒストグラムの拡張と等価なトーンカーブ

ヒストグラムの平坦化

 これは、明部と暗部を共に持つ原画像の補正に適しています。図3の上部に示すように、ヒストグラムが両端に分かれている画像の場合は、minmaxの値が0と255に近いので、ヒストグラムの拡張はあまり効果がありません(ここでは、説明のためにminmaxを示していますが、ヒストグラムの平坦化には使用しません)。

 原画像の全ピクセル数をSIZEとすると、0から255までの、すべてのレベルの頻度がSIZE/256になるように変換するのが、ヒストグラムの理想的な平坦化です。

 これを式で表わすと、

 

 となります。ただし、P(i)は原画像ヒストグラムにおけるレベルiのピクセル数です。d1は整数値をとりますので、小さいP(i)が続くと、異なるdに対して同一のd1が割り当てられ、大きいP(i)が来ると、d1が不連続になりますので、理想どおりにはなりません。

 実際には、原画像ごとに上記の計算を行い、dd1の変換表(Look Up Table)をあらかじめ作成しておき、これでヒストグラムの変換を行ないます。

 図3の左下は、理想的な補正をイメージ的に示したものですが、実際には、頻度の大きいレベルを細かい複数のレベルに分割することはしないで、隣のレベルとの間隔を広げて調整しますので、図3の右下に示すようになります。これもイメージ的な図ですが、部分的に平均すると、頻度値がほぼ一定していることが分かります。

図3 明部と暗部が共にある画像に有効なヒストグラムの平坦化
図3 明部と暗部が共にある画像に有効なヒストグラムの平坦化

 

カラー画像のヒストグラム補正の問題点

 ヒストグラム補正による画像の改善は、グレイスケール画像には非常に効果があります。しかし、カラー画像では色相のズレの問題が発生します。たとえば、カラー画像にグレイの部分があったとします。このピクセルにおいては、R、G、B各成分は同じです。しかし、画像の他の部分に赤色の濃い部分があると、相対的にRは低い値となり、コントラスト増強のためにR成分が抑えられ、シアンがかった色に変わってしまいます。このように、ヒストグラム補正はピクセルごとのR、G、B比率を保存するものではないことに注意してください。

 これを防ぐために、画像を色相(Hue)、彩度(Saturation)、輝度(LuminanceまたはLuminosity)で表現し、輝度のみをヒストグラム変換し、色相、彩度はそのままにする手法もあります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
プログラムの概要

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで学ぶグラフィックス処理連載記事一覧

もっと読む

この記事の著者

石立 喬(イシダテ タカシ)

1955年東京工大卒。同年、NECへ入社し、NEC初のコンピュータの開発に参画。磁気メモリ、半導体メモリの開発、LSI設計などを経て、1989年帝京大学理工学部教授。情報、通信、電子関係の教育を担当。2002年定年により退職し現在に至る。2000年より、Webサイト「Visual C++の勉強部屋」を公開。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/214 2006/11/06 19:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング