図1を参照して、この実施例のディジタルカメラ10は、光学レンズ12を含む。被写界の光学像は、光学レンズ12を通してイメージセンサ14の撮像面に入射する。撮像面では、被写界を表す電荷が光電変換によって生成される。
被写界を表すリアルタイム動画像(スルー画像)をLCDモニタ32に表示するとき、CPU40は、プリ露光の繰り返しと間引き読み出しとをTG(Timing Generator)16に命令する。TG16は、垂直同期信号が発生する毎に撮像面にプリ露光を施し、これによって生成された電荷を間引き態様で読み出す。この結果、一部の電荷によって形成される低解像度の生画像信号が、イメージセンサ14から周期的に出力される。
出力された生画像信号は、CDS/AGC/AD回路18で相関2重サンプリング,自動ゲイン調整およびA/D変換の一連の処理を施され、これによってディジタル信号である生画像データが得られる。信号処理回路20は、CDS/AGC/AD回路18から出力された生画像データに色分離,白バランス調整,YUV変換などの処理を施し、Y:U:V=4:2:2の比率を有する画像データを作成する。作成された画像データは、バッファ回路22に一時的に蓄えられる。バッファ回路22は、蓄積された画像データをバスB1を介して所定量ずつメモリ制御回路24に与える。画像データは、メモリ制御回路24によってSDRAM26に書き込まれる。
バッファ回路28は、SDRAM26に格納された画像データをバスB1およびメモリ制御回路24を通して所定量ずつ読み出し、読み出された画像データをビデオエンコーダ30に与える。ビデオエンコーダ30は、与えられた画像データをコンポジットビデオ信号に変換し、変換されたコンポジットビデオ信号をLCDモニタ32に与える。この結果、スルー画像がモニタ画面に表示される。
キー入力装置42によって撮影操作が行われると、CPU40は、1回の本露光と全画素読み出しとをTG16に命令する。TG16は、撮像面に本露光を施し、これによって生成された電荷の全て読み出す。この結果、全ての電荷によって形成される高解像度の生画像信号がイメージセンサ14から出力される。
出力された生画像信号は、上述と同様の処理を施される。つまり、CDS/AGC/AD回路18によって相関2重サンプリング,自動ゲイン調整およびA/D変換の一連の処理を施され、信号処理回路20によって色分離,白バランス調整,YUV変換などの処理を施される。Y:U:V=4:2:2の比率を有する画像データは、バッファ回路22,バスB1,メモリ制御回路24を経てSDRAM26に書き込まれる。
SDRAM26に格納された画像データはその後、後述する手振れ補正処理を施される。手振れ補正処理を施された画像データもまた、SDRAM26に格納される。
バッファ回路34は、手振れ補正処理が施された画像データをバスB1およびメモリ制御回路24を通して所定量ずつ読み出し、読み出された画像データをJPEGコーデック36に与える。画像データは、JPEG方式に従って圧縮される。圧縮画像データつまりJPEGデータは、バッファ回路38に一時的に蓄えられる。バッファ回路38は、蓄積されたJPEGデータをバスB1を介して所定量ずつメモリ制御回路24に与える。JPEGデータは、メモリ制御回路24によってSDRAM26に書き込まれる。
CPU40は、SDRAM26に確保されたJPEGデータをバスB1およびメモリ制御回路24を通して読み出し、読み出されたJPEGデータをI/F回路46を通して記録媒体48に記録する。
手振れ補正処理は、以下の要領で実行される。CPU40は、撮影操作が行われたとき、操作タイミング情報を含む撮影操作通知をCPU70に向けて発行する。この通知は、バスB1,バスブリッジ50,バスB2,バスI/F54およびバスB3を介して、CPU70に与えられる。CPU70は、与えられた撮影操作通知を参照して撮影操作が行われたタイミングを特定し、特定されたタイミングにおけるジャイロセンサ72の出力に基づいて撮影操作に起因する撮像面(被写界)の手振れ量を算出する。
検出された手振れ量が閾値を上回るときは“5×5”のタップ長が選択され、検出された手振れ量が閾値以下のときは“3×3”のタップ長が選択される。CPU70は、バスB3,バスI/F54およびバスB2を通してSRAM52にアクセスし、決定されたタップ長に対応するフィルタ係数をSRAM52から読み出す。読み出されたフィルタ係数は、フィルタ回路68に与えられる。
CPU70はまた、決定されたタップ長に対応するデータ読み出し周期,読み出しサイズおよび重複画素数をバッファ回路60および62に設定し、決定されたタップ長に対応するデータ書き込み周期,書き込みサイズおよび重複画素数をバッファ回路64および66に設定し、決定されたタップ長に対応する数値をデータ取得パラメータTR_1〜TR_4の各々ならびにフィルタ処理パラメータF_1〜F_4の各々に設定する。
“5×5”のタップ長が選択されたときは、データ読み出し周期“T5”,読み出しサイズ“68×52”および重複画素数“4”がバッファ回路60および62に設定され、データ書き込み周期“T5”,書き込みサイズ“64×48”および重複画素数“0”がバッファ回路64および66に設定される。
“3×3”のタップ長が選択されたときは、データ読み出し周期“T3”,読み出しサイズ“66×50”および重複画素数“2”がバッファ回路60および62に設定され、データ書き込み周期“T3”,書き込みサイズ“64×48”および重複画素数“0”がバッファ回路64および66に設定される。
また、“5×5”のタップ長が選択されときは、開始ライン番号“0”および取得量“50”がデータ取得パラメータTR_1に設定され、開始ライン番号“46”および取得量“52”がデータ取得パラメータTR_2に設定され、開始ライン番号“94”および取得量“52”がデータ取得パラメータTR_3に設定され、そして開始ライン番号“142”および取得量“50”がデータ取得パラメータTR_4に設定される。
“3×3”のタップ長が選択されときは、開始ライン番号“0”および取得量“49”がデータ取得パラメータTR_1に設定され、開始ライン番号“47”および取得量“50”がデータ取得パラメータTR_2に設定され、開始ライン番号“95”および取得量“50”がデータ取得パラメータTR_3に設定され、そして開始ライン番号“143”および取得量“49”がデータ取得パラメータTR_4に設定される。
さらに、“5×5”のタップ長が選択されたときは、上側画素“2”,右側画素“2”および左側画素“2”がフィルタ処理パラメータF_1に設定され、右側画素“2”および左側画素“2”がフィルタ処理パラメータF_2およびF_3の各々に設定され、下側画素“2”,右側画素“2”および左側画素“2”がフィルタ処理パラメータF_4に設定される。
“3×3”のタップ長が選択されたときは、上側画素“1”,右側画素“1”および左側画素“1”がフィルタ処理パラメータF_1に設定され、右側画素“1”および左側画素“1”がフィルタ処理パラメータF_2およびF_3の各々に設定され、下側画素“1”,右側画素“1”および左側画素“1”がフィルタ処理パラメータF_4に設定される。
撮影操作に応答してSDRAM26に確保される画像データは、水平256画素×垂直192ラインの解像度を有する。上述の開始ライン番号および取得量はそれぞれ、かかる画像データの垂直方向における開始画素位置および画素数を定義する。したがって、“5×5”のタップ長が選択されたときにデータ取得パラメータTR_1〜TR_4によって規定される範囲は、垂直方向において図4(A)に示すように部分的に重複する。また、“3×3”のタップ長が選択されたときにデータ取得パラメータTR_1〜TR_4によって規定される範囲は、垂直方向において図4(B)に示すように部分的に重複する。
データ取得パラメータTR_1〜TR_4の設定が完了すると、CPU70は、4つのデータ取得要求を図2(A)または図3(A)に示すタイミングでD1−I/F44aに向けて発行し、4つのフィルタ処理開始命令を図2(C)または図2(C)に示すタイミングでバッファ回路60および62の各々に向けて発行し、4つのデータ返送命令を図2(E)または図3(E)に示すタイミングでD1−I/F44bに向けて発行する。図2(A),図2(C)および図2(E)に示すタイミングは“5×5”のタップ長に対応し、図3(A),図3(C)および図3(E)に示すタイミングは“3×3”のタップ長に対応する。
D1−I/F44aに向けて発行される4つのデータ取得要求は、データ取得パラメータTR_1〜TR_4をそれぞれ含む。D1−I/F44aは、与えられたデータ取得要求のデータ取得パラメータによって規定される一部の画像データをメモリ制御回路24を通してSDRAM26から読み出す。読み出された画像データは、図2(B)または図3(B)に示すタイミングで、D1−I/F44bおよびメモリ制御回路56を通してSDRAM58に書き込まれる。
バッファ回路60および62の各々に向けて発行される4つのフィルタ処理開始命令は、フィルタ処理パラメータF_1〜F_4をそれぞれ含む。バッファ回路60および62の各々は、フィルタ処理開始命令が与えられる毎に、SDRAM58に格納された画像データを読み出す。読み出し周期,読み出しサイズ,および重複画素数は、CPU70の設定に従う。画像データを形成するYデータおよびU/Vデータは、バッファ回路60および62によってそれぞれ読み出される。
フィルタ処理回路68は、バッファ回路60および62からYデータおよびU/Vデータをそれぞれ入力し、入力されたYデータおよびU/Vデータに2次元フィルタ処理を施す。この処理には、CPU70によって設定されたフィルタ係数が用いられる。“5×5”のタップ長が選択されたときは水平5画素×垂直5ライン毎のフィルタ処理が行われ、“3×3”のタップ長が選択されたときは水平3画素×垂直3ライン毎のフィルタ処理が行われる。
フィルタ処理を施されたYデータはバッファ回路64,バスB4およびメモリ制御回路56を通してSDRAM58に戻され、フィルタ処理を施されたU/Vデータはバッファ回路66,バスB4およびメモリ制御回路56を通してSDRAM58に戻される。書き込み周期,書き込みサイズ,および重複画素数は、CPU70の設定に従う。
D1−I/F44bは、データ返送命令が発行される毎に、フィルタ処理を施された画像データをメモリ制御回路56を通してSDRAM58から読み出す。読み出された画像データは、D1−I/F44a,バスB1およびメモリ制御回路24を通してSDRAM26に書き込まれる。つまり、フィルタ処理を施された画像データは、図2(F)または図3(F)に示すタイミングでSDRAM58からSDRAM26に転送される。
図2(A)〜図2(C)および図4(A)から分かるように、“5×5”のタップ長が選択されたとき、フィルタ処理パラメータF_1に対応して注目される画像データは第0ライン〜第49ラインの画像データであり、フィルタ処理パラメータF_2に対応して注目される画像データは第46ライン〜第97ラインの画像データであり、フィルタ処理パラメータF_3に対応して注目される画像データは第94ライン〜第145ラインの画像データであり、そしてフィルタ処理パラメータF_4に対応して注目される画像データは第142ライン〜第191ラインの画像データである。
また、図3(A)〜図3(C)および図4(B)から分かるように、“3×3”のタップ長が選択されたとき、フィルタ処理パラメータF_1に対応して注目される画像データは第0ライン〜第48ラインの画像データであり、フィルタ処理パラメータF_2に対応して注目される画像データは第47ライン〜第96ラインの画像データであり、フィルタ処理パラメータF_3に対応して注目される画像データは第95ライン〜第144ラインの画像データであり、そしてフィルタ処理パラメータF_4に対応して注目される画像データは第143ライン〜第191ラインの画像データである。
バッファ回路60および62はそれぞれ、フィルタ処理パラメータF_1〜F_4を参照して、図4(A)または図4(B)に斜線で示す周辺領域の画素が直近の画素によって補完されるように、YデータおよびU/Vデータを読み出す。“5×5”のタップ長が選択されたときは2画素が周辺領域に割り当てられ、“3×3”のタップ長が選択されたときは1画素が周辺領域に割り当てられる。したがって、“5×5”のタップ長が選択されたときに発行されるフィルタ処理開始命令に対して注目される画像データのライン数はいずれも“52”である。また、“3×3”のタップ長が選択されたときに発行されるフィルタ処理命令に対して注目される画像データのライン数はいずれも“50である。
“5×5”のタップ長が選択されたとき、バッファ回路60および62は、設定された読み出しサイズ“68×52”に基づいて、注目する52ラインの画像データを水平68画素ずつ垂直方向に走査する。同時に設定された重複画素数は“4”であるため、水平方向には図4(A)に示すように4画素の重複が生じる。水平68画素のYデータおよびU/Vデータは、データ読み出し周期T5でフィルタ回路68に与えられる。
また、“3×3”のタップ長が選択されたとき、バッファ回路60および62は、設定された読み出しサイズ“66×50”に基づいて、注目する50ラインの画像データを水平66画素ずつ垂直方向に走査する。同時に設定された重複画素数は“2”であるため、水平方向には図4(B)に示すように2画素の重複が生じる。水平66画素のYデータおよびU/Vデータは、データ読み出し周期T3でフィルタ回路68に与えられる。
フィルタ回路68は、“5×5”のタップ長が選択されたとき水平68画素×垂直52ラインの画像データに基づいて水平64画素×垂直48ラインの処理画像データを作成し、“3×3”のタップ長が選択されたとき水平66画素×垂直50ラインの画像データに基づいて水平64画素×垂直48ラインの処理画像データを作成する。
バッファ回路64は、フィルタ処理を施されたYデータをSDRAM58に書き込むとき、水平64画素ずつ垂直画素方向に走査する。同様に、バッファ回路66は、フィルタ処理を施されたU/VデータをSDRAM58に書き込むとき、水平64画素ずつ垂直画素方向に走査する。“5×5”のタップ長が選択されたときは、データ書き込み周期T5が経過する毎に64画素のYデータまたはU/VデータがSDRAM58に書き込まれる。“3×3”のタップ長が選択されたときは、データ書き込み周期T3が経過する毎に64画素のYデータまたはU/VデータがSDRAM58に書き込まれる。
この結果、図4(A)に示す水平260画素×垂直196ラインの画像データまたは図4(B)に示す水平258画素×垂直194ラインの画像データに基づいて、図5に示す水平256画素×垂直192ラインの処理画像データが得られる。
CPU70は、詳しくは図6〜図7に示すフィルタ処理タスクを含む複数のタスクを並列的に実行する。なお、これらのタスクに対応する制御プログラムは、図示しないフラッシュメモリに記憶される。
撮影操作通知がCPU40から与えられると、ステップS1からステップS3に進み、撮影操作通知に含まれる操作タイミング情報を参照して、撮影操作が行われたタイミングでのジャイロセンサ72の出力を検出する。ステップS5では、検出されたジャイロセンサ72の出力に基づいて撮影操作に起因する手振れ量を算出する。ステップS7では算出された手振れ量が閾値THを上回るか否かを判別し、YESであればステップS9に進む一方、NOであればステップS17に進む。
ステップS9ではタップ長を“5×5”とし、ステップS11ではデータ読み出し周期,読み出しサイズおよび重複画素数をそれぞれ“T5”,“68×52”および“4”とし、ステップS13ではデータ書き込み周期,書き込みサイズおよび重複画素数をそれぞれ“T5”,“64×48”および“0”とする。ステップS15ではデータ取得パラメータTR_1〜TR_4を“5×5”のタップ長に対応する数値に設定し、ステップS25ではフィルタ処理パラメータF_1〜F_4を“5×5”のタップ長に対応する数値に設定する。
一方、ステップS17ではタップ長を“3×3”とし、ステップS19ではデータ読み出し周期,読み出しサイズおよび重複画素数を“T3”,“66×50”および“2”とし、ステップS21ではデータ書き込み周期,書き込みサイズおよび重複画素数を“T3”,“64×48”および“0”する。ステップS23ではデータ取得パラメータTR_1〜TR_4を“3×3”のタップ長に対応する数値に設定し、ステップS27ではフィルタ処理パラメータF_1〜F_4を“3×3”のタップ長に対応する数値に設定する。
ステップS9またはS17の処理によって、所望のタップ長に対応するフィルタ係数がフィルタ回路68に設定される。ステップS11またはS19の処理によって、所望のデータ読み出し周期,読み出しサイズおよび重複画素数がバッファ回路60および62に設定される。ステップS13またはS21の処理によって、所望のデータ書き込み周期,書き込みサイズおよび重複画素数がバッファ回路64および66に設定される。
ステップS15の処理では、データ取得パラメータTR_1は開始ライン番号および取得量として“0”および“50”をそれぞれ有し、データ取得パラメータTR_2は開始ライン番号および取得量として“46”および“52”をそれぞれ有し、データ取得パラメータTR_3は開始ライン番号および取得量として“94”および“52”をそれぞれ有し、データ取得パラメータTR_4は開始ライン番号および取得量として“142”および“50”をそれぞれ有する。
また、ステップS25の処理では、フィルタ処理パラメータF_1は上側補完画素数,右側補完画素数および左側補完画素数として“2”を有し、フィルタ処理パラメータF_2およびF_3の各々は右側補完画素数および左側補完画素数として“2”を有し、フィルタ処理パラメータF_4は下側補完画素数,右側補完画素数および左側補完画素数として“2”を有する。
ステップS23の処理では、データ取得パラメータTR_1は開始ライン番号および取得量として“0”および“49”をそれぞれ有し、データ取得パラメータTR_2は開始ライン番号および取得量として“47”および“50”をそれぞれ有し、データ取得パラメータTR_3は開始ライン番号および取得量として“95”および“50”をそれぞれ有し、データ取得パラメータTR_4は開始ライン番号および取得量として“143”および“49”をそれぞれ有する。
また、ステップS27の処理では、フィルタ処理パラメータF_1は上側補完画素数,右側補完画素数および左側補完画素数として“1”を有し、フィルタ処理パラメータF_2およびF_3の各々は右側補完画素数および左側補完画素数として“1”を有し、フィルタ処理パラメータF_4は下側補完画素数,右側補完画素数および左側補完画素数として“1”を有する。
ステップS29では変数Xを“1”に設定し、ステップS31ではデータ取得パラメータを“TR_X”とするデータ取得命令をD1−I/F44aに向けて発行する。この結果、“TR_X”によって指定された範囲に属する一部の画像データが、SDRAM26からSDRAM58に転送される。
ステップS33では所定時間待機し、続くステップS33ではフィルタ処理パラメータを“F_X”とするフィルタ処理開始命令をバッファ回路60および62に向けて発行する。SDRAM58に格納された画像データは、設定されたデータ読み出し周期,読み出しサイズおよび重複画素数に従う態様で読み出され、フィルタ回路68によって2次元フィルタ処理を施される。処理された画像データはバッファ回路64および66に与えられ、設定されたデータ書き込み周期,書き込みサイズおよび重複画素数に従う態様でSDRAM58に戻される。SDRAM58には、水平64画素×垂直48ラインの処理画像データが確保される。
ステップS37では水平64画素×垂直48ラインの処理画像データが得られたか否かを判断し、YESであればステップS39でD1−I/F44bに向けてデータ返送命令を発行する。SDRAM58に確保された処理画像データは、D1−I/F44bによってSDRAM26に転送される。
ステップS41では、変数Xを“4”と比較する。変数Xが“4”に満たないときは、ステップS43で変数Xをインクリメントし、ステップS31に戻る。変数Xが“4”に達すると、ステップS1に戻る。
メモリ制御回路56は、図8に示すように構成される。SDRAM58へのデータ書き込みを担うD1−I/F44b,バッファ回路64および66の各々は、“データ書き込み”のアクセス態様情報とアクセスする画素数を示す画素数情報と出力元の識別情報とを含むリクエストを調停回路56cに与え、hv座標系のアドレスが記述されたアドレス情報をアドレス選択回路56eに与え、そして書き込むべき画像データを3ステートバッファ56aに与える。
特に、バッファ回路64および66の各々は、“5×5”のタップ長が選択されたとき“64”を示す画素数情報を含むリクエストをデータ書き込み周期T5で発行し、“3×3”のタップ長が選択されたとき“64”を示す画素数情報を含むリクエストをデータ書き込み周期T3で発行する。アドレス情報は、書き込みサイズ“64×48”に基づく。
一方、SDRAM58からのデータ読み出しを担うD1−I/F44b,バッファ回路60および62の各々は、“データ読み出し”のアクセス態様情報とアクセスする画素数を示す画素数情報と出力元の識別情報とを含むリクエストを調停回路56cに与え、hv座標系のアドレスが記述されたアドレス情報をアドレス選択回路56eに与える。
特に、バッファ回路60および62の各々は、“5×5”のタップ長が選択されたとき“68”を示す画素数情報を含むリクエストをデータ読み出し周期T5で発行し、“3×3”のタップ長が選択されたとき“66”を示す画素数情報を含むリクエストをデータ読み出し周期T3で発行する。また、アドレス情報は、読み出しサイズ“68×52”または“66×50”に基づく。
なお、SDRAM58へのアクセス動作は、バースト転送態様で実行される。具体的には、1回のバーストアクセス動作によって、画素数情報によって指定される画素数に相当するデータ書き込み/データ読み出しが実行される。
調停回路56cは、与えられた複数のリクエストの中から優先度が最も高いリクエストを選択し、選択されたリクエストの出力元に承認信号ACKを返送し、選択されたリクエストに対応するアドレス情報の選択をアドレス選択回路56eに命令し、そして選択されたリクエストに含まれるアクセス態様情報に従うアクセス動作をメモリアクセス回路56dに命令する。選択されたリクエストがD1−I/F44bからSDRAM58への書き込みのリクエストであれば、調停回路56cは、オフセットの確保をアドレス変換回路56fに命令する。
アドレス選択回路56eは、与えられたアドレス情報の中から命令に従うアドレス情報を選択し、選択されたアドレス情報をアドレス変換回路56fに与える。
アドレス変換回路56fは、与えられたアドレス情報が示す水平アドレスおよび垂直アドレスを所定の演算式を用いてロウアドレスおよびカラムアドレスに変換する。オフセットの確保が命令されたとき、アドレス変換回路56fは、レジスタ56rに設定されたオフセット値を変換されたロウアドレスおよびカラムアドレスに加算する。こうして決定されたロウアドレスおよびカラムアドレスは、SDRAM58に向けて出力される。まずロウアドレスが出力され、続いてカラムアドレスが出力される。
メモリアクセス回路56dは、アドレス変換回路56fからロウアドレスが出力されるタイミングでRAS(Row Address Strobe)信号とアクティブコマンドとを出力し、アドレス変換回路56fからカラムアドレスが出力されるタイミングでCAS(Column Address Strobe)信号と書き込み/読み出しコマンドを出力する。メモリアクセス回路56dはさらに、データ書き込みを行うとき3ステートバッファ56aを能動化し、データ読み出しを行うとき3ステートバッファ56bを能動化する。
この結果、データ書き込みのためにD1−I/F44b,バッファ回路64または66から出力された指定画素数の画素データは、3ステートバッファ56aを介してSDRAM58に与えられ、アドレス変換回路56fによって指定されたロウアドレスおよびカラムアドレスを基点として連続する複数のアドレスに書き込まれる。
また、データ読み出し時は、アドレス変換回路56fによって指定されたロウアドレスおよびカラムアドレスを基点として連続する複数のアドレスから、指定画素数の画素データが読み出される。読み出された画素データは、3ステートバッファ56bを介してD1−I/F44b,バッファ回路60または62に与えられる。
図9(A)および図9(B)を参照して、SDRAM58のメモリエリアは、複数のメモリブロックMB1,MB2,MB3,…に分割される。各々のメモリブロックのサイズは、たとえば300画素の画素データを格納できる容量を有する。D1−I/F44bから与えられた画像データを形成する複数ラインの画素データは、複数のメモリブロックにそれぞれ書き込まれる。バッファ回路64および66から出力された画像データを形成する複数ラインの画素データもまた、複数のメモリブロックにそれぞれ書き込まれる。
ただし、D1−I/F44bからの画像データを書き込みときはレジスタ56rに設定されたオフセットが有効化されるため、書き込みを開始するロウアドレスおよびカラムアドレスは、先頭からオフセットに相当する距離だけ後方にシフトされる。
この結果、フィルタ処理を施される前の画像データを形成する複数ラインの画素データは、図9(A)に示す要領で複数のメモリブロックにそれぞれ書き込まれる。一方、フィルタ処理を施された画像データを形成する複数ラインの画素データは、図9(B)に示す要領で複数のメモリブロックにそれぞれ書き込まれる。
フィルタ回路68は、図10に示すように構成される。レジスタ74a〜74eは、CPU70から出力されたフィルタ係数を保持する。“5×5”のタップ長が選択されたときは、フィルタ係数C(0)〜C(4)がレジスタ74a〜74eにそれぞれ設定される。“3×3”のタップ長が選択されたときは、フィルタ係数C(0)〜C(2)がレジスタ74a〜74cにそれぞれ設定され、“0”がレジスタ74dおよび74eの各々に設定される。
なお、“5×5”のタップ長が選択されたとき、フィルタ係数C(0)が示す数値は、注目するラインが変更される毎に“c01”→“c02”→“c03”→“c04”→“c05”→“c01”→…の要領で更新され、フィルタ係数C(1)が示す数値は、注目するラインが変更される毎に“c11”→“c12”→“c13”→“c14”→“c15”→“c11”→…の要領で更新される。同様に、フィルタ係数C(2)が示す数値は、注目するラインが変更される毎に“c21”→“c22”→“c23”→“c24”→“c25”→“c21”→…の要領で更新され、フィルタ係数C(3)が示す数値は、注目するラインが変更される毎に“c31”→“c32”→“c33”→“c34”→“c35”→“c31”→…の要領で更新され、フィルタ係数C(4)が示す数値は、注目するラインが変更される毎に“c41”→“c42”→“c43”→“c44”→“c45”→“c41”→…の要領で更新される。
また、“3×3”のタップ長が選択されたとき、フィルタ係数C(0)が示す数値は、注目するラインが変更される毎に“c01”→“c02”→“c03”→“c01”→…の要領で更新され、フィルタ係数C(1)が示す数値は、注目するラインが変更される毎に“c11”→“c12”→“c13”→“c11”→…の要領で更新され、フィルタ係数C(2)が示す数値は、注目するラインが変更される毎に“c21”→“c22”→“c23”→“c21”→…の要領で更新される。
セレクタ76aは、バッファ回路60から入力されたYデータの書き込み先をラインメモリ78a〜78eの間で循環的に切り換え、セレクタ76bは、バッファ回路62から入力されたU/Vデータの書き込み先をラインメモリ80a〜80eの間で循環的に切り換える。“5×5”のタップ長が選択されたとき、切り換え周期はデータ読み出し周期T5に一致する。“3×3”のタップ長が選択されたとき、切り換え周期はデータ読み出し周期T3に一致する。セレクタ76aの切り換え動作はバッファ回路60によって実行され、セレクタ76bの切り換え動作はバッファ回路62によって実行される。
この結果、ラインメモリ78a〜78eは、“5×5”のタップ長が選択されたとき図11(A)に示すように水平68画素×垂直5ラインのYデータを保持し、“3×3”のタップ長が選択されたとき図12(A)に示すように水平66画素×垂直3ラインのYデータを保持する。同様に、ラインメモリ80a〜80eの各々は、“5×5”のタップ長が選択されたとき図11(A)に示すように水平68画素のU/Vデータを保持し、“3×3”のタップ長が選択されたとき図12(A)に示すように水平66画素のU/Vデータを保持する。
フィルタ演算回路82aは、ラインメモリ78a〜78eの各々から水平5画素ずつYデータを読み出し、読み出された5画素のYデータとレジスタ74a〜74eに保持されたフィルタ係数C(0)〜C(4)とに基づいて1画素のY’データを作成する。作成されたY’データは、注目する水平5画素の中央に割り当てられる。
フィルタ演算回路82bも同様に、ラインメモリ80a〜80eの各々から水平5画素ずつU/Vデータを読み出し、読み出された5画素のU/Vデータとレジスタ74a〜74eに保持されたフィルタ係数C(0)〜C(4)とに基づいて1画素のU’/V’データを作成する。作成されたU’/V’データも、注目する水平5画素の中央に割り当てられる。
この結果、“5×5”のタップ長が選択されたときは、図11(A)に示す水平68画素×垂直5ラインのYデータまたはU/Vデータに基づいて、図11(B)に示す水平64画素×垂直5ラインのYデータまたはU/Vデータが作成される。また、“3×3”のタップ長が選択されたときは、図12(A)に示す水平66画素×垂直3ラインのYデータまたはU/Vデータに基づいて、図12(B)に示す水平64画素×垂直3ラインのYデータまたはU/Vデータが作成される。
図11(B)に示す画素PH1〜PH6はそれぞれ、図11(A)に示す画素ブロックPB1〜PB6に基づいて作成される。また、図12(B)に示す画素PH7〜PH9はそれぞれ、図12(A)に示す画素ブロックPB7〜PB9に基づいて作成される。
フィルタ演算回路82aから出力されたY’データは、加算器84aを経てラインメモリ86aに書き込まれる。コントローラ88aは、次ラインに属する64画素のY’データがフィルタ演算回路82aから出力されるときに、ラインメモリ86aに格納された現ラインのY’データを加算器84aに与える。現ラインのY’データおよび次ラインのY’データは、加算器84aによって加算される。
同様に、フィルタ演算回路82bから出力されたU’/V’データは、加算器84bを経てラインメモリ86bに書き込まれる。コントローラ88bは、次ラインに属する64画素のU’/V’データがフィルタ演算回路82bから出力されるときに、ラインメモリ86bに格納された現ラインのU’/V’データを加算器84bに与える。現ラインのY’データおよび次ラインのY’データは、加算器84bによって加算される。
“5×5”のタップ長が選択されたときは、かかる加算処理が垂直5ラインにわたって実行される。図11(C)に示す水平64画素×垂直1ラインのY”データおよびU”/V”データは、垂直5ライン毎に得られる。また、“3×3”のタップ長が選択されたときは、かかる加算処理が3ラインにわたって実行される。図12(C)に示す水平64画素×垂直1ラインのY”データおよびU”/V”データは、垂直3ライン毎に得られる。Y”データはバッファ回路64に向けて出力され、U”/V”データはバッファ回路66に向けて出力される。
フィルタ演算回路82aは、図13に示すように構成される。セレクタ90は、“5×5”のタップ長が選択されたとき、画素クロックに応答してフィルタ係数C(0)〜C(4)を順に選択する。画素クロックが図14(A)に示す要領で変化するとき、フィルタ係数C(0)〜C(4)は、図14(B)に示す要領でセレクタ90から出力され、ラッチ回路92,94,96,98および100によって形成される経路上を画素クロックに応答してシフトされる。
セレクタ90はまた、“3×3”のタップ長が選択されたとき、画素クロックに応答してフィルタ係数C(0)〜C(2)を順に選択する。画素クロックが図14(B)に示す要領で変化するとき、フィルタ係数C(0)〜C(4)は、図14(B)に示す要領でセレクタ90から出力され、ラッチ回路92,94,96,98および100によって形成される経路上を画素クロックに応答してシフトされる。
ラッチ回路92の出力は図14(C)または図15(C)に示す要領で変化し、ラッチ回路94の出力は図14(D)または図15(D)に示す要領で変化し、ラッチ回路96の出力は図14(E)または図15(E)に示す要領で変化し、ラッチ回路98の出力は図14(F)または図15(F)に示す要領で変化し、ラッチ回路100の出力は図14(G)または図15(G)に示す要領で変化する。
一方、セレクタ112は、ラインメモリ78a〜78eのいずれか1つから出力された水平68画素または水平66画素のYデータを選択する。Yデータは、図14(H)または図15(H)に示す要領でセレクタ112から出力される。ここで、“Y(n)”は、注目する水平68画素または66画素の先頭からn画素目のYデータを意味する。出力されたYデータは、フリップフロップ回路114,116,118,120および122によって形成される経路上を画素クロックに応答してシフトされる。
フリップフロップ回路114の出力は図14(I)または図15(I)に示す要領で変化し、フリップフロップ回路116の出力は図14(J)または図15(J)に示す要領で変化し、フリップフロップ回路118の出力は図14(K)または図15(K)に示す要領で変化し、フリップフロップ回路120の出力は図14(L)または図15(L)に示す要領で変化し、フリップフロップ回路122の出力は図14(M)または図15(M)に示す要領で変化する。
乗算器102はフリップフロップ回路114から出力されたYデータをラッチ回路92の出力によって乗算し、乗算器104はフリップフロップ回路116から出力されたYデータをラッチ回路94の出力によって乗算し、乗算器106はフリップフロップ回路118から出力されたYデータをラッチ回路96の出力によって乗算し、乗算器108はフリップフロップ回路120から出力されたYデータをラッチ回路98の出力によって乗算し、乗算器110はフリップフロップ回路122から出力されたYデータをラッチ回路100の出力によって乗算する。
加算器124は、乗算器102,104,106,108および110によってそれぞれ算出された5個の乗算値を互いに加算する。この結果、加算値を示すY’データが、図14(N)または図15(N)に示す要領で加算器124から出力される。
フィルタ演算回路82bは、図16に示すように構成される。セレクタ126は、ラインメモリ80a〜80eのいずれか1つから出力された水平68画素または水平66画素のU/Vデータを選択する。U/Vデータは、図17(B)または図18(B)に示す要領でセレクタ126から出力される。ここで、“U(n)”は注目する水平68画素または水平66画素の先頭からn画素目のUデータを意味し、“V(n)”は注目する水平68画素または水平66画素の先頭からn画素目のVデータを意味する。出力されたU/Vデータは、フリップフロップ回路128,130,132および134によって形成される経路上を、図17(A)または図18(A)に示す画素クロックに応答してシフトされる。
フリップフロップ回路130の出力は図17(C)または図18(C)に示す要領で変化し、フリップフロップ回路134の出力は図17(D)または図18(D)に示す要領で変化する。
“5×5”のタップ長が選択されたとき、セレクタ136は、“0”およびフィルタ係数C(3)を画素クロックに応答して交互に選択し、セレクタ138は、フィルタ係数C(3)およびC(1)を画素クロックに応答して交互に選択し、セレクタ140は、フィルタ係数C(1)および“0”を画素クロックに応答して交互に選択する。セレクタ136の出力は図17(E)に示す要領で変化し、セレクタ138の出力は図17(F)に示す要領で変化し、セレクタ140の出力は図17(G)に示す要領で変化する。
加算器142はセレクタ136の出力をフィルタ係数C(4)と加算し、加算器144はセレクタ138の出力をフィルタ係数C(2)と加算し、加算器146はセレクタ140の出力をフィルタ係数C(0)と加算する。加算器142の加算結果は図17(H)に示す要領で変化し、加算器144の加算結果は図17(I)に示す要領で変化し、加算器146の加算結果は図17(J)に示す要領で変化する。
セレクタ148はセレクタ126の出力を選択し、セレクタ150はフリップフロップ回路130の出力を選択する。乗算器152はセレクタ148の出力を加算器142の加算結果によって乗算し、乗算器154はセレクタ150の出力を加算器144の加算結果によって乗算する。さらに、乗算器156は、フリップフロップ回路134の出力を加算器146の出力によって乗算する。加算器158は、乗算器152の乗算結果を乗算器154の乗算結果と加算し、加算器160は、加算器158の加算結果を乗算器156の乗算結果と加算する。この結果、加算値を示すU’/V’データが、図17(K)に示す要領で加算器160から出力される。
“3×3”のタップ長が選択されたとき、セレクタ136は、“0”およびフィルタ係数C(1)を画素クロックに応答して交互に選択し、セレクタ138は、フィルタ係数C(1)および“0”を画素クロックに応答して交互に選択する。セレクタ136の出力は図18(E)に示す要領で変化し、セレクタ138の出力は図18(F)に示す要領で変化する。
セレクタ148はフリップフロップ回路130の出力およびセレクタ126の出力を画素クロックに応答して交互に選択し、セレクタ150はフリップフロップ回路134の出力およびフリップフロップ回路130の出力を画素クロックに応答して交互に選択する。セレクタ148の出力は図18(G)に示す要領で変化し、セレクタ150の出力は図18(H)に示す要領で変化する。
加算器142はセレクタ136の出力をフィルタ係数C(2)と加算し、加算器144はセレクタ138の出力をフィルタ係数C(0)と加算する。加算器142の加算結果は図18(I)に示す要領で変化し、加算器144の加算結果は図18(J)に示す要領で変化する。なお、“3×3”のタップ長が選択されたとき、セレクタ140および加算器146の入力はいずれも“0”である。
乗算器152,154および156ならびに加算器158および160は、上述と同様に動作する。この結果、図18(K)に示すU’/V’データが加算器160から出力される。
したがって、“5×5”のタップ長が選択されたときは数1および数2に従う演算が実行され、“3×3”のタップ長が選択されたときは数3および数4に従う演算が実行される。
数1に従う演算が行われたとき、U(n)’データは図19(A)に示す要領で作成され、数2に従う演算が行われたとき、V(n)’データは図19(B)に示す要領で作成される。また、数3に従う演算が行われたとき、U(n)’データは図20(A)に示す要領で作成され、数4に従う演算が行われたとき、V(n)’データは図20(B)に示す要領で作成される。
数1および図19(A)によれば、無効画素U(n−1)に割り当てられるフィルタ係数C(1)が有効画素U(n−2)に割り当てられるフィルタ係数C(0)に加算され、有効画素U(n−2)が加算値C(0)+C(1)によって乗算される。また、無効画素U(n+1)に割り当てられるフィルタ係数C(3)が有効画素U(n)に割り当てられるフィルタ係数C(2)に加算され、有効画素U(n)が加算値C(2)+C(3)によって乗算される。乗算処理の対象から外れた有効画素U(n+2)は、加算処理の対象から外れたフィルタ係数C(4)によって乗算される。U(n)’は、こうして求められた乗算値の総和を示す。
数2および図19(B)によれば、無効画素V(n−1)に割り当てられるフィルタ係数C(1)が有効画素V(n)に割り当てられるフィルタ係数C(2)に加算され、有効画素V(n)が加算値C(1)+C(2)によって乗算される。また、無効画素V(n+1)に割り当てられるフィルタ係数C(3)が有効画素V(n+2)に割り当てられるフィルタ係数C(4)に加算され、有効画素V(n+2)が加算値C(3)+C(4)によって乗算される。乗算処理の対象から外れた有効画素V(n−2)は、加算処理の対象から外れたフィルタ係数C(0)によって乗算される。V(n)’は、こうして求められた乗算値の総和を示す。
数3および図20(A)によれば、無効画素U(n−1)に割り当てられるフィルタ係数C(1)が有効画素U(n)に割り当てられるフィルタ係数C(2)に加算され、有効画素U(n)が加算値C(1)+C(2)によって乗算される。乗算処理の対象から外れた有効画素U(n−2)は、加算処理の対象から外れたフィルタ係数C(0)によって乗算される。U(n)’は、こうして求められた乗算値の総和を示す。
数4および図20(B)によれば、無効画素V(n−1)に割り当てられるフィルタ係数C(1)が有効画素V(n−2)に割り当てられるフィルタ係数C(0)に加算され、有効画素V(n−2)が加算値C(1)+C(2)によって乗算される。乗算処理の対象から外れた有効画素V(n)は、加算処理の対象から外れたフィルタ係数C(2)によって乗算される。V(n−2)’は、こうして求められた乗算値の総和を示す。
以上の説明から分かるように、D1−I/F44aは、各々が256画素を有する複数の水平ラインの画素データによって形成される画像データを出力する。また、メモリ制御回路56のアドレス変換回路56fは、各々が256画素よりも大きい300画素の画素データを格納できるサイズを有する複数のメモリブロックMB1,MB2,MB3,…を、SDRAM58のメモリエリア上に割り当てる。D1−I/F44aによって出力された画像データを形成する複数の水平ラインの画素データはそれぞれ、D1−I/F44bによって複数のメモリブロックMB1,MB2,MB3,…に書き込まれる。
メモリアクセス回路56d,バッファ回路60および62は、指定数の水平画素の画素データをSDRAM58から周期的に読み出す。読み出された画素データは、フィルタ回路68によって演算処理を施される。これによって、指定数よりも小さい所定数(=64)の水平画素の処理画素データが周期的に作成される。作成された複数の水平ラインの処理画素データはそれぞれ、バッファ回路64,66およびメモリアクセス回路56dによって複数のメモリブロックMB1,MB2,MB3,…にそれぞれ書き込まれる。
ここで、レジスタ56rは、D1−I/F44bからの画像データを書き込むときのメモリブロック上の書き込み開始位置とバッファ回路64または66からの画像データを書き込むときのメモリブロック上の書き込み開始位置との間にオフセットを確保する。
所定数(=64)は指定数よりも小さいため、フィルタ回路68によって作成される処理画素データの部分的な欠落を防止するには、指定数の水平画素の部分的な重複つまり一部の画素データの繰り返し読み出しが必要となる。そこで、この実施例では、メモリブロックMB1,MB2,MB3,…の各々のサイズを水平ラインの画素データのサイズよりも大きくし、D1−I/F44bからの画像データの書き込み開始位置とバッファ回路64または66からの画像データの書き込み開始位置との間にオフセットを確保するようにしている。
この結果、繰り返し読み出しが必要な画素データが演算処理を施された画素データによって上書きされる事態を回避することができる。つまり、容量が少ないメモリエリアへの簡単なアクセス処理で、画像データに所望の演算処理を施すことができる。
また、上述した処理画素データの部分的な欠落を防止するために、SDRAM58から読み出される指定数の画素の部分的な重複が、CPU70によって指示される(S11, S19)。これによって、画面全体にわたって演算処理が施された画像データが得られる。
さらに、CPU70は、読み出し画素の指定数を、画像データの水平方向中央部よりも画像データの水平方向端部において小さくする(S11, S25, S19, S27)。また、バッファ回路60および62の各々は、水平方向端部から読み出された画素データの画素数を、タップ長が“5×5”のときに“66”から“68”に増大させ、タップ長が“3×3”のときに“65”から“66”に増大させる。画素数の増大によって、演算処理を施された画像データにおける解像度の劣化を防止できる。
なお、増大された画素数は、水平方向端部から読み出された画素データの画素数と一致する。これによって、演算処理を施された画像データの解像度を演算処理を施される前の画像データの解像度と一致させることができる。
また、D1−I/F44aによって出力される画像データは、撮影操作によって取得された被写界像データであり、撮影操作に起因する被写界の振れ量は、ジャイロセンサ72によって検出される。CPU70は、フィルタ回路68の演算処理量をジャイロセンサ72の検出結果に応じた量に設定し(S9, S17)、SDRAM58からの読み出し画素数の指定をフィルタ回路68の演算処理量に応じて変更する(S11, S19)。
フィルタ回路に求められる演算処理量は、被写界像データの品質つまり被写界の振れ量によって異なる。そこで、この実施例では、被写界の振れ量を検出し、この検出結果に対応する演算処理量をフィルタ回路68に設定するようにしている。また、1回の演算処理に必要なデータ量は、設定された演算処理量に依存する。そこで、この実施例では、読み出し画素数の指定をフィルタ回路68の演算処理量に応じて変更するようにしている。これによって、手振れに起因する歪を的確に補正することができる。
さらに、CPU70は、指定数の画素の読み出し周期をフィルタ回路68の演算処理量に応じて変更する(S11, S19)。これによって、振れ量が小さいときに演算処理に要する時間を短縮できる。
さらに、この実施例では、UデータおよびVデータの各々は、交互に配置された有効画素および無効画素によって形成された画像データである。フィルタ演算回路82bは、かかる画像データに、5個のフィルタ係数を用いた5画素毎のフィルタ処理または3個のフィルタ係数を用いた3画素毎のフィルタ処理を施す。フィルタ演算回路82bからは、有効画素によって形成される処理画像データが出力される。
このとき、加算器142,144または146は、5個または3個のフィルタ係数のうち無効画素に割り当てられるフィルタ係数を有効画素に割り当てられるフィルタ係数に加算する。加算結果は、乗算器152,154または156によって有効画素に乗算される。加算器160は、乗算結果に基づいて処理画像データを形成する1画素を出力する。
有効画素および無効画素にそれぞれ割り当てられる2つのフィルタ係数を互いに加算し、加算結果を有効画素に乗算することで、無効画素を有効画素で補間し、有効画素および補間画素に2つのフィルタ係数をそれぞれ乗算し、そして乗算結果を互いに加算する場合に比べて、処理が簡略化される。つまり、処理を簡略化しつつ、的確なフィルタ処理が実現される。
なお、この実施例では、撮影操作に起因する手振れをフィルタ回路68によって補正するようにしているが、フィルタ回路68は記録済みの画像データに特殊効果を施すために使用するようにしてもよい。この場合、CPU70は、再生モードが選択されたときに図21(および図6〜図7)に示すフロー図に従う処理を実行する。
図21を参照して、ステップS51では特殊効果操作通知がCPU40から与えられたか否かを判別し、YESであれば特殊効果の種類をステップS53で検出する。ステップS55では検出された種類の複雑度が閾値TH’を上回るか否かを判別し、YESであれば図6に示すステップS9に進む一方、NOであれば図6に示すステップS17に進む。なお、図7に示すステップS41の処理が完了すると、ステップS51に戻る。これによって、高速かつ高精度の特殊効果処理が実現される。
なお、この実施例では、撮影時に手振れ補正処理を実行するようにしているが、撮影時に代えて再生時に手振れ補正処理を実行するようにしてもよい。また、この実施例では、フィルタ処理を施された処理画素データが書き込まれるメモリブロックは、フィルタ処理を施される画素データが読み出されるメモリブロックと一致するが、書き込み先のメモリブロックは読み出し元のメモリブロックと異なってもよい。