以下、本発明の好ましい実施形態について、添付図面を参照して説明する。図1は、本発明における実施形態の複合機1の外観構成を示す斜視図である。なお、以下の実施形態は本発明を具体化した一例にすぎず、本発明の要旨を変更しない範囲で、実施例を適宜変更できることは言うまでもない。
図1に示すように、本複合機1は、下部に設けられたプリンタ2と、上部に設けられたスキャナ3と、スキャナ3の正面側に設けられた操作パネル4とを一体的に備えたMFP(Multi Function Peripheral)であり、コピー機能、ファクシミリ機能、パーソナルコンピュータ(以下単に「PC」と称す)など外部のコンピュータ(図示せず)から受信したデータを記録用紙に記録(印刷)するプリンタ機能など複数の機能を実現するものである。
スキャナ3は、FBS(Flatbed Scanner)として機能する原稿読取台6に対して、自動原稿搬送機構(ADF:Auto Document Feeder、以下「ADF」という。)7を備えた原稿カバー8が、背面側の蝶番を介して開閉自在に取り付けられてなる。横長の直方体に形成された原稿読取台6の上面にはプラテンガラスが配設されており、原稿読取台6の内部には、図示しない画像読取ユニットが内蔵されている。
原稿読取台6の内部には、上記画像読取ユニットの移動スペースや、画像読取ユニット或いはそれを支持する部材および駆動させる機構などを配設するスペースが確保されているため、原稿読取台6の上面はプラテンガラスよりも大きく形成されているが、原稿読取台6は、プラテンガラスと平面視で概ね相似形(平面視で横方向に長い矩形状)に形成されている。
このように構成されたスキャナ3をFBSとして使用する場合は、原稿カバー8を開いてプラテンガラス上に原稿を載置し、その後、原稿カバー8を閉じて当該原稿を固定する。そして、読取開始指令が入力されると、上記画像読取ユニットがプラテンガラスの裏面に沿って走査される。これにより、FBSによる原稿の画像読取りが行われる。
上記画像読取ユニットは、複合機1の奥行き方向を主走査方向とするラインイメージセンサを備えたものであり、光源を発光させて原稿に光を照射し、原稿からの反射光をレンズにより光電変換素子に導き、光電変換素子が反射光強度に応じた電気信号を出力することによって画像を読み取る。ラインイメージセンサとしては、密着型のCIS(Contact Image Sensor)、或いは、縮小光学系のCCD(Charge Coupled Device)や、CMOS(Complementary Metal−Oxide Semiconductor:相補型金属酸化膜半導体)などを適用することができる。なお、画像読取ユニットやスキャナ3の内部構成の構成は本発明に直接関係がないので、ここでは詳細な説明は省略する。
ADF7は、原稿トレイ9から原稿排出トレイ10へ原稿搬送路を通じて原稿を搬送するものである。ADF7による原稿の搬送過程において、原稿が原稿読取台6上の読取面を通過され、該読取面の下方に待機する上記画像読取ユニットによって該原稿の画像が読み取られる。このようなADF7による画像読取りは、原稿カバー8が原稿読取台6に対して閉じられた状態で行われる。なお、本発明においてADF7は任意の構成であり、スキャナ3がADF7を具備せず、FBSとしてのみ画像読取を行うものであってもよい。したがって、ADF7の詳細な説明については省略する。
プリンタ2は、スキャナ3で読み取られた画像データ或いは外部から入力された画像データに基づいて、記録用紙上に画像を記録する画像記録装置である。このプリンタ2は、上述したように、スキャナ3の下方に配設されている。スキャナ3とプリンタ2は、それらの背面が同一面となるように位置決めされているため、複合機1の背面は凸凹のない平坦形状となっている。なお、プリンタ2は、画像記録方式にインクジェット方式を用いたインクジェットプリンタで構成されているが、電子写真方式や熱転写方式などの種々の画像記録方式を採用することができるのはもちろんである。
複合機1の正面側、換言すれば、プリンタ2の正面側には開口5が形成されている。この開口5内に給紙トレイ14及び排紙トレイ15が完全に内包されるように設けられている。給紙トレイ14と排紙トレイ15は上下二段となるように配設されており、上段に排紙トレイ15が設けられ、その下方に給紙トレイ14が設けられている。
プリンタ2の正面側の端面17は、上述したように原稿読取台6が横長の直方体に形成されているため、スキャナ3の正面側の端面18から所定幅だけ正面側に突出している。以下、このように正面側に突出したプリンタ2の正面側の端部を突出部16と称する。なお、プリンタ2の横幅はスキャナ3の横幅に合わせて形成されている。従って、複合機1は平面視で略正方形をなしている。
プリンタ2には、給紙トレイ14の奥側から上方へ延びた後に正面側へU字状に湾曲して排紙トレイ15に連結される用紙搬送路が設けられている。給紙トレイ14に収容された記録用紙は、その短辺を先頭にして用紙搬送路に送り出され、Uターン搬送されることによって用紙搬送路中に設けられた画像記録位置に案内される。そして、該画像記録位置で、画像が記録用紙に記録される。画像記録後の記録用紙は排紙トレイ15に排出される。
プリンタ2の上記開口5の上側には、接続パネル70が設けられている。この接続パネル70には、その左端側にUSB端子71が配設されている。USB端子71は、外部機器とUSB接続することにより該外部機器と本複合機1とを通信可能に接続するコネクタ端子である。また、接続パネル70の右端側にはスロット部72が配設されている。スロット部72はメモリカード(カード型メモリ)を装填可能な複数のカードスロットが設けられている。カードスロットにメモリカードが装填され、該装填されたメモリカードから画像データが後述の制御部20(図2参照)により読み出される。
複合機1の正面側には、操作パネル4が設けられている。操作パネル4は、突出部16の上方の空きスペースに適合するよう、横長形状に形成されている。換言すれば、操作パネル4は、その縦幅が、スキャナ3の縦幅からプリンタ2の縦幅を減じた長さ(空きスペースの縦幅)に収まる寸法に形成されている。操作パネル4は、プリンタ2やスキャナ3を操作するためのものであり、各種操作キー40と液晶ディスプレイ(LCD:Liquid Crystal Display)41とを具備する。ユーザは、操作パネル4を用いて、所望の指令を入力することができる。複合機1に所定の指令が入力されると、その入力された情報に基づいて該複合機1の動作が制御部20によって制御される。
特に、本実施形態の複合機1は、操作キー40として、コピーモードキー、FAXモードキーなどの各種モードキーを備えている。これらのモードキーにより、ユーザはいずれかのモードを選択する。コピーモードが選択されている場合、スキャナ3により読み取った画像データは、プリンタ2により記録される。FAXモードキーが選択されている場合、スキャナ3により読み取った画像データは、通信回線を介して他のファクシミリ装置に送信される。
なお、複合機1は、操作パネル4から入力された指令のほか、PCなどのコンピュータに接続されて該コンピュータからプリンタドライバやスキャナドライバ等を介して送信される指令に基づいて動作するようにシステム構成されている。
図1に示すように、LCD41は、操作パネル4に配置可能な最大の縦幅に大型化されている。一方、LCD41の横幅(横寸法)は、その縦幅の4/3倍よりも長いものである。換言すれば、LCD41の縦幅に対する横幅の寸法の比率が4/3より大きく設定されている。LCD41の縦幅に対する横幅の比率は8/3となっている。
図2は、上記のように構成された複合機1の電気的構成を示すブロック図である。この
複合機1は、ケーブルを介してPCと接続可能なインターフェイス(以下「I/F」と称する)であるパラレルI/F29と、デジタルカメラと接続可能なUSB端子71と、外部メディア(例えば、メモリカードなどフラッシュメモリにより構成される記録媒体)を着脱自在に装着可能なスロット部72とを備えている。このため、PC、デジタルカメラ、外部メディアから画像データを入力することができるようになっている。そして、入力された画像データに対して、レティネックス処理による画像処理(画像補正)を行うことができるように構成されている。
制御部20は、プリンタ2、スキャナ3及び操作パネル4を含む複合機1の動作を統括的に制御するものである。制御部20は、図2に示すように、CPU(Central Processing Unit)21、ROM(Read Only Memory)22、RAM(Random Access Memory)23、EEPROM(Electrically Erasable and Programmable ROM)24を主とするマイクロコンピュータとして構成されており、バス25を介してASIC(Application Specific Integrated Circuit)26に接続されている。
CPU21は、この複合機1を総括的に制御する中央演算処理装置である。ROM22は、CPU21により実行される各種制御プログラムやそのプログラムを実行する際に用いられる固定値などを記憶するものであり、コピー動作、プリンタ動作、ファクシミリ動作などを行うための制御プログラム22aと、レティネックス処理などの画像処理を行う画像処理プログラムを22bと、参照点数メモリ22cとを備えている。
画像処理プログラム22bは、パラレルI/F29、USB端子71、スロット部72を介して、PC、デジタルカメラ、外部メディアから入力された画像データ(元画像データ)に対しレティネックス処理(Retinex処理)を実行して、画像データの逆光画像部分などの低画質領域の補正を行った出力画像データを生成するように構成されている。図3から図6のフローチャートに示すプログラムは、画像処理プログラムの一部としてこのROM22に記憶されている。
参照点数メモリ22cは、元画像の平均輝度値を生成するために元画像に対して実行されるフィルタ演算で使用されるガウスフィルタにおいて、フィルタ演算に実際に用いる要素数(参照点数)を記憶するメモリである。尚、本実施形態では元画像と縮小画像とのそれぞれに対してガウスフィルタによるフィルタ演算が行われるが、以降、元画像に対して用いられるガウスフィルタを入力マスク、縮小画像に対して用いられるガウスフィルタを縮小マスクと称す。
この参照点数メモリ22cに記憶される数は、M×Nのマトリクスで形成される入力マスクの全要素数よりも少ない数とされており、全要素数の1/30程度を下限値としている。
レティネックス処理においては、ガウスフィルタによるフィルタ演算が行われるが、本複合機1においてフィルタ演算に用いられるガウスフィルタ(入力マスク及び縮小マスク)は、後述するマスク生成処理(S12)(図6参照)で生成される。マスク生成処理(S12)において入力マスクが生成される際には、CPU21にて参照点数メモリ22cが参照され、この参照点数メモリ22cに記憶される数分の要素にだけフィルタ係数が格納される。つまり、要素が各所で間引かれた間引きパターンを有するマスクが形成されることとなる。
RAM23は、CPU21が上記プログラムを実行する際に用いる各種データを一時的に記録する記憶領域又は作業領域として使用される書き換え可能なメモリである。RAM23には、複合機1の起動に伴って読み込みが指示されているプログラムやメイン処理のプログラムのためのロードエリア、及びメイン処理に必須の固定値などを記憶するためのエリア等として固定的に確保される領域以外に、実行されるプログラムに対して動的に割り当てられる可変領域が設けられている。各プログラムの実行時には、この可変領域の空き領域(使用されていない領域)において、そのプログラム動作に必要なメモリ領域(記憶領域や作業領域)が確保される。
一般にプログラムは、実行に際し、そのプログラム動作のために必要なメモリ領域を、必要最小量から最大量までの範囲でCPU21に要求する。そして、十分な空き領域があれば、プログラムを実行するために必要なメモリ領域が、要求された範囲内で、割り当てられる。複数のプログラムが並行して実行される場合には、各プログラムに割り当てられるメモリ領域は、要求された必要最小量から最大量までの範囲内で、状況に応じて変更される。
また、例えば、新たにプログラムが動作された場合には、現在動作中の他のプログラムに割り当てられているメモリ領域は圧縮され、作動中のプログラムが終了した場合には、現在動作中の他のプログラムに割り当てられているメモリ領域は拡張されるなど、メモリ領域は動的に割り当てられる。
画像処理の実行時には、画像処理プログラム23bを実行するために必要なメモリ領域が、画像処理用バッファ23aとしてRAM23に確保される。尚、当然のことながら、プログラムの実行に必要なメモリ領域よりも空き領域が少なければ、プログラムを実行するのに必要なメモリ領域を確保できないので、プログラムは実行不能となる。
この画像処理用バッファ23aは、元画像メモリ23a1と、縮小率メモリ23a2と、輝度値メモリ23a3と、縮小レティネックス画像メモリ23a4と、ヒストグラムメモリ23a5と、最大値メモリ23a6と、最小値メモリ23a7と、クリップ値メモリ23a8と、入力マスクメモリ23a9と、縮小マスクメモリ23a10と、分割要素数メモリ23a11と、対数値メモリ23a12と、refle値メモリ23a13と、出力画像メモリ23a14とを備えている。なお、「s」は、縮小画像についての接尾辞であり、元画像については、接尾辞を付さないものとする。
元画像メモリ23a1は、画像処理を行う前の元画像データを記憶するメモリであり、PC、デジタルカメラ、外部メディアから、それぞれ、パラレルI/F29、USB端子71、及びスロット部72を介してプリンタ2へ入力された画像データ(元画像データ)を記憶するものである。この元画像メモリ23a1に記憶される元画像データは、新たに複合機1に画像データが入力されると、入力された画像データで更新される。尚、元画像データには、そのサイズを示すサイズデータが付加されており、元画像メモリ23a1には、この元画像のサイズデータについても記憶されている。
ここで、元画像データは、ラスタデータであって元画像を形成する各画素の画素値(信号強度値、RGB値)で構成されている。なお、本実施形態では、元画像データ及び出力画像データはいずれも、RGB値から構成され、これらの各RGB値は、「0」〜「255」の範囲の値である。
RGB値は、光の3原色である赤を表すR値と、緑を表すG値と、青を示すB値とを構成成分とする値である。光の3原色の混色により各種の色は生成されるので、元画像の各画素の色は、R値とG値とB値との組合せ(RGB値)により1の色(色相や階調など)が示される。このRGB値の値が大きいほど、輝度(明度)は高くなる。
本実施形態においては、かかる元画像データ(RGB値)に対して直接的にレティネックス処理を行うのではなく、元画像データのRGB値を輝度信号Yに変換してからレティネックス処理を実行するように構成されている。従って、RGB値のそれぞれに対してレティネックス処理を行う場合に比べて、レティネックス処理後の出力画像において元画像のカラーバランスを維持することができる。
縮小率メモリ23a2は、元画像から縮小画像を作成する際の縮小率を記憶するメモリである。本複合機1では、元画像データに対してレティネックス処理を行うが、元画像から求められる反射率(対数値R)を正規化するパラメータは、縮小画像の反射率(対数値Rs)から求められる。故に、縮小画像を形成する必要がある。用いられる縮小画像はサイズが小さい程、対数値Rsを求めるために必要なメモリ量や、算出された各対数値を記憶するためのメモリ量を低減できる。しかし、縮小画像が小さくなるほど画像精度が低下するので、求められるパラメータも不正確なものとなる。つまり、正確なパラメータを算出できる縮小画像サイズには、下限値がある。従って、正確なパラメータを算出し得る最も小さなサイズが縮小画像の最適サイズとなり、本複合機1は、かかる最適サイズで縮小画像を形成するように、縮小画像の画像サイズは予め定めた固定サイズとされている。
縮小画像のサイズが固定されている一方で、入力される元画像(元画像データ)はユーザ任意のサイズであるので、固定サイズの縮小画像を形成するために、元画像のサイズに応じて縮小率は変更されることとなる。このため、元画像データの入力毎(異なる元画像に対する画像処理の実行毎)に縮小率が算出され、この縮小率メモリ23a2に記憶される。
この縮小率は、元画像のサイズと縮小画像のサイズとの比、つまり、元画像データに付加されたサイズデータと、既知である縮小画像のサイズデータとの比で導出される。サイズデータは、画像のX軸方向の画素数と、画像のY軸方向の画素数とで形成されている。一般に画像においては、X軸方向とY軸方向とで画素数が異なることが多いので、本実施形態においては、縮小率は、元画像および縮小画像の長辺の画素数の比と、短辺の画素数の比との2種類で求められる。そして、求められた値が縮小率としてこの縮小率メモリ23a2に記憶されている。縮小画像は、かかるX軸方向の縮小率とY軸方向の縮小率とのそれぞれに基づいて、元画像を縮小して形成される。
輝度値メモリ23a3は、RGB値から(5)式に従って算出された輝度信号Y(Ys)と色信号Cb,Crを記憶するメモリである。
複合機1では、上記したように、入力された元画像の元画像データ(RGB値)に直接レティネックス処理を行うのではなく、RGB値を輝度信号Yに変換してからレティネックス処理を行うように構成されている。RGB値から変換された輝度信号Yなどは、変換元のRGB値の座標(x,y)に対応してこの輝度値メモリ23a3に記憶される。そして、この輝度値メモリ23a3に記憶される輝度信号Yや輝度信号Ysに基づいて、反射率や出力値Out
yが生成される。
ここで、複合機1は、出力画像の出力値Outyを生成するために、縮小画像と元画像との両者から、合計2回、反射率(対数値Rs及び対数値R)を算出する。反射率の算出に際しては、算出元の画像データ(縮小画像データ、元画像データ)のRGB値から輝度信号Ysまたは輝度信号Yがそれぞれ生成され、この輝度値メモリ23a3に書き込まれる。元画像の輝度信号Yの生成に先立って、縮小画像の輝度信号Ysは生成され、輝度値メモリ23a3に書き込まれる。輝度値メモリ23a3に記憶された縮小画像の輝度信号Ys等は、その後、元画像の輝度信号Yが生成されるタイミングで、0クリアされ、新たに、元画像データのRGB値から生成された輝度信号Yなどが輝度値メモリ23a3に記憶される。
輝度信号Yおよび色信号Cb,Crは、RGB値から(5)式に従って算出されるが、RGB値は、予め定められた範囲「0」〜「255」であるので、輝度信号Yも予め定められた範囲の値となり、実際には「0」〜「255」となる。このため、本実施形態では上記(4)式における元画像の信号強度値I(x,y)は、輝度信号Y(x,y)又は輝度信号Ys(x,y)とされて、レティネックス処理がなされた輝度信号Y(輝度信号Ys)が、出力値Outyとして生成されることとなる。
尚、この輝度信号Y及び輝度信号Ysが請求項記載の画素値に該当する。また、本実施形態においては、輝度信号Y(輝度信号Ys)に対しレティネックス処理を行う構成としたが、これに代えて、RGB値をそのまま用いてレティネックス処理を行うようにしても良い。
縮小レティネックス画像メモリ23a4は、元画像を縮小した縮小画像において求められる反射率(反射光成分値、対数値Rs)を記憶するものであり、縮小画像の輝度信号Ysから求められる反射率を記憶するメモリである。
元画像を縮小する方法としては、縮小する画像の画素に対応する元画像の位置に最も近い画素の値をサンプリングし、そのサンプリングした画素の値をそのまま用いる最近傍(Nearest Neighbor)法や、縮小する画像の画素に対応する元画像の位置の周囲の画素を用いて補間演算を行うバイキュービック法や、平均画素法などが知られている。画質より処理速度を優先する場合は、最近傍法が用いられ、処理速度より画質を優先する場合は、バイキュービック法や、平均画素法が用いられる。
これらいずれかの方法により、縮小率メモリ23a2に記憶される縮小率で、元画像が縮小され、その縮小画像の各画素(ピクセル)について対数値Rsが上述の(2)式を用いて演算され、縮小画像の各画素の座標(x,y)に対応して縮小レティネックス画像メモリ23a4に記憶される。この縮小レティネックス画像メモリ23a4に記憶される値は、新たな補正処理の実行時に更新される。尚、対数値Rsの演算は、上記(2)式における元画像の信号強度値I(x,y)に、輝度信号Ys(x,y)を代入して実行される。つまり、この対数値Rsは、ガウスフィルタ(縮小マスクメモリ23a10に記憶される縮小マスク)を用い、各画素をそれぞれ注目画素としてm×nの領域にガウスフィルタF(x,y)による畳み込み演算を行って平均輝度値を算出し、その算出された平均輝度値で縮小画像の輝度値Ysを除して得られた値を自然対数化することで得る。
ヒストグラムメモリ23a5は、縮小レティネックス画像メモリ23a4に記憶される反射率(対数値Rs)についてのヒストグラム(頻度分布)が記憶されるものである。このヒストグラムメモリ23a5には、対数値Rsのレベルが同じものの数を集計した集計結果を記憶するために、各レベルのそれぞれに対応して各1のエリアが設けられている。言い換えれば、ヒストグラムメモリ23a5は、対数値Rsのヒストグラムを形成するためのメモリである。
ヒストグラムメモリ23a5の各エリア数及び各エリアにて管理する対数値Rsのレベルは、新たに元画像が入力されることにより、CPU21によって設定される。具体的には、縮小画像を構成する全画素について対数値Rsが求められると、求められた対数値Rsの最小値と最大値とに基づいてヒストグラムの生成範囲が決定され、また、同じレベルとして集計するレベル範囲(管理するレベル)が選定される。これにより、ヒストグラムメモリ23a5のエリア数と各エリアのレベルが設定される。
そして、縮小レティネックス画像メモリ23a4に記憶される各対数値Rsが、いずれのレベルに属するかが判断されると、その判断された対数値Rsのレベルに対応するエリアに記憶される値に1が加算される。これにより、各レベル毎に、その頻度が集計される。
最大値メモリ23a6及び最小値メモリ23a7は、ヒストグラムの生成に際し、縮小レティネックス画像メモリ23a4に記憶される対数値Rsの内の、最大値のものと、最小値のものとをそれぞれ記憶するメモリである。かかる最大値メモリ23a6及び最小値メモリ23a7には、元画像のレティネックス処理(補正処理)の開始に際し、0が書き込まれる。対数値Rsが算出されると、最大値メモリ23a6に記憶される値は、その算出された(縮小レティネックス画像メモリ23a4に記憶された)対数値Rsと比較される。そして、その比較結果に基づいて、より大きな対数値Rsにて、最大値メモリ23a6に先に記憶される値が更新される。
また、最大値メモリ23a6に記憶される値よりも、比較した対数値Rsの方が小さかった場合には、その対数値Rsは、最小値メモリ23a7に記憶される値と比較される。そして、その比較結果に基づいて、より小さな対数値Rsにて最小値メモリ23a7に記憶される先の値は更新される。
これにより、最大値メモリ23a6には、縮小レティネックス画像メモリ23a4に記憶される対数値Rsの内の最大値が保持され、最小値メモリ23a7には、縮小レティネックス画像メモリ23a4に記憶される対数値Rsの内の最小値が保持される。
この最大値メモリ23a6及び最小値メモリ23a7に記憶される最大値および最小値は、ヒストグラム生成のタイミングでCPU21によって参照され、かかる最大値及び最小値に基づいて、ヒストグラム生成の範囲がCPU21にて決定される。
クリップ値メモリ23a8は、ヒストグラムから求められるクリップ範囲を記憶するメモリであり、具体的には、ヒストグラムメモリ23a5における集計結果に基づいて決定された下限値Dと上限値Uとが記憶されている。上限値Uは、ヒストグラムメモリ23a5に記憶される集計結果(頻度分布)から検出されるメジアン値Mよりも大きい側において45%の画素が含まれる点となる値であり、下限値Dは、メジアン値Mよりも小さい側において45%の画素が含まれる点となる値である。そして、下限値D〜上限値Uの範囲がクリップ範囲となり、元画像データの対数値Rに対し、このクリップ範囲に属するものが、予め定めた下限値d〜上限値uに正規化される(正規化反射率refleの生成)。つまり、下限値Dおよび上限値Uのそれぞれは、元画像データの対数値Rを正規化するパラメータとなっている。
このように、複合機1では、縮小画像から形成されたヒストグラムで元画像のクリップ範囲を決定することができるので、かかるクリップ範囲を決定するために、元画像の全画素についての反射率のヒストグラムを生成する必要が無く、処理時間を短縮することができる。
入力マスクメモリ23a9は、マスク生成処理(S12)によって生成されたM×Nのマトリクスのガウスフィルタであって、元画像に対するフィルタ演算処理において用いられるガウスフィルタである入力マスクを記憶するメモリである。本実施形態の入力マスクは、奇数の要素数を有する予め規定された大きさを有し、例えば、21×21のマトリクスで形成された全要素数441のマスクとされている。入力マスクの各要素に対しては、その位置を特定するべく、左上端の要素を座標(0,0)とし、右下端の要素を最終座標(21×21のマトリクスでは(20,20))として、マスク内の位置を示すXY座標(マスク座標)がそれぞれ付与されている。つまり、2次元配列されたマスクの各要素に付されたマスク座標は、X軸にそって右側の列へいくほどX座標が大きくなり、Y軸に沿って下方の行へ行くほどY座標が大きくなる。また、各要素には、座標の小さいものから順に、即ち、X軸方向に沿って左端から右端へ向かいつつ、上側の行から下側の行へ進行する順で、次第に大きな数となるように、0〜440の識別番号が付与されている。
本実施形態では、マスク生成処理(S12)において、参照点数メモリ22cに記憶されている数分の乱数が取得され、取得された乱数に対応する要素にだけフィルタ係数が格納される。上記したように、参照点数メモリ22cに記憶されている数は、全要素数(例えば441)よりも少ない数であるので、この入力マスクメモリ23a9に記憶される入力マスクは、間引きされたパターンを有するものとなっている。
マスクの全要素と、画像の対応する各画素とを積和演算すると、処理時間が膨大になる。一方で、多くの自然画では、要素が各所で間引かれた態様のマスクを用い、点在する要素と処理対象の画像における対応する画素とを積和演算してフィルタ演算を行っても、全要素を有するマスクを用いてフィルタ演算をして得られる結果と大差が生じないことが知られている。
そこで、本複合機1では、各所で要素が間引かれた態様のマスクを用いることで、フィルタ演算に要する時間の短縮と、フィルタ演算に際して必要となるメモリ量の抑制とを図っている。
縮小マスクメモリ23a10は、マスク生成処理(S12)によって生成されたm×nのマトリクスのガウスフィルタであって、縮小画像に対するフィルタ演算を行うためのガウスフィルタである縮小マスクを記憶するメモリである。この縮小マスクは、入力マスクメモリ23a9に記憶される入力マスクに基づいて作成される。
縮小マスクは、基本的には、元画像と縮小画像とのサイズ比に基づいて作成される。具体的には、縮小率メモリ23a2に記憶される縮小率で入力マスクを縮小して作成される。本実施形態では、縮小画像と元画像とのそれぞれから対数値R,Rsを求めるので、対数値R,Rsを求めるために縮小画像と元画像とのそれぞれに対してフィルタ演算を行う必要がある。ところが、間引きパターンを有する入力マスクを単純に縮小して縮小マスクを作成することはできない。入力マスクの間引きパターンが縮小マスクに反映されず、両者は整合性の乏しいものとなってしまうからである。フィルタ演算に用いられる入力マスクと縮小マスクとの整合性が乏しいと、得られる演算結果は整合性のないものとなってしまい、縮小画像から設定したクリップ範囲を元画像のクリップ範囲に適用することができなくなってしまう。
詳細は後述するが、本実施形態においては、入力マスクを縮小して縮小マスクを作成することを基本としつつ、入力マスクの間引きパターンを反映した縮小マスクが作成されるようになっており(図6のマスク生成処理(S12)及び図7から図10参照)、作成された縮小マスクがこの縮小マスクメモリ23a10には記憶されている。
尚、この縮小マスクの各要素も、入力マスクと同様に付与されたマスク内での位置を特定するための座標(マスク座標)によって管理される。
分割要素数メモリ23a11は、縮小マスクの1要素に対応する入力マスクの要素数(分割要素数)を記憶するメモリである。分割要素数は、入力マスクの全要素数を、生成する縮小マスクの全要素数で分割した場合に、分割された区画に属する要素数を示す数である。該分割要素数は、分割された入力マスクの区画に属する要素数そのものを直接示す値であってもよく、分割された入力マスクの区画のX軸方向とY軸方向とのそれぞれに配置される要素数の値であってもよい。
縮小マスクは入力マスクを縮小して生成されるので、当然、縮小マスクの要素数は入力マスクよりも減少し、入力マスクの要素数の略縮小率倍となっている。尚、算出された縮小マスクの要素数は、小数点以下の端数が丸められるので、誤差が発生し、厳密に縮小率倍とならないことが多い。
本実施形態では、かかる分割要素数は、入力マスクのX軸方向とY軸方向とのそれぞれの要素数を、縮小マスクの対応する軸方向の要素数で分割して求められた値とされており、各軸方向の分割要素数のそれぞれが、この分割要素数メモリ23a11に記憶される。
画像の縮小率は、X軸方向とY軸方向とで異なることが多いため、本実施形態ではX軸方向とY軸方向との両者について縮小率が求められている。一方で、入力マスクの形状は正方形で形成されている。従って、縮小マスクを生成した場合に、縮小マスクの1要素に対応する入力マスクの区画は、縦横サイズの異なる長方形となることが多い。このため、本実施形態では、縮小マスクの全要素数で、単純に入力マスクの全要素数を除して分割要素数を求めるのでなく、マスクのX軸方向、Y軸方向のそれぞれにおいて分割要素数を求めているのである。
尚、ここでいう全要素数は、M×Nのマトリクスで形成される入力マスクおよびm×nのマトリクスで形成される縮小マスクが有する全要素の数であり、フィルタ係数が格納されたものであるか否かには無関係である。
本複合機1は、この分割要素数メモリ23a11に記憶される分割要素数に基づいて入力マスクを区分し、形成された入力マスクの区画に属する要素の内容を、縮小マスクの1の要素に反映させることで、入力マスクとの整合性を維持した縮小マスクを生成するように構成されている(図6のマスク生成処理(S12)、図9、図10参照)。
ここで、分割要素数は、小数点以下の端数を伴った値であることが多い。このため、分割要素数毎に入力マスクを区分して区画を形成すると、区画の境界を形成する分割位置において1の要素が分断されてしまう。そこで、本実施形態では、分割要素数毎に入力マスクを区画した場合に得られる座標(マスク座標)を四捨五入して、縮小マスクの1の要素に対応する入力マスクの要素数が整数となるように分割位置をずらしている。このため、入力マスクに形成される区画は、厳密には、本来の境界からずれるが、形成される区画に対し僅か1要素を組み入れるか否かの僅かな差異であるので、かかる方法で分割位置をずらしても、生成される縮小マスクの入力マスクに対する整合性を著しく低下させるような支障が生じることはない。
これにより、縮小マスクの1の要素に、その1要素に対応する入力マスクの複数の要素の内容を反映させることができる上、その複数の要素は整数であるので、かかる複数の要素の内容を縮小マスクの1の要素に反映させる処理において端数の処理を不要とし、簡便に処理を行うことができる。
対数値メモリ23a12は、元画像の反射率(反射光成分値、対数値R)を記憶するものである。具体的には、輝度値メモリ23a3に記憶された元画像データの輝度信号Yを用いて、各画素に対応する対数値R(x,y)が、上述の(2)式に従って算出され、算出された対数値R(x,y)は、その座標に対応して対数値メモリ23a12に記憶される。この対数値メモリ23a12の値は、新たなレティネックス処理が実行された場合に新たに算出された対数値Rによって更新される。尚、対数値R(x,y)は、上記(2)式における元画像の信号強度値I(x,y)に、輝度信号Y(x,y)を用いて演算される。つまり、この対数値Rは、入力マスクを用いたフィルタ演算を行って平均輝度値を算出し、その算出された平均輝度値で元画像の輝度値Yを除して得られた値を自然対数化することで得る。
refle値メモリ23a13は、元画像の正規化反射率refleを記憶するものであり、対数値メモリ23a12に記憶される対数値R(元画像の反射率)を正規化した正規化反射率refleを記憶するメモリである。このrefle値メモリ23a13に記憶される正規化反射率refleは、対数値メモリ23a12に記憶される各対数値R(x,y)を、(3)式に従い、クリップ値メモリ23a8に記憶されるクリップ範囲について、下限値0.3〜上限値1.3の範囲に正規化したものである。対数値R(x,y)、即ち対数値Rの各々に対応して、各1ずつの正規化反射率refle(x,y)が生成され、その座標に対応してこのrefle値メモリ23a13に書き込まれる。このrefle値メモリ23a13に記憶される正規化反射率refleは、出力値Outyを生成するタイミングでrefle値メモリ23a13から読み出され、読み出された正規化反射率refleを用いて出力値Outyが算出される。
印刷またはプレビュー画像表示に際し、出力値Outyを生成するためには、対数値R(又は対数値Rs)を正規化する必要があるが、対数値Rの正規化は、次の2つの条件を満たすように行われている。1つ目の条件は、正規化して得られる正規化反射率refleが、0を含まない値とすることである。これは、出力値Outyが算出不能となることを回避するためである。
2つ目の条件は、正規化された正規化反射率refleの値の幅を1とすることである。正規化反射率refleの有する幅が1であると、元画像のダイナミックレンジと出力画像のダイナミックレンジとをおおよそ同じにすることができる。元画像の画素値は「0」〜「255」の範囲の値であるので、正規化反射率refleの有する幅を1とすることにより、本実施形態では、同じ範囲である「0」〜「255」で出力画像の画素値を得ることができる。その結果、出力画像全体の色調が入力画像に比べて変化してしまうことを回避できる。
このため、対数値Rは、0を超える値の下限値dから、その下限値dに1加算した上限値uの範囲に、正規化される。尚、本実施形態においては、(3)式における下限値dは0.3とされ、上限値uは1.3とされており、対数値Rは0.3〜1.3の値に正規化されている。言い換えれば、元画像の各画素の正規化反射率refleは、0.3〜1.3の値となる。また、対数値Rを0.3〜1.3の範囲に正規化すると、対数値R「0」の正規化反射率refleは、0.8となる。従って、正規化反射率refleが0.8を超える画素(注目画素)は、対数値Rが正である、即ち、注目画素が周辺画素よりも明るい事を示しており、正規化反射率refleが0.8未満である画素(注目画素)は、対数値Rが負である、即ち、注目画素が周辺画素よりも暗い事を示すこととなる。
レティネックス処理において出力値Outを算出する(4)式によれば、ガンマ係数は任意の定数であるので、変数(パラメータ)は、画素値(輝度信号Yまたは輝度信号Ys)と正規化反射率refleとの2つである。このため、正規化反射率refleが算出されれば、「0」〜「255」の各輝度信号Y(Ys)に対応する各出力値Outyを導出することができる。
出力画像メモリ23a14は、プリンタ2に出力する出力画像データ、即ち、レティネックス処理による補正がなされた出力画像データを記憶するメモリである。この出力画像メモリ23a14に記憶される出力画像データは、補正処理によって元画像から生成された出力値Outであり、出力画像を形成する各画素のRGB値である。上記したように、本実施形態では、補正処理により、まず、元画像の輝度信号Y(x,y)に応じた出力値Outyが生成され、以下に示す(6)式に従って、RGB値に変換されて出力値Outとされる。
元画像の各輝度信号Y(x,y)の各々に対応して、各1ずつの出力値Out
y(x,y)が算出されており、出力値Outについても、各出力値Out
y(x,y)のそれぞれに対応する出力値Out
y(x,y)が生成される。そして、生成された出力値Out(x,y)が、その座標に対応して、出力画像メモリ23a14に書き込まれる。記憶された出力値Out(出力画像データ)は、印刷を実行するタイミングでこの出力画像メモリ23a14から読み出され、プリンタ2へ出力される。プリンタ2へ出力された出力値Outは、出力画像メモリ23a14から消去される。
制御部20とバス25を介して接続されるASIC26には、複合機1に所望の指令を入力する操作キー40を制御するパネルゲートアレイ(パネルGA)27が接続されている。パネルゲートアレイ27は、操作キー40の押下(入力)を検出して、所定のコード信号を出力する。このキーコードは、複数の操作キー40に対応して割り当てられている。CPU21は、パネルゲートアレイ27から所定のキーコードを受信すると、所定のキー処理テーブルに従って、実行すべき制御処理を行う。キー処理テーブルは、キーコードと制御処理とを対応させてテーブル化したものであり、例えば、ROM22に記憶されている。
ASIC26には、LCD41の画面表示を制御するLCDコントローラ28が接続されている。LCDコントローラ28は、CPU21の指令に基づいて、LCD41にプリンタ2又はスキャナ3の動作に関する情報を画面に表示させる。また、スキャナ3により読み取られたデータに対応する画像を画面に表示させ、または、接続された外部装置やスロット部72に挿入されたメモリカードから受け取ったデータに対応する画像を画面に表示させる。
さらに、ASIC26には、一般公衆回線33に接続されファクシミリ機能を実現するためのNCU(Network Control Unit)31や、NCUを介してモデム32が接続されている。また、ネットワーク上に存在するコンピュータとデータの送受信を行うための、図示しないネットワークインターフェースを備えていてもよい。更には、NCU31に送受話器を接続し、複合機1を通話(電話)機能を備えた構成としてもよい。
また、ASIC26には、アンプ73が接続されている。アンプ73は、そのアンプ73に接続されたスピーカ74を鳴動して、呼出音や拒否音、メッセージなどを出力するためのものである。
ASIC26に接続されたプリンタ2は、インクジェットプリンタで構成されており、記録ヘッド201と、CRモータ203と、LFモータ205と、駆動回路202,204,206とを備えている。
記録ヘッド201は、ノズル面に形成された複数のノズル口からインクを吐出して、記録用紙に印字を形成するものである。この記録ヘッド201は、非図示のキャリッジに搭載されており、記録用紙の搬送方向に対して直交する方向へ往復移動可能に構成されている。駆動回路202は、非図示のゲートアレイから出力される信号に応じて、その信号に合った波形の駆動パルスを、記録ヘッド201の各ノズルに対応した駆動素子に印加する駆動回路である。記録ヘッド201は、駆動回路から出力される駆動パルス信号によって動作され、インクを吐出する。
CRモータ203は、上記したキャリッジを往復移動させるためのモータである。駆動回路204は、CRモータ203に電圧を印加する回路である。駆動回路204から出力される電圧によってCRモータ203が駆動されると、CRモータ203に接続された例えばプーリなどの各部が動作され、キャリッジ、即ち、記録ヘッド201を記録用紙の搬送方向に対して直交する方向に往復移動させることができる。
LFモータ205は、記録用紙を搬送するためのモータである。駆動回路206は、LFモータ205に電圧を印加する回路である。駆動回路206から出力される電圧によってLFモータ205が駆動されると、LFモータ205に連結された給紙ローラや搬送ローラなどが駆動され、記録用紙が、給紙トレイ14の奥側から上方へ延びた後に正面側へU字状に湾曲して排紙トレイ15に連結される用紙搬送路を搬送される。
尚、本複合機1のプリンタ2が電子写真方式のもので構成される場合には、記録ヘッド201に代えて感光体ユニットが設けられ、CRモータ203に代えて感光体ユニットを回動させるモータが設けられる。
次に、上記のように構成された複合機1において実行される画像処理(レティネックス処理)を、図3から図6のフローチャートを参照して説明する。また、レティネックス処理の中で実行されるマスク生成処理(S12)については、入力マスク及び縮小マスクの基本構成を示す図7、縮小マスクの各要素に格納するフィルタ係数の内容を示す図8、入力マスクの分割方法を示す図9、入力マスクの間引きパターンを反映した縮小マスクの生成原理を示す図10を、フローチャートと共に適宜用いて説明する。
図3は、本複合機1で実行されるレティネックス処理(Retinex処理)のフローチャートである。複合機1にて実行されるRetinex処理では、まず、元画像を縮小し、その縮小した画像に基づいて元画像の反射率Rの正規化を行うためのクリップ範囲の設定とプレビュー画像の表示を行うRetinex前処理を実行した後(S1)、元画像のレティネックス処理を行うRetinex後処理を実行して(S2)、このレティネックス処理を終了する。Retinex後処理(S2)にて補正処理された元画像データはプリンタ2によって印刷される。
このように、本複合機1において実行されるレティネックス処理は、縮小画像に対してレティネックス処理を行う前処理と、元画像に対してレティネックス処理行う後処理の大別して2の処理から成り立っている。
図4は、図3に示したRetinex処理の中で実行されるRetinex前処理(S1)のフローチャートである。このRetinex前処理(S1)は、元画像のクリップ範囲を設定するために縮小画像に対するレティネックス処理(前処理)を行うものであり、まず、縮小画像のサイズデータ(縮小画像の長辺の画素数と短辺の画素数)と元画像メモリ23a1に記憶されている元画像のサイズデータ(元画像の長辺の画素数と短辺の画素数)との比により、X軸方向とY軸方向との両者について縮小率を算出し、算出した縮小率を縮小率メモリ23a2に記憶する(S11)。なお、長辺側をX軸、短辺側をY軸とする。故に、元画像および縮小画像の長辺同士の比がX軸方向の縮小率、短辺同士の比がY軸方向の縮小率となる。
次いで、縮小画像及び元画像に対して行われるフィルタ演算(畳み込み演算)に用いるガウスフィルタ(マスク)を生成するマスク生成処理を行う(S12)。その後、元画像メモリ23a1から元画像データを読み出し(S13)、縮小率メモリ23a2に記憶される縮小率で元画像データを縮小して縮小画像データを生成する(S14)。尚、外部から入力された元画像データは、その入力時或いはユーザの指示によって実行される所定の処理により、Retinex前処理(S1)に先立って、元画像メモリ23a1に記憶されている。
その後、生成された縮小画像データの各RGB値を輝度信号Ysと色信号Cb,Crとに変換し、縮小画像の各RGB値の座標(x,y)にそれぞれ対応させて輝度値メモリ23a3に書き込む(S15)。これにより、縮小画像の全画素に対応する輝度信号Ysが輝度値メモリ23a3に記憶される。
そして、輝度値メモリ23a3に記憶した縮小画像の輝度信号Ysについて反射率(対数値Rs)を算出する。各画素の対数値Rs(x,y)は、(2)式の画素値I(x,y)に輝度信号Ys(x,y)を用いて算出する(S16)。つまり、座標(x,y)の注目画素を含むm×nの領域にガウスフィルタF(x,y)による畳み込み演算を行って(縮小マスクを用いたフィルタ演算の実行)、注目画素からの距離に応じた重みを加味しつつ平均された周辺画素の平均輝度値を求め、その平均輝度値にて注目画素の輝度信号Ys(x,y)を除したものの自然対数を求めることにより、注目画素の反射率である対数値Rs(x,y)を算出する。なお、S16の処理において使用される縮小マスクは、S12のマスク生成処理において生成される。
その後、算出した対数値Rs(x,y)を縮小レティネックス画像メモリ23a4に記憶し(S17)、記憶した対数値Rs(x,y)が最大値メモリ23a6に記憶される値よりも大きいかを判断する(S18)。対数値Rs(x,y)が最大値メモリ23a6に記憶される値よりも大きければ(S18:Yes)、算出した対数値Rs(x,y)を最大値メモリ23a6に記憶して、先に最大値メモリ23a6に記憶される値を更新する(S19)。また、S18の処理で確認した結果、対数値Rs(x,y)が最大値メモリ23a6に記憶される値よりも小さい場合には(S18:No)、その対数値Rsを最小値メモリ23a7に記憶される値よりも小さいかを判断する(S20)。その結果、比較した対数値Rsが最小値メモリ23a7に記憶される値よりも小さければ(S20:Yes)、その対数値Rsを最小値メモリ23a7に記憶し、最小値メモリ23a7に先に記憶される値を更新する(S21)。
S19またはS21の処理の後は、縮小画像の全画素について処理が終了したかを確認する(S22)。縮小画像についての対数値Rsの生成と対数値Rsの最大値と最小値とを判断するS16〜S22の処理は、1の注目画素毎(1の輝度信号Ys毎)に実行され、最終画素の輝度信号Ysの処理が終了するまで、繰り返して実行される。従って、輝度値メモリ23a3からは、S16〜S22の処理の実行毎に、座標に従った順番で(先頭座標から最終座標へ向かうラスタ走査の順で)、輝度信号Ysが読み出される。そして、S22の処理で確認した結果、全画素についての処理が終了していれば(S22:Yes)、縮小レティネックス画像メモリ23a4に記憶される対数値Rsに対し、最大値メモリ23a6に記憶される最大値から最小値メモリ23a7に記憶される最小値までの範囲において、ヒストグラムを形成する(S23)。
その後、形成したヒストグラムからメジアン値Mを求め(S24)、次いで、そのメジアン値Mとヒストグラムとから対数値Rsのクリップ範囲(上限値Uと下限値D)を定め、下限値D及び上限値Uをクリップ値メモリ23a8に記憶する(S25)。具体的には、メジアン値Mを中心に、メジアン値Mの上側において45%の画素が含まれる点となる対数値Rsを上限値Uとし、メジアン値Mの下側において45%の画素が含まれる点となる対数値Rsを下限値Dとし、メジアン値Mの上下に各45%ずつの画素が所属する下限値D〜上限値Uの範囲をクリップ範囲とする。これによりヒストグラムの端部がカットされる。尚、このS25のステップで設定されたクリップ範囲は、Retinex後処理(S2)において元画像のクリップ範囲として適用される。
続いて、縮小レティネックス画像メモリ23a4に記憶される対数値Rsに対し、クリップ値メモリ23a8に記憶されるクリップ範囲(下限値D〜上限値U)を0.3〜1.3とする正規化をおこなって、正規化反射率refle(x,y)を算出する(S26)。尚、この正規化は、対数値Rs(x,y)≦Dである場合には、0.3とし、また、対数値R(x,y)≧Uである場合には、1.3とすると共に0.3<対数値R(x,y)<1.3である場合には、(3)式に従って、対数値Rを正規化するものである。尚、本実施形態においては、(3)式におけるd及びuは、それぞれ0.3と1.3とされている。
その後、S26の処理で算出された縮小画像の正規化反射率refleを用い、(4)式に従ってプレビュー画像の出力値Outyを算出する(S27)。尚、S27の処理では、上記(4)式において元画像の信号強度値I(x,y)に輝度信号Ys(x,y)を用いて演算が実行される。
レティネックス処理において出力値Outを算出する(4)式によれば、ガンマ係数は任意の定数であるので、変数(パラメータ)は、元画像の画素値(輝度信号Y)と正規化反射率refleとの2つである。このため、正規化反射率refleを算出すれば、「0」〜「255」の各輝度信号Yに対応する各出力値Outyを導出することができるのである。なお、算出された出力値Outyが取り得る最高値は「255」とされているので、「255」を超えた出力値Outyは、全て「255」で出力される。
尚、この輝度信号Yが請求項記載の画素値に該当する。また、本実施形態においては、輝度信号Yに対しレティネックス処理を行う構成としたが、これに代えて、RGB値をそのまま用いてレティネックス処理を行うようにしても良い。
そして、求めた出力値Outyを、(6)式に従ってRGB値に逆変換して出力値Outを生成し、生成元の輝度信号Yの座標(x,y)に対応させて出力画像メモリ23a14に書き込み(S28)、縮小画像の全画素について出力値Outを生成したかを確認する(S29)。
S26〜S29の処理は、1の注目画素毎(1の対数値Rs毎)に実行され、最終画素の対数値Rsの処理が終了するまで、繰り返して実行される。従って、縮小レティネックス画像メモリ23a4からは、S26〜S29の処理の実行毎に、座標に従った順番で(先頭座標から最終座標へ向かうラスタ走査の順で)、対数値Rsが読み出される。そして、S29の処理で確認した結果、全画素についての処理が終了していれば(S29:Yes)、このRetinex前処理(S1)を終了する。
一方、S29の処理で確認した結果、未だ縮小画像の全画素について出力値Outが生成されていなければ(S29:No)、その処理をS26の処理に移行して、縮小画像の全画素について出力値Outが生成されるまで、S26〜S29の処理を繰り返す。
このRetinex前処理(S1)により、元画像に対するクリップ範囲(正規化パラメータ)が縮小画像を用いて求められる。また、縮小画像をレティネックス処理した画像、即ち、出力画像メモリ23a14に記憶される出力値Outは、このRetinex前処理(S1)終了後に、所定のタイミングでプレビュー画像としてLCD41に出力される。
図5は、図3のRetinex処理の中で実行されるRetinex後処理(S2)を示すフローチャートである。このRetinex後処理(S2)は、元画像に対してレティネックス処理を行うものであり、まず、元画像メモリ23a1に記憶される元画像データの各RGB値を輝度信号Ysと色信号Cb,Crとに変換し、縮小画像の各RGB値の座標(x,y)にそれぞれ対応させて輝度値メモリ23a3に書き込む(S31)。これにより、元画像の全画素に対応する輝度信号Yが輝度値メモリ23a3に記憶される。尚、輝度値メモリ23a3は、Retinex前処理(S1)終了後、Retinex後処理(S2)開始前に、非図示のステップにより0クリアされている。
そして、輝度値メモリ23a3に記憶した元画像の輝度信号Yについて対数値Rを算出する。各画素の対数値R(x,y)は、(2)式の画素値I(x,y)に輝度信号Y(x,y)を用いて算出する(S32)。
つまり、座標(x,y)の注目画素を含むM×Nの領域にガウスフィルタF(x,y)による畳み込み演算を行って(入力マスクを用いたフィルタ演算の実行)、注目画素からの距離に応じた重みを加味しつつ平均された周辺画素の平均輝度値を求め、その平均輝度値にて注目画素の輝度信号Y(x,y)を除したものの自然対数を求めることにより、注目画素の反射率である対数値R(x,y)を算出する。なお、S32の処理において使用される入力マスクは、マスク生成処理(S12)において生成される。
その後、算出した対数値R(x,y)を対数値メモリ23a12に記憶し(S33)、続いて、対数値メモリ23a12に記憶される対数値Rに対し、クリップ値メモリ23a8に記憶されるクリップ範囲(下限値D〜上限値U)を0.3〜1.3とする正規化をおこなって、正規化反射率refle(x,y)を算出する(S34)。これにより、縮小画像から求めたクリップ範囲(正規化パラメータ)によって元画像の対数値Rを正規化することができる。
尚、この正規化は、縮小画像の場合と同様に、対数値R(x,y)≦Dである場合には、0.3とし、また、対数値R(x,y)≧Uである場合には、1.3とすると共に0.3<対数値R(x,y)<1.3である場合には、(3)式に従って、対数値Rを正規化するものである。
これによれば、元画像の対数値Rについてはヒストグラムの形成を不要とできるので、RAM23の使用量を削減することができる上、レティネックス処理全体の処理速度を向上することができる。
そして、算出した元画像の正規化反射率refleをrefle値メモリ23a13に記憶した後(S35)、refle値メモリ23a13に記憶した正規化反射率refleを用い、(4)式に従って出力値Outyを算出する(S36)。尚、S36の処理では、上記(4)式において元画像の信号強度値I(x,y)に輝度信号Y(x,y)を用いて演算が実行される。
その後、求めた出力値Outyを、(6)式に従ってRGB値に逆変換して出力値Outを生成し、生成元の輝度信号Yの座標(x,y)に対応させて出力画像メモリ23a14に書き込み(S37)、元画像の全画素について出力値Outを生成したかを確認する(S38)。
S32〜S38の処理は、1の注目画素毎(1の輝度信号Y毎)に実行され、最終画素の輝度信号Yの処理が終了するまで、繰り返して実行される。従って、輝度値メモリ23a3からは、S32〜S38の処理の実行毎に、座標に従った順番で(先頭座標から最終座標へ向かうラスタ走査の順で)、輝度信号Yが読み出される。そして、S38の処理で確認した結果、全画素についての処理が終了していれば(S38:Yes)、このRetinex後処理(S2)を終了する。
尚、S37の処理において出力画像メモリ23a14に記憶された出力値Outは、このRetinex後処理(S2)終了後に、所定のタイミングでプリンタ2に出力される。また、S38の処理で確認した結果、未だ元画像の全画素について出力値Outが生成されていなければ(S38:No)、その処理をS32の処理に移行して、元画像の全画素について出力値Outが生成されるまで、S32〜S38の処理を繰り返す。
図6は、図4のRetinex前処理(S1)において実行されるマスク生成処理(S12)のフローチャートである。このマスク生成処理(S12)は、入力マスクを生成し、その生成した入力マスクから当該入力マスクに整合性を有する縮小マスクを生成する処理である。上記したように、Retinex前処理(S1)及びRetinex後処理(S2)では、このマスク生成処理(S12)で生成されたマスク(ガウスフィルタ)を用いて、S16及びS32のステップではフィルタ演算が実行される。
マスク生成処理(S12)では、まず、参照点数メモリ22cに記憶される参照点数を読み出し(S61)、変数iを0にセットする(S62)。そして、所定のアルゴリズムに従って入力マスクの要素数に対応した有限の範囲で疑似乱数を発生させる乱数生成処理を実行する(S63)。この乱数生成処理(S63)により、その実行毎に1の乱数値が生成され、乱数の一様性(連続で取得した場合に同じ値を取ることがなく、しかも、すべての値が同じ確率で取り出せること)を有する乱数値を得ることができる。
ここで、入力マスクの大きさは予め既知であり、例えば21×21のマトリクスで形成されるものであれば、入力マスクの全要素数441に対応する識別番号「0」〜「440」が、生成される乱数値の範囲となる。故に、生成された乱数値によっていずれかの識別番号を指定することができる。
かかる識別番号のそれぞれは、各要素に付与されたマスク座標のそれぞれと対応つけられているので、生成された乱数に対応するマスク座標のフィルタ係数を正規分布関数に従って算出する(S64)。
図7(b)においては、左方に入力マスクを、右方に縮小マスクを表示しており、各マスクの下方には、中心要素を含むマスク左右方向の各要素に格納されるフィルタ係数の変化をグラフにて図示している。図7(b)の各グラフにおいては、横軸は各要素の位置に対応しており、縦軸はフィルタ係数を示している。
この図7(b)からもわかるように、マスクの各要素に格納するフィルタ係数の基本的な割り付けは、入力マスクであっても縮小マスクであっても同様に実行される。つまり、生成される入力マスクも縮小マスクもガウスフィルタであるので、中心要素に格納するフィルタ係数を1とすると共に、中心から四方へ向かって正規分布関数に従って次第にフィルタ係数が小さくなる(減衰する)ように割り付けられる。
また、マスクの幅にわたって正規分布曲線が描かれるような正規分布関数に従って各要素に格納するフィルタ係数は設定される。従って、マスク内の要素の位置(マスク座標)がわかれば、その要素に格納するべきフィルタ係数を算出できる。
S64の処理の後は、算出されたフィルタ係数をマスク座標に対応つけて入力マスクメモリに記憶する(S65)。
そして、変数iに1加算してから(S66)、変数iが参照点数メモリ22cに記憶される参照点数以上であるかを確認し(S67)、確認した変数iがその参照点数未満であると、フィルタ係数を格納するべき要素全てについてフィルタ係数は未だ算出されていないので(S67:No)、その処理をS63の処理に移行して、フィルタ係数を格納するべき要素についてそのフィルタ係数が全て算出されるまで、S63〜S67の処理を繰り返す。
一方、S67の処理で確認した変数iがその参照点数以上であると(S67:Yes)、フィルタ係数を格納するべき要素分についてフィルタ係数全てが算出されているので、縮小率メモリ23a2に記憶されている縮小率を読み出して、入力マスクのX軸方向長さ(X軸方向の要素数、行の数)Mおよび入力マスクのY軸方向長さ(Y軸方向の要素数、列の数)Nのそれぞれに対応する縮小率を乗算し、縮小マスクサイズm,nを算出する(S68)。算出されるmは縮小マスクのX軸方向の要素数であり、nは縮小マスクのY軸方向の要素数である。
ここで、本実施形態において用いられるマスク(ガウスフィルタ)の基本構成について図7を参照して説明する。図7(a)の左方には、元画像および入力マスクを模式的に示しており、右方には、縮小画像および縮小マスクを、模式的に示している。本実施形態の入力マスク及び縮小マスクは、図7(a)に示すように、そのサイズ比が、元画像と縮小画像とのサイズ比と同程度となることを基本的構成としており、元画像と縮小画像とのサイズ比(縮小率メモリ23a2に記憶される縮小率)に基づいて、入力マスクから縮小マスクが作成される。
上記したように、縮小画像のサイズが固定されている一方で、入力される元画像はユーザ任意のサイズであるため、縮小率は、その入力される元画像のサイズに応じて変動する。ここで、入力マスクと縮小マスクとのサイズ比を、元画像と縮小画像とのサイズ比と等しくすることは、両マスクに整合性を持たせる要因の1つである。本実施形態では、入力マスクのサイズは固定サイズとしているので、元画像のサイズに応じて縮小率が変化すると、生成される縮小マスクのマスクサイズが変化することとなる。つまり、元画像のサイズに応じて大きさの異なる縮小マスクが生成される。
そして、算出された縮小マスクのマスクサイズm,nを小数点以下を四捨五入して整数化(m→int(m),n→int(n))する(S69)。入力マスクサイズに縮小率を乗算して縮小マスクサイズを算出すると、往々にして、そのマスクサイズは小数点以下の端数を伴った値で算出される。ここで、マスクの各要素は、画像の1の画素に対応するものであるので、マスクサイズは自然数で規定されなければならない。このため、S69のステップにより、算出された縮小マスクのマスクサイズに対し四捨五入を行い、マスクサイズを整数化する。
その後、mが奇数であるかを調べる(S70)。そして、mが偶数であると(S70:No)、その値に1加算して(S71)、mを奇数に変換する。次いで、算出されたマスクサイズnが奇数であるかを調べる(S72)。そして、nが偶数であると(S72:No)、その値に1加算して(S73)、nを奇数に変換する。これにより、縮小マスクのマスクサイズが確定する。尚、S70,S72のステップにおいてaは自然数である。また、S70,S72のステップでは、m,nが奇数であるかを調べることによって、m,nが奇数であるか、言い換えれば、偶数であるかを判別したが、かかるステップにおいて、m,nが偶数であるかを調べることによって、m,nが奇数であるか、偶数であるかを判別する構成としても良い。
画像の縮小率をもって縮小マスクを生成すると、マスクサイズm,nが偶数になることがある。フィルタ演算は、マスク(フィルタ)の中心要素を画像の注目画素に対応させて積和演算を行うことを基本とするものであるので、マスクサイズが偶数になってしまうと、その中心要素を注目画素に重ねることができなくなってしまう。そこで、本実施形態においては、マスクサイズが偶数となった場合には、算出されたマスクサイズに1加算してマスクサイズが奇数となるように調整しているのである。しかし、調整する要素数は僅か1であるので、入力マスクと縮小マスクとのサイズは、おおよそ元画像と縮小画像とのサイズ比に等しいものとなる。尚、本実施形態においては、偶数で算出されたマスクサイズに1加算することによって、マスクサイズが奇数となるように調整したが、マスクサイズを奇数にする調整方法は、これに限られるものではなく、例えば、偶数で算出されたマスクサイズから1減算しても良い。また、加減算される数を、1以上の奇数としても良い。
その後、入力マスクサイズM,Nを縮小マスクサイズm,nで除してX軸方向、Y軸方向それぞれの分割要素数を求め(S74)、求めた分割要素数を分割要素数メモリ23a11に記憶する(S75)。続いて、x,y,X,Yのそれぞれを0にセットする(S76)。尚、ここで、x,yは、縮小マスクのマスク座標を示す変数であり、X,Yは、入力マスクのマスク座標を示す変数である。
次に、X軸方向のマスクサイズmとY軸方向のマスクサイズnとの内、大きい方のサイズを基準とする正規分布関数に従って、縮小マスクの座標(x,y)のフィルタ係数を算出する(S77)。上記したように、X軸方向とY軸方向との縮小率が異なる場合には、多くの場合、縮小マスクは長方形で形成されるからである。
例えば、図8には、生成される縮小マスクの例として、5×7のマトリクスのマスクを示している。また、マスクの右方と下方には、それぞれ、中心要素を含むマスク左右および上下方向の各要素に格納されるフィルタ係数の変化をグラフにて図示している。図8の各グラフにおいては、横軸(マスク下方のグラフにおいては紙面左右方向に伸びる軸であり、マスク右方のグラフにおいては紙面上下方向に伸びる軸)は各要素の位置に対応しており、縦軸(横軸に直交する軸)はフィルタ係数を示している。
縮小マスクの各要素には、中心要素に格納するフィルタ係数を1とすると共に、中心から四方へ向かって正規分布関数に従って次第にフィルタ係数が小さくなる(減衰する)ようにフィルタ係数割り付けられる。
ここで、実際に生成される縮小マスクは、破線で囲まれた5×7のマトリクスのマスクであるが、マスクサイズの大きい側に基づき、7×7のマトリクスの幅にわたって正規分布曲線が描かれるような正規分布関数に従って各要素に格納するフィルタ係数は設定される。
一方で、縮小マスクのマスク座標は、破線で囲んだ実際の縮小マスクの5×7のマトリクスに付与され、破線で囲んだ5×7のマトリクス左上端の座標を(0,0)とし、5×7のマトリクスの右下端が最終座標(4,6)となる。算出された各フィルタ係数は、実際の縮小マスクのマスク座標に対応つけて管理される。
この後、マスク座標(α,β)を算出する(S78)。マスク座標(α,β)は、入力マスクにおける1の区画を規定するための座標であり、縮小マスクの1の要素に対応する入力マスクの1の区画においての最終座標(2次元配列で表された入力マスクの1の区画の右下端の座標)を示す。尚、座標(α)が1区画内の最終座標のX座標であり、座標(β)がY座標である。座標αは、以下の演算にて求められる。まず、分割要素数メモリ22a11に記憶されるX軸方向の分割要素数に、フィルタ係数を求める縮小マスクの要素のx座標に1加算した値(x+1)を乗算して得た値を、四捨五入によって整数化する。そして、整数化された値から1を減算することで要素の個数から座標系へと値を変換し、それを入力マスクの対応する区画の先頭座標であるXに加算することでαが求められる。
同様に、座標βは、分割要素数メモリ22a11に記憶されるY軸方向の分割要素数に、フィルタ係数を求める縮小マスクの要素のy座標に1加算した値(y+1)を乗算して得た値を、四捨五入によって整数化する。そして、整数化された値から1を減算することで要素の個数から座標系へと値を変換し、それを入力マスクの対応する区画の先頭座標であるYに加算することでβが求められる。
縮小マスクのx座標に1加算した値(x+1)を分割要素数に乗算して得られる値及び、縮小マスクのy座標に1加算した値(y+1)を分割要素数に乗算して得られる値、簡単に言えば、分割要素数をn倍(nは1以上の自然数)した値は、各区画における分割位置を示す座標値となっている。
図9には、21×21のマトリクスの入力マスクから5×7のマトリクスの縮小マスクを作成する場合を例示している。尚、Y軸方向についても同様の処理であるので、X軸方向についてのみ説明し、Y軸方向の説明については省略する。
図9の(a)は、入力マスクの分割方法を概念的に説明する図であり、図9の(b)は、入力マスクを分割して区画を作成する際のパラメータとなる数値を表で示したものである。表においては左欄に項目を、右欄には各項目に対応する数値を示している。図9の例では、図9(b)に示すように、入力マスクのX軸方向のサイズは21であり、X軸方向の縮小率は1/5とされている。従って、縮小率を乗算して縮小マスクのx軸方向のサイズは、4.2と算出され、これを整数化した後、奇数となるように1を加算することで、マスクサイズが5に確定する。確定したマスクサイズ5で入力マスクのX軸方向の要素数を分割すると、X軸方向の分割要素数=4.2が得られる。
図9(a)の最下方には、縮小マスクの1の行に配列された各要素を図示している。これら要素の縮小マスクにおけるマスク座標は、(0,0)〜(4,0)である。図9(a)の最上方には、入力マスクの1の行に配列された各要素を図示している。これら要素の入力マスクにおけるマスク座標は、(0,0)〜(20,0)である。分割要素数は4.2であるので、図示した入力マスクにおいて破線で示す位置がこの分割要素数に従った分割位置となる。座標で示すと、分割位置は(3.2,0),(7.4,0),(11.6,0),(15.8,0)となり、(0,0)〜(20,0)をかかる分割位置で区分した区画には、4.2要素ずつが含まれる。
図9(a)においては、この入力マスクの直下に、拡大した縮小マスクを示している。分割要素数に従えば、破線で示す位置まで、即ち、拡大した縮小マスクの1の要素と同じ大きさで表示される範囲までが、入力マスクにおける1区画となるが、本実施形態では、分割要素数から求めた分割位置を整数化しており、その整数化された分割位置から区画の座標を決定している。具体的には、例えば、入力マスクの先頭から4.2個の要素が含まれる範囲が、縮小マスクの座標(0,0)の要素に対応する本来の区画であるが、分割位置を整数化(四捨五入)して4個の要素を含む位置に、分割位置を変更している。その結果、縮小マスクのマスク座標(0,0)の要素に対応する入力マスクの区画は、入力マスクのX座標が(0)〜(3)である範囲となる。同様に、縮小マスクのマスク座標(1,0)の要素に対応する入力マスクの区画は、入力マスクのX座標が(4)〜(7)である範囲となり、縮小マスクのマスク座標(2,0)の要素に対応する入力マスクの区画は、入力マスクのX座標が(8)〜(12)である範囲となり、縮小マスクのマスク座標(3,0)の要素に対応する入力マスクの区画は、入力マスクのX座標が(13)〜(16)である範囲となり、縮小マスクのマスク座標(4,0)の要素に対応する入力マスクの区画は、入力マスクのX座標が(17)〜(21)である範囲となる。
このように、本実施形態では、各分割位置を四捨五入して整数化することで、要素が分断されることを回避して、区画内に含まれる要素数を整数化している。かかる方法によれば、区画内に含まれる要素数は変化するが、その数は、2以下の僅かな要素数であるので本来の区画に対して大きく変化することはない。これによれば、区画内において、フィルタ演算に使用される要素(フィルタ係数が格納されている要素)の数をカウントする処理を簡便に行うことができる。その上、入力マスクの全要素を縮小マスクに割り付けることができるので、両マスクの整合性を向上させることができる。
S78の処理の後は、入力マスクメモリ23a9に記憶されている要素のマスク座標に基づき、入力マスクのマスク座標が(X,Y)〜(α,β)の範囲で、フィルタ演算に用いられた要素(フィルタ係数が格納されている要素)の数を集計する(S79)。これは、入力マスクメモリ23a9において、マスク座標が(X,Y)〜(α,β)の範囲で記憶されているフィルタ係数の数を確認することで実行される。入力マスクメモリ23a9には、S63〜S67の処理によって、参照点数分の要素の座標とその対応するフィルタ係数のみが記憶されるように構成されているからである。
次いで、集計した数を(その数が0でなければ)、S77の処理で求めた縮小マスクのマスク座標(x,y)のフィルタ係数に乗算し、得られた値を縮小マスクのフィルタ係数として、縮小マスクメモリ23a10にマスク座標(x,y)に対応つけて記憶する(S80)。
尚、S79の処理で集計数が0となる場合には、縮小画像に対するフィルタ演算においては使用されない要素としてCPU21に認識される。縮小マスクメモリ23a10には、この0、或いは使用しない要素であることを示す何らかの情報をマスク座標に対応つけて記憶させることで、CPU21に、そのマスク座標の要素をフィルタ演算に用いない要素であると認識させても良く、S79での集計結果が0であると、そのマスク座標を縮小マスクメモリ23a10に記憶させないことで、CPU21に、そのマスク座標の要素がフィルタ演算に用いない要素であると認識させても良い。本実施形態においては、S79での集計結果が0である場合には、対応する要素のマスク座標を縮小マスクメモリ23a10には記憶されない。
かかる縮小マスクの生成原理を図10を参照して具体的に説明する。図10において、紙面最左方には、15×15のマトリクスで形成された入力マスクを図示している。かかる入力マスクの各要素には、左上端の要素を(0,0)、右下端の要素を最終座標(14,14)として、マスク座標がそれぞれ付与されている。また、各要素には、上記した順に従って0から224までの識別番号が付与されており、入力マスクの上側には1行目に配列された要素について付与された識別番号「0,1,2,3,4,5,6,7,・・・,14」を、および左側には1列目に配列された要素について付与された識別番号「(0),15,30,45,60,75,・・・,210」を表示している。
図示した入力マスクにおいて、斜線の面種で表示されている要素は、実際にフィルタ演算に使用される要素であることを、白塗りの面種で表示されている要素は、フィルタ演算に用いられない要素であることを示している。また、黒塗りで示した要素は、注目画素に重ねられる中心要素を示している。
入力マスクの右方には、入力マスクから作成された5×5のマトリクスの縮小マスクを表示している。このため、入力マスクの3×3の要素が、縮小マスクの1の要素に対応する区画となっている。この縮小マスクにおいて、左上端と右下端とには、その位置の要素のマスク座標(0,0)および(4,4)が表示されている。
図10の中央に表示した縮小マスクは、実際のフィルタ演算には用いられない縮小マスクであるが、縮小マスクの生成原理を説明するために図示しており、左方の入力マスクの対応する区画においてフィルタ演算に使用される要素が含まれている場合を斜線の面種で示し、逆に、使用される要素が含まれていない場合を白塗りの面種で示している。中心要素は黒塗りの面種で示している。
また、図10の中央下方には、その上方の縮小マスクの拡大図を表示しており、かかる拡大図に示す各要素には、正規分布関数から算出された基本(重みを付加する前)のフィルタ係数を表示している。尚、白塗りの面種で示される要素は、対応する入力マスクの区画において、1つもフィルタ演算に使用される要素を含んでいないので、縮小マスクによるフィルタ演算においては使用されない要素となり、縮小マスクメモリ23a10には、その座標、フィルタ係数は記憶されていない。このため、そのフィルタ係数を括弧書きで示している。
ここで、入力マスクと縮小マスクとを比較すると、マスクにおいて使用される要素のパターン(言い換えれば、要素の間引きパターン)が異なっていることが明確である。間引きパターンを有する入力マスクを縮小して縮小マスクを形成する場合、縮小マスクの各要素を使用する要素とするか否かを何らかの手法で定める必要がある。ここで、単純には、入力マスクを縮小して縮小マスクのサイズを規定した後、縮小マスクの要素に対応する入力マスクの区画において使用される要素がある場合、その要素を使用する要素とし、縮小マスクの要素に対応する入力マスクの区画において使用される要素がない場合、その要素を使用しない要素とすることで、縮小マスクを作成することができる。しかし、図8の入力マスクと縮小マスクの要素のパターンとは明らかに異なっていることから、かかる手法では、入力マスクのパターンを反映することはできず、両マスクの整合性が低下してしまうことは明白である。
図10の最右方には、本実施形態において縮小画像に対するフィルタ演算に用いる縮小マスクを示し、その直下には、この縮小マスクの拡大図を示している。各要素に付した面種は、左方に示した縮小マスクと同様に、斜線の面種は使用される要素を、白塗りの面種は使用されない要素を示している。また、この縮小マスクにおいても、左上端と右下端とには、その位置の要素のマスク座標(0,0)および(4,4)が表示されている。
この縮小画像に対するフィルタ演算に用いる縮小マスクの拡大図に示すように、各要素には、入力マスクにおいてフィルタ演算で使用される要素(フィルタ係数が格納された要素)数で重み付けをしたフィルタ係数が格納されている。例えば、この縮小マスクの左上端のマスク座標(0,0)の要素においては、対応する入力マスクの区画は、入力マスクのマスク座標(0,0)〜(2,2)で囲まれる3×3要素の矩形の領域である。
かかる区画にはフィルタ演算に使用される要素が2つある。一方で、縮小マスクのマスク座標(0,0)に対応して、正規分布関数から求められたフィルタ係数は0.37である(図10の真ん中に示す縮小マスク参照)。従って、0.37を2倍した0.74が本実施形態において用いられる縮小マスクのマスク座標(0,0)に格納されているフィルタ係数となる。
また、縮小マスクのマスク座標(1,0)の要素においては、対応する入力マスクの区画は、入力マスクのマスク座標(3,0)〜(5,2)で囲まれる3×3要素の矩形の領域であるが、使用される要素が含まれていない。従って、縮小マスクのマスク座標(1,0)の要素は、フィルタ演算に使用されない要素となる。
このように、本実施形態では、入力マスクの間引きパターンは、ガウスフィルタの本来のフィルタ係数に対する重みに変換されることとなる。故に、その重みを、本来のフィルタ係数に加味して、縮小マスクの各フィルタ係数を生成することにより、入力マスクの要素を間引いた状態(間引きパターン)を反映した縮小マスクを作成することができる。つまり、入力マスクと縮小マスクとでは、マスクのパターンは異なってはいるが、フィルタ係数を操作することで、擬似的に入力マスクのパターン(内容)を縮小マスクに反映させているのである。
S80の処理の後は、xがm−1未満であるか(x<m−1)、即ち、1の行におけるX軸方向の最終座標に到達したかを調べ(S81)、その結果、xがm−1以上であれば(S81:No)、その行の最終座標に到達しているので、yがn−1未満であるか(x<n−1)、即ち、最終行に到達したかを調べる(S82)。ここで、yがn−1以上であれば(S82:No)、最終行の最終座標(マスクの最終座標)に到達しているので、このマスク生成処理(S12)を終了する。
ここで、S70の処理で確認した結果、縮小マスクのマスクサイズmが奇数であれば(S70:Yes)、S71の処理をスキップして、その処理をS72の処理に移行する。更に、S72の処理で確認した結果、縮小マスクのマスクサイズnが奇数であれば(S72:Yes)、S73の処理をスキップして、その処理をS74の処理に移行する。また、S81の処理で確認した結果、xがm−1未満であると(S81:Yes)、縮小マスクの1の行において最終座標に到達していないので、フィルタ係数を算出する次の要素を指定するため縮小マスクの現在指定中のx座標に1加算してx座標を更新する。また、入力マスクについて現在指定中のX座標(1の区画の左上端要素のX座標)にαを加算して、対応する1の区画の最終座標(1の区画における右下端要素のX座標)を算出し、その算出された値に更に1を加えて入力マスクの次の区画の先頭座標のX座標を指定してから(S83)、その処理をS77の処理に移行する。これにより、入力マスクの1の行において、最後の区画に到達するまで、縮小マスクの対応する要素のフィルタ係数が繰り返して算出される。
また、S82の処理で確認した結果、yがn−1未満であると(S82:Yes)、縮小マスクの1の行において最終座標に到達しているが、最終行には至っていないので、フィルタ係数を算出する次要素(次行の先頭要素)を指定するため縮小マスクの現在のy座標に1加算してy座標を更新すると共に、x座標を0にセットする。また、入力マスクの現在指定中のX座標(1の区画の左上端要素のX座標)を0にセットし、且つ、入力マスクの現在指定されているY座標(1の区画の左上端要素のY座標)にβを加算して現在の区画の最終座標(1の区画の右下端のY座標)を算出する。そして、その算出された値に更に1を加えて入力マスクの次の区画の先頭座標のY座標を指定してから(S84)、その処理をS77の処理に移行する。これにより、入力マスクの最終行に到達するまで、繰り返して処理が実行される。
このように、本複合機1では、予め定めたサイズの入力マスクを縮小画像の縮小率に基づいて縮小して、縮小マスクを作成するので、入力される元画像のサイズに応じて元画像用マスクの大きさが変動することがない。言い換えれば、入力マスクのマスクサイズの上限値が不明になることはない。入力マスクを記憶するための膨大なメモリ割当てを不要にでき、画像補正を実行するために必要なメモリ量を低減することができる。更に、縮小マスクに入力マスクの間引きパターンを反映することができるので、両者の整合性を向上させ、縮小画像から求められるクリップ範囲を、元画像に対して適切なものとすることができる上、フィルタ処理の演算速度を向上させることができる。
次に、図11と図12とを参照して、本発明の第2実施形態について説明する。上記第1実施形態の複合機1は、縮小マスクの要素に格納するフィルタ係数を、その要素に対応する入力マスクの区画において使用される要素数で、正規分布関数にて算出されたフィルタ係数に重み付けをして生成するように構成された。これに代えて、第2実施形態では、縮小マスクの要素に格納するフィルタ係数を、その要素に対応する入力マスクの区画において使用される要素に格納されたフィルタ係数の総和で、正規分布関数にて算出されたフィルタ係数に重み付けをして生成するように構成されている。尚、上記第1実施形態と同じ部分には同じ符号を付し、その説明を省略する。
第2実施形態の複合機1は、複合機1において入力マスクを生成するのではなく、予めフィルタ演算に用いられる要素の配置と、その要素に格納されるフィルタ係数と、マスクサイズとが設定された入力マスクがデフォルトで記憶されている。このため、第2実施形態では、入力マスクを記憶する入力マスクメモリは、RAM23に代えてROM22に設けられている。尚、入力マスクにおいてフィルタ演算に用いられる要素の配置は、各要素に付与された識別番号またはマスク座標を乱数値で選択して決定されている。また、この入力マスクをROM22に記憶させる工程が、第2実施形態においては、請求項記載の元画像用マスク記憶ステップに該当する。
図11は、第2実施形態のマスク生成処理(S12)のフローチャートである。第2実施形態では、第1実施形態と同様にRetinex処理が実行されるが、Retinex前処理(S1)の中で実行されるマスク生成処理(S12)が変更されている。
第2実施形態のマスク生成処理(S12)では、入力マスクの生成が不要であるので、第1実施形態のマスク生成処理(S12)におけるS61〜S67のステップは省略されている。第2実施形態のマスク生成処理(S12)では、まず、縮小率メモリ23a2に記憶される縮小率を読み出し、その後は、第1実施形態と同様に、入力マスクサイズM,Nに乗算して縮小率を乗算して縮小マスクサイズm,nを算出し、その縮小マスクサイズm,nの整数化、奇数値への補正、分割要素数の算出、正規分布関数に従った縮小マスクのフィルタ係数生成とを行う(S68〜S77)。
その後、マスク座標(α,β)を求めてから(S78)、入力マスクメモリに記憶されているフィルタ係数について、マスク座標(X,Y)〜(α,β)の範囲に属する要素のフィルタ係数の総和を算出する(S101)。続いて、算出した総和をS77で求めた座標(x,y)の要素のフィルタ係数に乗算し、得られた値を縮小マスクのフィルタ係数として、縮小マスクのマスク座標(x,y)に対応つけて縮小マスクメモリ23a10に記憶する(S102)。そして、かかるフィルタ係数の算出を、縮小マスクの全要素に対して実行する(S81〜S84)。
尚、第2実施形態において入力マスクメモリにディフォルトで記憶されている入力マスクは、フィルタ演算に使用される要素についてのみフィルタ係数が格納されたものである。このため、縮小マスクの要素に対応する入力マスクの区画にフィルタ演算に使用される要素がない場合が生じるが、かかる場合においては、S101の処理においてマスク座標(X,Y)〜(α,β)の範囲に属する要素の座標およびフィルタ係数が入力マスクメモリには記憶されていない。従って、S101の処理では、フィルタ係数の総和は算出されず、S102の処理をスキップして、S81の処理を実行する。
図12は、かかる第2実施形態の縮小マスクの生成原理を説明する図である。図10と同様に、紙面最左方には、15×15のマトリクスで形成された入力マスクを、紙面中央と、紙面最右方には、入力マスクから生成された5×5のマトリクスの縮小マスクを示しており、各縮小マスクの表示の下方には、それぞれ縮小マスクの拡大図を示している。また、入力マスクの上側には1行目に配列された要素について付与された識別番号「0,1,2,3,4,5,6,7,・・・,14」を、および左側には1列目に配列された要素について付与された識別番号「(0),15,30,45,60,75,・・・,210」を、表示している。
中央の縮小マスクは、実際のフィルタ演算には用いられない縮小マスクであるが、縮小マスクの生成原理を説明するために図示しており、その拡大図には、正規分布関数から算出された基本のフィルタ係数を表示している。最右方の縮小マスクは、第2実施形態において縮小画像に対するフィルタ演算に用いる縮小マスクであり、この縮小マスクの拡大図においては、入力マスクにおいてフィルタ演算で使用される要素に格納されたフィルタ係数の総和で重み付けをすることで求められた縮小マスクのフィルタ係数が各要素に対応して表示されている。
図示した各マスクにおいて、左上端と右下端とには、その位置の要素のマスク座標を表示しており、また、斜線の面種で表示されている要素は、実際にフィルタ演算に使用される要素とし、白塗りの面種で表示されている要素は、フィルタ演算に用いられない要素であることを示している。また、黒塗りで示した要素は、注目画素に重ねられる中心要素を示している。
例えば、この縮小マスクの左上端のマスク座標(0,0)の要素においては、対応する入力マスクの区画は、入力マスクのマスク座標(0,0)〜(2,2)で囲まれる3×3要素の矩形の領域である。
かかる区画にはフィルタ演算に使用される要素が2つあり、そのフィルタ係数は、入力マスクの右上方に示す拡大図に表示したとおり、0と0.02とである。尚、入力マスクの拡大図内の各要素には、正規分布関数によって求められる各要素のフィルタ係数を示しているが、用いられない(格納されていない)フィルタ係数は括弧書きで示している。
一方で、縮小マスクのマスク座標(0,0)に対応して、正規分布関数から求められたフィルタ係数は0.37である(図12中央に示す縮小マスク参照)。従って、0.37に、入力マスクの対応する区画において使用されるフィルタ係数の総和0.02を乗算した0.0074が、第2実施形態において用いられる縮小マスクのマスク座標(0,0)に格納されているフィルタ係数となる。
同様の演算によって、縮小マスクの各要素に対応する入力マスクの区画内において、演算に用いられるフィルタ係数がある場合には、そのフィルタ係数の総和が算出されるとともに、その総和が重みとして、正規分布関数によって求められる基本のフィルタ係数に乗算され、縮小画像の各要素のフィルタ係数が導出される。図12の最右方の縮小マスクには、かかる演算によって得られたフィルタ係数が各要素に対応して表示されている。尚、縮小マスクの各要素に対応する入力マスクの区画内において、演算に用いられるフィルタ係数がない場合には、上記したように、縮小マスクのその対応する要素はフィルタ演算には用いられない要素となり、フィルタ係数は格納されない。
このように、第2実施形態の複合機1によれば、縮小マスクの各要素に対応する入力マスクの区画内において、演算に用いられるフィルタ係数がある場合には、そのフィルタ係数の総和が重みとして縮小マスクのフィルタ係数に加味される。このため、入力マスクの内容を縮小マスクに反映させることができ、両マスクの整合性を向上させ、結果として、縮小画像から求められるクリップ範囲を、元画像に対する適切なパラメータとすることができる。
以上、実施形態に基づいて本発明を説明したが、本発明は上記各実施形態に何ら限定されるものでなく、本発明の趣旨を逸脱しない範囲内で種々の改良変形が可能であることは容易に推察できるものである。
例えば、上記各実施形態では、入力マスクは乱数によってフィルタ係数を格納する要素(フィルタ演算に用いる要素)が選定された。これに代えて、ユーザや設計者が任意に要素を選択するようにしてもよい。更には、上記各実施形態においては、縮小マスクのフィルタ演算に用いる要素についてのみ、正規分布関数に従ったフィルタ係数が算出されるようにマスク生成処理(S12)は構成されたが、これに代えて、全ての要素の正規分布関数を最初にまとめて算出して縮小マスクメモリ23a10に記憶すると共に、使用しない要素に対してはその旨を示す情報を付与することで、使用する要素と否である要素とを区別してCPU21が認識できるようにしても良い。
また、上記第1実施形態では、入力マスクを複合機1において生成し、上記第2実施形態では、入力マスクは予め複合機1内のROM22に記憶される構成としたが、これに代えて、第1実施形態の複合機1を入力マスクを予め記憶する構成としても良く、第2実施形態の複合機1を装置内で入力マスクを生成する構成としても良い。
更には、上記各実施形態では、マスク生成処理(S12)において、正規分布関数に従ったフィルタ係数(重みを付加する前のフィルタ係数)は、S77の処理により縮小マスクの全要素について算出されるように構成された。これに代えて、S78,S79の処理の後にS77の処理を行うようにすると共に、入力マスクの対応する区画において使用される要素がない場合には、S77の処理をスキップして、正規分布関数に従ったフィルタ係数の算出を回避するようにマスク生成処理(S12)を構成しても良い。
また、上記各実施形態では、入力マスクの全要素を縮小マスクに割り付けるとように、入力マスクを区分したが、必ずしも、入力マスクの全要素を縮小マスクに割り付ける必要はなく、例えば、縮小マスクの要素数で入力マスクの全要素を分割した場合に生じる端数を切り捨て、入力マスクの全要素の内、縮小マスクの要素数の整数倍の範囲ついて縮小マスクに割り付けるものとしても良い。
更には、上記各実施形態のマスク生成処理(S12)においては、1の区画に属する要素数を整数化するように調整したが、これに代えて、分割要素数から導出される分割位置毎に分割された区画を縮小マスクの1の要素に対応する区画として、処理を行っても良い。