JP3962029B2 - 画像データの縮小装置及び方法 - Google Patents

画像データの縮小装置及び方法 Download PDF

Info

Publication number
JP3962029B2
JP3962029B2 JP2004096463A JP2004096463A JP3962029B2 JP 3962029 B2 JP3962029 B2 JP 3962029B2 JP 2004096463 A JP2004096463 A JP 2004096463A JP 2004096463 A JP2004096463 A JP 2004096463A JP 3962029 B2 JP3962029 B2 JP 3962029B2
Authority
JP
Japan
Prior art keywords
pixel
pixels
input
image data
magnification
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2004096463A
Other languages
English (en)
Other versions
JP2004288198A (ja
Inventor
康二 浦沢
英樹 三浦
和彦 伊東
Original Assignee
株式会社沖データ
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 株式会社沖データ filed Critical 株式会社沖データ
Priority to JP2004096463A priority Critical patent/JP3962029B2/ja
Publication of JP2004288198A publication Critical patent/JP2004288198A/ja
Application granted granted Critical
Publication of JP3962029B2 publication Critical patent/JP3962029B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Image Processing (AREA)
  • Studio Circuits (AREA)
  • Editing Of Facsimile Originals (AREA)
  • Controls And Circuits For Display Device (AREA)

Description

本発明は、情報処理装置を用いて表示したり印刷したりする画像データを、任意の倍率で拡大しあるいは縮小するために利用される、画像データの縮小装置及び方法に関する。
パーソナルコンピュータやプリンタ、その他各種の情報処理装置において、画像データの解像度が相違するアプリケーション間で画像データを転送する場合には、画素数を増減して解像度を調整する画像データの拡大/縮小処理が行われる。また、画素数の多い画像データをメモリに記憶する場合、メモリの記憶容量削減のために、画素数を減少させる画像データの縮小処理が行われる。画像データを通信線を介して送受信する場合の送信速度スピードアップを図るためにも、画素数を減少させる画像データの縮小処理を行う場合がある。
ここで、例えば、画像データの縦横の画素数をそれぞれ整数倍に拡大する場合には、各画素をその倍率分だけ縦横方向にコピーして画素数を増やす。従って、例えば各画素はX方向にN倍、Y方向にM倍だけコピーされてN×M倍の画素から成る画像データが得られる。
一方、1.5倍とか2.5倍というように、いずれかの方向に整数倍にならない倍率で拡大/縮小を行う場合には、コピーをして数を増やす画素と、コピーをしない画素を適当に混在させる。
画素をコピーする場合、同一の画素値の画素を隣に増やしていく方法がもっとも単純な方法である。しかしながら、それでは、中間調を表現する画像の場合に、不自然な濃淡が発生して、画質が劣化する。特に、整数倍にならない倍率で画像データの拡大/縮小を行う場合に、その傾向が著しい。
そこで、出力画像中のコピーによって増加した画素の画素値が互いに滑らかに変化するように、周辺の複数の画素を参照しながら適当な演算処理を行う。この方法は、リサンプリング処理と呼ばれ、各画素の画素値の計算には一次補間法や最近傍法等が採用される。
ところで、上記のような従来の技術には、次のような解決すべき課題があった。
上記のようにして、入力する画像データをX軸方向やY軸方向に任意の実数倍率、即ち整数倍でない倍率で拡大/縮小処理しようとするときには、一次補間法や最近傍法による画素値の計算が行われる。このとき、予め画素値を求めるべき出力画素の周辺に存在する入力画素の画素値を、計算に利用できるように、準備しておかなければならない。従って、画像データをほぼ1ページ分あるいは画素値の参照に必要な分だけ読み取って、バッファメモリに予め格納し、その後再び同じ画像データを順に受け入れて処理をする必要がある。これでは、画像データをそのまま逐次処理をして出力を得るというわけにはいかない。
従って、従来の技術には、各種のシステムにおいてメモリを効率的に使用するという目的に反し、また処理時間も長くなるという問題があった。
本発明は以上の点を解決するため次の構成を採用する。
〈構成1〉
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像データを生成する画像データの縮小方法において、前記入力画像データを小領域に分割し、小領域に含まれる入力画素と小領域の境界上の入力画素とを区別して認識し、前記小領域内の入力画素値と認識された境界上の入力画素値とに基づいて小領域内の入力画素値を演算して出力画素値を求める画像データの縮小方法であって、前記小領域内の入力画素をサンプリングするサンプリング領域を指定し、サンプリング領域内の画素値を演算することにより出力画素値を求めることを特徴とする画像データの縮小方法。
〈構成
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像を生成する画像データの縮小装置において、前記入力画像を複数の入力画素を含む小領域に区分し、隣接する小領域間を仕切る境界線上に位置する入力画素を検知して該入力画素を含むいずれかの小領域を一定条件に基づいて決定する境界線画素判定手段と、前記各小領域に含まれる複数の入力画素の各画素値に基づいて出力画素の画素値を演算する画素値演算手段と、を有する画像データの縮小装置であって、前記画素値演算手段は、前記小領域にサンプリング領域を設定し、該サンプリング領域内の入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの縮小装置。
〈構成
入力画像を、主走査方向に平行な境界と副走査方向に平行な境界により小領域に等分割し、各領域中に含まれる画素の画素値を平均して出力画素の画素値を求めることにより、入力画像を縮小した出力画像を得るものにおいて、入力画像を構成する画素の画素値を主走査方向にみて1ライン分受け入れて保持する入力画像バッファと、前記入力画像バッファに受け入れた各画素の画素値を主走査方向に順に累積していき、副走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた、同一小領域内の画素値の合計を、小領域単位で保持する途中結果バッファと、副走査方向に1ライン分ずつ入力画像を処理していき、主走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた各小領域内の画素値の合計を、途中結果バッファから読みだして、各小領域に含まれる画素数で割って、小領域毎の画素値の平均値を求め、その平均値を出力画像の画素の画素値とする制御部を備えた画像データの縮小装置であって、前記入力画像を分割した小領域に含まれる画素のうちの一部をサンプリングして、それらの画素値を集計するために、サンプリングの間隔を設定して保持するパラメータ保持部を設け、途中結果バッファは、前記パラメータ保持部を参照して、サンプリング間隔ごとに画素値を集計して保持することを特徴とする画像データの縮小装置。
〈構成
構成において、入力画像を分割した小領域に含まれる画素を、主走査方向に連続した任意の数の画素を含む複数のサンプリング領域で区分し、そのサンプリング領域毎に画素値を集計するために、サンプリング合計カウンタを設け、前記制御部は、サンプリング領域ごとに集計された画素値とそのサンプリング領域に含まれる画素数により、サンプリング領域における画素値の平均値を求め、前記途中結果バッファは、サンプリング領域における画素値の平均値を累積した、同一小領域内の画素値の合計を、小領域単位で保持することを特徴とする画像データの縮小装置。
本発明によれば、入力画像を小領域に区分し、小領域間の境界上の入力画素を一定規則でいずれかの小領域に含ませた上で各小領域毎に入力画素に基づいて出力画素値を演算するようにしたので、少ないメモリで入力画像の縮小処理を行うことができる。
以下、本発明の実施の形態を具体例を用いて説明する。
〈具体例1〉
図1は、具体例1による拡大/縮小処理部の動作説明図である。
図の(a)は本発明の方法に使用する拡大/縮小テーブルを示し、(b)は入力画像データと出力画像データとを示している。
例えば入力画像データ3のX方向には(x2/x1)倍、Y方向には(y2/y1)倍に画像を拡大するとき、図の(b)に示すように、各画素をそれぞれX方向とY方向に所定の回数コピーする。画素値はそのままでコピーする。コピーする画素数は入力画像の画素の位置によって異なる。こうして、整数倍でない倍率の拡大を実現する。ここで、こうした拡大/縮小処理を効率良く実行するために、各画素毎の該当する方向の倍率を示す拡大/縮小テーブルを用意する。
図1の(a)に示した左側のテーブルがX方向の倍率を示し、右側のテーブルはY方向の倍率を示す。例えば入力画像データの第0列、第0行の画素、即ち(b)に1番と番号表示した画素は、これらのテーブルを参照すると、X方向に2倍、Y方向に3倍だけコピーされる。入力画像データの2行目の4番と番号表示した画素はX方向に2倍、Y方向に4倍コピーされる。
画像データは通常ビットストリームとして扱われ、1画素分ずつX軸方向(主走査方向)に処理し、その処理をY軸方向(副走査方向)に繰り返す。以上のような拡大/縮小テーブルを新たに設けたのは、入力画像データ3をこのように走査方向にシリアルに受け入れて、そのまま順に拡大/縮小処理することを可能にするためである。
図2には、具体例1による画像データ拡大/縮小装置のブロック図を示す。
図の装置は、外部記憶装置5に記憶された入力画像データを受け入れて、この画像データを拡大処理あるいは縮小処理するための装置である。拡大/縮小装置6には、現ラインバッファ7、拡大/縮小テーブル8、拡大/縮小処理部9及び出力画像フレームバッファ11が設けられている。現ラインバッファ7は、外部記憶装置5から走査方向に入力した画像データを1ラインずつ格納し保持するためのメモリである。拡大/縮小テーブル8には、図1(a)に示したX方向の倍率テーブル1XやY方向の倍率テーブル1Y等が格納されている。拡大/縮小処理部9は、拡大/縮小テーブル8を参照しながら図1(b)に示したような拡大/縮小処理を行う部分である。拡大/縮小処理後の画像データは、出力画像フレームバッファ11に格納される。出力画像フレームバッファ11には図示しない外部装置が接続され、そこに拡大/縮小された画像データが転送される。
ここで、画像データを整数倍で格納した場合と、整数倍以外の倍率で格納した場合とを比較して説明する。
図3に、整数倍率の拡大法説明図を示す。
図に示すように、例えばオリジナルの画素2が存在する場合、X方向に2倍、Y方向に2倍の拡大を行おうとすれば、図の(b)に示すようになる。また、X方向に3倍、Y方向に3倍の拡大を行おうとすれば(c)に示すようになり、X方向に4倍、Y方向に4倍の拡大を行おうとすれば(d)に示すようになる。もちろん、X方向とY方向の倍率を自由に変更しても同様の結果となる。整数倍ではすべての入力画素にこれと同一の処理を施す。
一方、図4には、最近傍法による拡大/縮小処理説明図を示す。
この例では、X方向とY方向と、それぞれ任意の実数倍率で画像データを拡大するために、画素毎にそのコピー倍率を変えている。例えば、図に示す(1)の画素は出力画像データ4において、X方向に3倍、Y方向に2倍になるようにコピーされている。また、(2)の画素は、X方向に2倍、Y方向に2倍となるようコピーされている。更に(5)の画素は、X方向に3倍、Y方向に3倍となるようにコピーされている。こうした組合せによって、全体として例えば1.2倍とか2.3倍といった拡大処理が可能となる。縮小処理としては、例えば出力画像データ4から入力画像データ3の方向への縮小が考えられる。このような場合には、1個の出力画素を得るたびに、続く画素をX方向に何個、Y方向に何個間引くかといった処理となる。
本発明の具体例1による処理では、入力画像データが図の(1)、(2)、(3)、…という順にシリアルに入力した場合に、直ちに出力画像データ4を得ることができるように図1(a)に示す拡大/縮小テーブルを用意した。
図5には、図2に示す装置の動作即ち具体例1の拡大/縮小方法を示すフローチャートを図示した。
まず、ステップS1において、拡大/縮小テーブルの作成を行う。これは拡大/縮小倍率を元に、予め経験的に得られたデータに従ってテーブルの作成を行う処理である。なお、このようなテーブルの内容は、各拡大/縮小倍率毎に予め用意されていてもよいし、その都度計算して作成されるようにしてもよい。また、オペレータが任意の適当な手段で作成し、情報処理装置のメモリ等に格納するようにしてもよい。
次のステップS2において、図2に示す外部記憶装置5から現ラインバッファ7に対し1ライン分のデータ(ビットストリーム)が読み込まれる。次のステップS3では、拡大/縮小処理部9は、拡大/縮小テーブルの縦方向、即ちY方向の倍率テーブルを参照する。更に、ステップS4において、横方向、即ちX方向の倍率テーブルを参照する。こうして、X方向とY方向の画素のコピー回数を認識すると、ステップS5において、入力画像の各画素についてドットコピーが行われる。ドットコピーというのは、同一の画素値のドットを縦方向や横方向にコピーして、必要な数だけ増加させることをいう。次にステップS6において、横方向倍率分をコピーしたかどうかを判断する。こうして、入力画素をX方向にテーブルで指定された数だけコピーする。
次に同様の処理をX方向に順に行うために、ステップS7において、現ラインバッファ7中の全ての画素について処理をしたかどうかを判断する。こうして、ステップS4、S5、S6が現ラインバッファ7中の画素数分繰り返される。その処理が終了すれば、ステップS7からステップS8に進み、出力画像の次のラインの処理に進む。即ち、ステップS4、S5、S6、S7の処理が、Y方向の倍率テーブル分だけ繰り返される。この処理が終了すれば、入力画像データ1ライン分のX方向とY方向の拡大処理を終了する。そして、ステップS8から次のステップS9に進み、入力画像データの次のラインについて拡大/縮小処理を実行する。
ステップS2〜ステップS9の処理を入力が画像データのライン数分繰り返すことによって、入力画像データ全ての画素についての拡大/縮小処理を終了する。
〈具体例1の効果〉
以上のように、任意の方向に任意の拡大/縮小倍率が設定されている場合に、その方向毎に各画素の拡大/縮小倍率を表示したテーブルを用意すると、入力する画像データを走査方向にシリアルに受け入れながら、順番に拡大/縮小処理を行うことが可能になる。即ち、演算処理の前に、予め入力画像データを1ページ分バッファメモリに格納しておくといった処理を必要とせず、限られたメモリ資源を有効に活用することができる。しかも、画像処理中にはテーブル参照だけで拡大/縮小処理を行うことが可能だから、処理の高速化が実現する。
なお、上記の例では拡大を行うケースのみを示したが、拡大/縮小テーブルの、X方向の倍率の部分にゼロを表示すればその画素は削除され、Y方向の倍率の部分にゼロを表示すれば、そのラインは削除されるといった規則にすることによって、画素やラインを間引く縮小も容易に行える。また、上記拡大/縮小テーブルは、任意の方向に画素数を何倍拡大するかあるいは縮小するかといった情報を示すようなデータであればよく、その表現方法や構成は自由にして差し支えない。
〈具体例2〉
上記の具体例1では、各入力画素に割り振る整数倍率を拡大/縮小テーブルの形で保持することから、倍率や入力画像サイズによってはテーブルのデータ量が比較的大きくなる。この具体例2では、テーブルのデータ量を縮小する方法を提供する。
図6に、モジュロ演算を用いる画像拡大/縮小装置のブロック図を示す。
図の装置は、図2に示した具体例1の装置の拡大/縮小装置6の部分に、倍率演算部13を設けた点を特徴とする。この倍率演算部13には、拡大/縮小テーブル8とモジュロ演算部10が設けられる。なお、この拡大/縮小テーブル8の内容は具体例1の場合と異なり、十分に縮小された内容となる。
図7に、拡大/縮小テーブルの冗長性の説明図を示す。
(a)は、例えば図1に示したX方向の倍率テーブル1X、あるいはY方向の倍率テーブル1Yを示す。インデックス(Index)は、列番号または行番号のいずれかを示す。図の(a)の倍率テーブル1Xは、例えば横方向に整数倍(ここでは4倍)の拡大を行うことを示している。しかしながら、このテーブルでは、全ての画素の倍率が4であるから、画素数分の同一内容の倍率表示データがメモリに格納されることになり、実質的に極めて冗長である。(b)には、1.5倍の倍率にしたときのテーブルの内容を示す。この場合、各画素の倍率は1,2,1,2,…というように1と2を交互に繰り返す内容となる。このような規則性のあるデータを全てメモリに保持しておくことも冗長であり、資源の有効利用を妨げる。
そこで、こうした拡大/縮小テーブルを演算によって求める。即ち、画像データ中の各画素の位置と拡大/縮小倍率との規則的な対応関係を考慮して、画素毎の倍率を演算処理により求める。こうすれば、そのデータを使用して直ちに拡大/縮小処理をすることもできるし、またいったんその演算処理によって拡大/縮小テーブルを生成し、その後、実際の拡大/縮小処理をしてもよい。いずれの場合においても、拡大倍率ごとに作成した大量の拡大/縮小テーブルデータを、メモリ内部に予め全て保持しておく必要がないという効果がある。
図8のモジュロ演算は、割り算の余りを求める計算である。図の左端にはライン番号を表示した。第0番目のラインは0、1番目のラインは1というように演算値を設定する。そして、これを2で割って余りを求めるモジュロ演算処理を%で表すことにする。このようにすると、図に示すように、0番目のラインについては演算結果は0、1番目のラインについては演算結果が1、2番目のラインについては演算結果が0というように、交互に0,1,0,1という演算結果が得られる。一方、図の(b)に示すように、例えば1.5倍の拡大を行うような場合、インデックスが0のときは1倍、インデックスが1のときは2倍というテーブルを用意する。これで、モジュロ演算結果によりライン毎に画素を何倍するかというデータが得られる。
以上のようにして、図8(b)に示すような少量のテーブルデータで、全ての拡大/縮小処理が可能となる。
図9に、具体例2の拡大/縮小方法動作フローチャートを示す。
この動作は、既に図5を用いて説明した具体例1の場合と類似している。まずステップS1において、拡大/縮小テーブルの作成を行う。そのテーブルの構成は、図8を用いて説明した通りのものである。次に、ステップS2において、1ライン分のデータを読み込み、ステップS3において、図8の(a)に示したようなモジュロ演算を実行する。そして、その結果をインデックスとし、拡大/縮小テーブルを参照する。この処理はステップS3では縦方向について行い、ステップS4では横方向について行う。そして、ステップS5において、テーブルで指示された通りドットコピーを行い、ステップS6では横方向倍率分コピーが終了したかどうかを判断し、ステップS7では入力画像ライン幅分コピーを終了したかを判断する。そして、ステップS8で、縦方向倍率分コピーしたかを判断し、1ライン分の処理が終了するとステップS9に移り、全ての入力ライン数分処理したかどうかの判断がされる。こうして、それぞれのループを処理し、全ての入力画像データについて拡大/縮小処理を行う。
以上のように、ステップS3とS4で、拡大/縮小テーブルを参照するべき処理のたびにモジュロ演算を実行し、該当部分(テーブルの一部)のテーブルを生成しながら処理をすると、拡大/縮小テーブルデータ全体を保持しておく必要がない。また、ステップS1でモジュロ演算を実行して、拡大/縮小テーブル全体を生成してもよい。少なくとも、こうした処理が要求される直前に拡大/縮小テーブルを生成するようにすれば、拡大倍率ごとにテーブル全体をメモリに保存しておく場合に比べて、十分にテーブル保存用メモリの節約ができる。
〈具体例2の効果〉
この例では、入力画像データの全ての画素について、それぞれ例えばX方向に何倍、Y方向に何倍といった表示をテーブルデータとして保持しなくても、各画素を拡大/縮小方向に見て、その入力画像データ中の各画素の位置と拡大/縮小倍率との間に規則的な対応関係が存在する場合、演算処理によって拡大/縮小テーブルを生成して参照することができる。従って、予めメモリに保存しておくべき拡大/縮小テーブルのサイズを十分少なくし、記憶容量の削減を図ることができる。
〈具体例3〉
図10に、具体例3による拡大/縮小装置のブロック図を示す。
この装置は、これまでの具体例の、拡大/縮小装置6の部分に、前ラインバッファ7Aと現ラインバッファ7Bの2ライン分のバッファを設ける。そしてさらに、これから説明する一次補間処理を行うための、一次補間拡大/縮小処理部16を設ける。
図11に、従来から画像の拡大/縮小処理に採用されていた画素値補正のためのリサンプリングの説明図を示す。また、図12に、正方格子の説明図を示す。なお、正方格子というのは、縦横の各辺の長さは自由で、いわゆる矩形の頂点に画素が配置されたものをいう。従って、必ずしも4辺が等しい正方形でなくてよく、長方形であってもさしつかえない。
図11の入力画像データ3を拡大処理したものを出力画像データ4とする。拡大処理をすると、入力画素の各画素の間隔と出力画素の各画素の間隔とは、必ずしも一致しない。また、画像中の対応する画素の位置も正確には一致しないことがある。この場合に、出力画像データ4の各画素の画素値は、出力画像の画質を劣化させないために、次のようにして演算処理をして変換する。
まず、出力画像データ4の各画素が、入力画像データ3中のどの位置にあるべき画素かを求める。この場合に、図12に示すように、X点の出力画素は、A、B、C、D点の入力画素の正方格子に囲まれた位置にあるものとする。このとき、A、B、C、D点の4つの画素の画素値と、X点とA、B、C、D点との距離の関係から、適切な画素値を演算処理し、これをX点の画素の画素値とする。
図13は、一次補間の一般的計算法説明図である。
例えば、図12に示すように、×印の点に出力画素が存在したとする。このとき、×点の上辺からの距離をq、左辺からの距離をpとする。pとqはいずれも0と1の間の小数で表す。このとき、×印の点の画素の出力値は図13(a)に示す式で表される。ここで、(b)に示すように、出力画素Fの出力画像上の座標と、入力画素Aの入力画像上の座標と、画像の拡大図をそれぞれ設定すると、p,q及び各座標値や拡大率との関係は(c)式に示すようになる。
このような処理をしようとすれば、予め処理対象となる画素の周辺の入力画像データを全てバッファメモリに格納した上で、出力画像データの画素値を演算処理する必要がある。
図14には、具体例3による一次補間の説明図を示す。
この具体例では、例えば具体例1を実施して、入力画像データ3をX軸方向に4倍、Y軸方向に3倍に拡大している。このとき、各画素数を増加させて得られた出力画像データ4の4×3画素のブロック(図中太い黒線の枠で囲んだマトリクス)中で、例えば右下端の画素が正方格子上の画素であると定義する。この画素を図では黒く塗りつぶしてある。
例えば入力画像データ3のX=3,Y=2の座標にある黒く塗りつぶした画素は、出力画像データ4のX=12,Y=6の座標にコピーされる。この画素を含むブロック中の各画素の画素値は、図に示すように塗りつぶした周囲4画素の画素値を用いて一次補間する。入力画像中で隣同士にあった画素の間に追加した新たな画素の画素値を、もともと隣同士にあった画素の間で滑らかに変化させて、高画質の出力画像を得るためである。
ここで、前ラインと現ラインの2ライン分の画像データ、即ち、入力画像データ3のハッチングを付した画素と黒く塗りつぶした画素の4個分の画素値を保持していれば、太い黒い線で囲んだ枠の中の、12個分の画素全てについて、その画素値を演算処理することが可能になる。その演算式は図の(b)に示した。各記号の意味はその下に示す通りである。
図15に、具体例3による一次補間の処理例説明図を示す。
ここには、上記の定義に従って実際に各画素に画素値を与えた場合の演算処理結果を数値で示した。入力画像は、格子点の画素の画素値が例えば“0”、“100”、“50”及び“200”という値とする。これを縦3倍横4倍に拡大すると、それぞれの画素値は対応するブロックの右下隅にコピーされる。そして、例えば画素値が“200”の画素を含むブロックについて、残りの11個の画素に具体的に一次補間により計算した値を書き込んだ。図の下側には一例として、P=2,Q=2の場合の画素値計算例を図示した。このようにして画素値を計算することによって、画質を低下させずに拡大処理を行うことができる。
図16には、具体例3の装置の動作フローチャートを示す。
このフローチャートにおいて、ステップS1〜ステップS4は、図5を用いて説明した具体例1の処理と同様である。即ち、拡大/縮小テーブルを作成し、ラインデータを読み込み、その後拡大/縮小テーブルを参照する。そして、具体例3では、ステップS5において、上記の通り説明した一次補間処理を行う。この処理をブロック中の全ての画素について行い、更に走査方向に順に、全てのブロックついて実行する。その他の処理は具体例1と同様である。なお、ブロックの右下隅に入力画素の画素値をコピーしたが、これはシリアルに入力したバッファメモリ中の2ライン分の画像データだけを利用して演算処理できるようにするためである。
なお、こうした効果を得る画素の位置は、各ブロックの4つの角部であればよい。
〈具体例3の効果〉
この具体例によれば、入力画像全体をバッファメモリに読み込んでからでなければ実現が不可能であった一次補間による拡大/縮小処理を、2ライン分のデータをバッファメモリに保持するだけで実行可能になった。これによって、高画質の拡大/縮小処理をバッファメモリの使用量を十分に少なくして実現できる。
〈具体例4〉
図17は、具体例4の原理説明図である。
ここでは、入力画像データ3の正方格子の座標を出力画像データ4上の座標に変換し、出力画像データ4を対応する正方格子によって作られる領域で分割する。この領域のことを、以下近傍エリアと呼ぶ。この図では、入力画像データ3の破線で囲んだ4つの画素(丸印)によって正方格子を定義したとき、これに対応する近傍エリアを、出力画像データ4の中に実線の四角で書き込んだ。この四角で囲んだ領域を近傍エリアと呼ぶが、ここには図に示すように例えば9個の出力画素(四角印)が含まれる。これらの画素の画素値を入力画像データ3の4個の画素の画素値から上記の一次補間法によって求める。こうすれば、近傍エリアに含まれる各画素の画素値を入力画像データの4つの隣合った画素の画素値のみで求めることができる。従って、バッファメモリへは具体例3と同様に2ライン分程度のデータを格納すればよい。しかも、その演算処理は後で説明するように、これまでよりも更に容易になる。
図18に、具体例4の装置のブロック図を示す。
この装置の拡大/縮小装置6の部分には、処理対象となるデータを格納するために、ラインバッファ7Aと7Bとを設ける。そして、各ラインバッファ中の演算処理対象となる画素値を指定するために、前行ポインタ19Aと現行ポインタ19Bとが設けられる。更に、先に説明した近傍エリアを指定するための近傍エリアテーブル18が設けられ、一次補間拡大/縮小処理部16において、近傍エリア内の各画素の画素値を演算処理する。
図19には、近傍エリアテーブルの説明図を示す。
近傍エリアテーブルは、具体例1で説明した拡大/縮小テーブルと同様に、縦方向の演算処理をするためのものと、横方向の演算処理をするためのものと、それぞれ1個ずつ存在する。縦方向のためのテーブルを近傍エリア縦テーブル、横方向のためのテーブルを近傍エリア横テーブルと呼ぶ。この(a)に示す例では、3×3画素の入力画像を5×5画素に拡大している。近傍エリアは、図の出力画像中の破線の格子に示すように設定した。例えば出力画像の左上隅の近傍エリアには1個の画素が存在し、右下隅の近傍エリアには2×2個の画素が存在する。このように、各近傍エリア中の出力画素数を表示するために縦テーブル、横テーブルを設ける。なお、このテーブルの内容は、一般的には図の(b)に示すような式によって求めることができる。なお、図(b)中のAという記号は入力画像の縦方向の画素数あるいは横方向の画素数を示す。また、Bという記号は出力画像の横方向あるいは縦方向の画素数を示す。Xという記号は、最初から何番目の近傍エリアかを示すパラメータである。
図20は、ラインバッファの説明図を示す。
上記のように、装置には拡大/縮小処理の演算処理中2ライン分の画像データが格納される。ラインバッファ7Aと7Bとは、それぞれ交互に新たな1ライン分の入力データを受け入れて格納する。前行ポインタ19Aと現行ポインタ19Bは、どちらのラインバッファが先にデータを格納されたものかを示すためのものである。従って、初期値はいずれもラインバッファ7Aを示している。前行ポインタ19Aと現行ポインタ19Bとが指すべきバッファは、例えば図の(b)に示すような演算で求めることができる。これは、先に説明したようなモジュロ演算による。これで、入力画像のどのラインがどのラインバッファに格納されるか明確になる。
図の(c)は、各ラインバッファの構成を示す。各ラインバッファは、実際の入力画像の幅より1画素分だけ大きくしてある。先頭の画素、即ちバッファの最初の要素には、2番目の要素と同じ値が格納される。これは入力画像の幅が1である場合に、そのままでは一次補間を行うための4画素分のデータを用意することができないため、ダミードットを格納するようにしたためである。
図21には、画像データ格納処理説明図を示す。
以上の構成により、この図に示すように、例えばラインバッファ17Aに直前に処理した行が格納され、ラインバッファ17Bに現在処理中の行が格納された状態で処理を進める。ラインバッファ17Bの処理が終了したときには、ラインバッファ17Aに次の新たな1ライン分のデータを格納する。従って、現行ポインタ19Bは、今度はラインバッファ17Aを指し、前行ポインタ19Aがラインバッファ17Bを指すことになる。
図22に、近傍エリアの拡大図を示す。
上記近傍エリアを、例えば画素値A,B,C,Dの画素によって構成するとすれば、その近傍エリア中に含まれる実線の四角印の出力画素の画素値Fは、この図の中に示すような演算処理によって求められる。この演算処理そのものは一次補間の処理で説明した式と全く同様である。なお、格子の間隔を横方向にα、縦方向にβとした。また、対象となる画素の上辺からの距離をq、左辺からの距離をpとした。ただし、α,βは、画像の拡大率をX方向、Y方向それぞれmx,myとしたときα=1/mx,β=1/myとすることができる。
図23に、具体例4の動作フローチャートを示す。
具体例4では、まず既に説明したような横テーブルと縦テーブルの作成をステップS1において行う。そして、ステップS2において、各ラインバッファの初期化を行う。その後、ステップS3においてラインデータを読み込み、ステップS4において上記の図22に示した出力画素値計算を実行する。ステップS5では、近傍エリアの横サイズ分を処理したかどうかを判断し、ステップS6では、入力画像幅分の処理を終了したかを判断する。ステップS6までで1ライン分の処理が終了するとステップS7において近傍エリアの縦サイズ分が終了したかどうかの判断をし、これが終了すると、ステップS8に進み、バッファを更新する。更に、次のラインに移り、ステップS9で入力画像ライン数分が終了したかどうかの判断をして処理を終える。
〈具体例4の効果〉
図24は、具体例4の計算内容説明図である。
この図を用いて効果を説明する。
以上のようにして、近傍エリア内に含まれた9個の画素の画素値は全てこの図に示すように4個の画素値から計算される。これにより、入力画像を2ライン分だけ保持して、順番にその内容を入れ替えながら処理をすれば、全ての出力画素の画素値を一次補間法によって順に計算処理することが可能になり、使用するメモリ量を十分に減少させることができる。
〈具体例5〉
上記の場合には、各出力画素即ち近傍エリア内に含まれる出力画素について、それぞれ7回の足し算と10回の掛け算を行うことになる。ところが、これらの位置の規則的な関係を考慮すると、更に演算処理を簡略化することができる。
図25に、具体例5の装置のブロック図を示す。
この装置は、ラインバッファ31A,31Bに画素を格納し、具体例4と同様の演算処理を行う一方、更に演算処理を簡略化する。その目的のために、一次補間拡大/縮小処理部40をここに示すような構成とした。ここにはパラメータ計算装置41、左端画素値記憶装置42、加算器43、ΔYメモリ44、ΔX1メモリ45、加算器46、ΔΔXメモリ47、現画素メモリ48及び加算器49が設けられている。近傍エリアテーブル32の出力は、パラメータ計算装置41に入力する。一次補間拡大/縮小処理部40の出力は出力画像フレームバッファ34に格納するように構成されている。
図26には、ドット間の相関関係説明図を示す。
この具体例5では、ドット間の相関関係を用いて計算を簡略化する。即ち、この図に示すように、例えば近傍エリアの中に先に説明した通りの9個の画素が含められているとする。この場合に、これらの画素の横方向の間隔はΔX1、縦方向の間隔はΔYというように表示できる。このように、各画素の間隔が規則的に一定であることから、左端即ち図に示すD1の出力画素の画素値とΔX1やΔY1を求めておくことによって、順次その右側あるいは下側の画素の画素値を換算処理することが可能になる。即ち、隣合う画素の画素値の差はΔX1、ΔY、ΔΔX等によって求めることが可能になる。この具体例では、その原理を利用して各画素値の演算処理を簡単にした。
図27は、図26と同様のドット間の相関関係説明図である。
この図には、この具体例5を用いて行う各画素値の計算式を示した。
図のように、左端の画素B1の画素値を計算すれば、右方向あるいは縦方向に並んだ各画素の画素値を遥かに簡単な式により演算処理することが可能になる。
図28には、具体例5の装置の動作フローチャートを示す。
図のステップS1において、まず近傍エリア左上端の画素値を計算する。その計算方法は、既に図27を用いて示した。次に、ステップS2において、ΔX1の計算を行う。更に、ステップS3において、ΔYの計算を行う。次にステップS4において、ΔΔXの計算を行う。その後ステップS5において、出力画素値の設定を行い、ステップS6において、出力画素値を更新する。ステップS7では、近傍エリアの横サイズ分処理が終了したかを判断し、ステップS6,S7のループを繰り返す。次に、近傍エリアのすぐ下の行を処理する場合ステップS8に移り、ΔX1を更新し、ステップS9において、左端の画素値を更新する。その後、ステップS10において、近傍エリアの縦サイズ分の処理が終了したかどうかを判断し、終了していない場合には、ステップS5〜ステップS9の処理を繰り返す。これによって、図27に示す計算処理が完了する。
〈具体例5の効果〉
以上の処理によって、左端の画素について、7回の足し算と10回の掛け算を実行するが、その他の画素については、それ以下の数回の足し算によってその画素値を求めることができる。これによって、一次補間処理の向上を図ることができる。
〈具体例6〉
図29は、具体例6の装置のブロック図である。
以下の具体例は画像縮小処理に適するものである。
以下の具体例では、図に示す入力画像51を主走査方向に平行な境界51Hと副走査方向に平行な境界51Vとによって小領域51Zに等分割する。そして、これらの各小領域51Z中に含まれる画素の画素値を平均して、出力画素の画素値を求める。この場合に、全ての画素の画素値を実際の処理をする装置側のバッファに保持しようとすると大きなメモリを必要とする。そこで、この図29に示すような構成とする。
入力画像51の全ての画素の画素値は外部記憶装置52に格納されている。これらを処理するために、入力画像バッファ53、途中結果バッファ54、制御装置55、フレームバッファ57が設けられている。
入力画像バッファ53は、入力画像51を構成する画素を、主走査方向に1ライン分ずつ受け入れて保持する記憶装置である。また、途中結果バッファ54は、入力画像51を主走査方向に見たときに、等分割した小領域の数だけ画素値の集計値を格納するメモリとなっている。フレームバッファ57には、制御装置55によって処理された出力画像58が格納される。なお、制御装置55は、これらの処理の間に必要な、横方向のグループ内ドット数xnum、縦方向のグループ内ドット数ynum、入力画素横カウンタIX、入力画素縦カウンタIY、出力画素横カウンタOX、出力画素縦カウンタOY、横方向の合計カウンタHTを格納したパラメータ保持部60を備える。
横方向のグループ内ドット数xnumは、等分割した小領域51Zに含まれる画素数をカウントし、平均化処理のために保持しておくパラメータで、横方向というのは主走査方向、縦方向というのは副走査方向のことである。入力画素横カウンタIXは入力画像51を主走査方向に見た画素数をカウントし、1ライン分の処理を終了するかどうかを判断するためのパラメータである。入力画素縦カウンタIYは、副走査方向の画素数をカウントして1ページ分の処理が終了したかを判断するためのパラメータである。出力画素横カウンタOXは、フレームバッファ上の出力画素値を、主走査方向のどの位置に格納するかを示すパラメータである。カウンタOYは、出力画素値を、フレームバッファ上の副走査方向のどの位置に格納するかを示すパラメータである。横方向の合計カウンタHTは、入力画像バッファ53に格納された各画素の画素値を順番に合計し、その途中集計値を一時的に保持するデータ保持領域である。このデータは、1個の小領域分の合計を終了する都度、途中結果バッファ54に移される。
図30〜図33を用いて、入力画像を小領域に等分割した場合の、入力画像を構成する画素のグループ化について述べる。
図30に示した破線の格子点には、それぞれ入力画像の画素が存在するものとする。ここで、このような入力画像を、図の右側に四角印を並べて示すような画素配列の出力画像に縮小する場合を考える。このとき、各出力画素A毎に、対応する入力画像上の座標を求める。その位置は図の格子中に四角印で表示した。この出力画素Aの画素値は、その周辺に存在する入力画像の画素の画素値を平均して求める。
このために、図31に示すように、各出力画素Aの中間に線を引いて入力画像を等分割する。これによって、例えばこの図に示すように、副走査方向即ち縦方向に見た場合に、出力画素Aが2L間隔で配列されていたとすると、2L間隔で主走査方向に平行な境界51Hが設定される。同様にして、副走査方向に平行な境界51Lが設定される。こうして、入力画像を構成する各画素は、境界51Hと51Lによって小領域毎にグループ分けされる。
図32には、それぞれ出力画素Aに対応する入力画素を黒丸で示した。ここで、図の右下にある出力画素Aの画素値は、これに対応する4個の黒丸の、入力画素の画素値を平均したものになる。また、境界の選定上、図の左下に示された出力画素Bに対応する入力画素のグループは6個の黒丸となる。
即ち、入力画素が丁度境界上に存在する場合には、例えば図33に示すようなルールを設定する。図33に示すように、境界51Lあるいは51Hの真上に存在する画素はいずれも、例えば左側あるいは上側の領域に含まれる画素のグループに属するものと定義する。
図34には、グループの領域説明図を示す。
この図により、縦方向の境界画素71と横方向の境界画素72とを定義する。境界51Lと51Hによって囲まれた小領域には、図に示すような白丸と黒丸で表現される入力画素が含まれる。このとき、主走査方向に平行な境界51Hに最も近い1列の画素を横方向の境界画素72と定義する。また、副走査方向に平行な境界51Lに最も近い画素を縦方向の境界画素71と定義する。図29に示した装置は、これらの境界画素を他の画素と区別して認識し、境界画素を認識したとき、所定の集計処理や平均化処理を実行する。これによって、比較的小容量の途中結果バッファ54(図29)や入力画像バッファ53(図29)を利用して、領域毎に入力画素のグループに対する画素値の平均値を求める。
図35には、境界画素を利用した平均法の説明図を示す。
上記のような領域設定とグループ化を行うと、例えばこの図に示すように、枠73によって入力画素がそれぞれグループ化され、これらの平均値をとるために縦方向の境界画素71や横方向の境界画素72が読み込まれる。
図36には、境界画素の判定基準説明図を示す。
上記のような境界画素を判定しようとする場合には、この図に示すような境界画素の判定基準が必要となる。図に示すように、入力画像51を横方向の境界51Hと縦方向の境界51Lとによって、それぞれグループの領域51Zという単位に等分割する。このとき、横方向の境界画素の判別関数をborder・x(X)とし、縦方向の境界画素判別関数をborder・y(Y)とする。border・x(X)は、図の(b)に示すように、dst・xとsrc・xとXの関数である。dst・xは出力画像の主走査方向の幅である。また、src・xは入力画像の主走査方向の幅である。Xは、入力画像を主走査方向に見た場合の着目する画素の順位である。入力画素の間隔を“1”とすれば、全ての小領域の幅はsrc・x/dst・xとなる。こうした条件で、左から数えてX番目の入力画素が境界画素になるための条件は、X番目とX+1番目の入力画素の間に領域の境界が来ることである。領域の境界は、src・x/dst・xの間隔で並んでいるから、X番目の入力画素が境界画素になるための条件は次の(1)式の通りになる。
X<((src・x*n)/dst・x)≦X+1 …(1)
更に、X番目の入力画素が境界画素になるための条件は、次の(2)式を満たすような整数mが存在することである。
X<((src・x*m)/dst・x)≦X+1 …(2)
この(2)式において、まず両辺にdst・x/src・xを掛ける。dst・x/src・xは正なので不等号の向きは変わらない。
(dst・x*X)/src・x<m≦
(dst・x*(X+1))/src・x …(3)
ここで、mは整数なので両辺にガウス記号をつけてもこの関係は変わらないから次の(4)式の関係が成り立つ。
[(dst・x*X)/src・x]<m≦[(dst・x*(X+1))/src・x] …(4)
更に、[(dst・x*X)/src・x],[(dst・x*(X+1))/src・x]は整数なので、[(dst・x*X)/src・x]<[(dst・x*(X+1))/src・x]であれば[(dst・x*X)/src・x]<m≦[(dst・x*(X+1))/src・x]となるmが存在する。少なくともm=[(dst・x*(X+1))/src・x]は条件を満たす。
つまり、[(dst・x*X)/src・x]<[(dst・x*(X+1))/src・x]が、Xが境界画素になるための条件である。
以上のことから、border・x(X)の定義は次のようになる。
border・x(X)=1:[(dst・x*X)/src・x]<[(dst・x*(X+1))/src・x] …(5)
border・x(X)=0:[(dst・x*X)/src・x]≧[(dst・x*(X+1))/src・x] …(6)
同様に、副走査方向即ち縦方向に見た場合にも同様に判別関数を使用できる。
border・y(Y)=1:[(dst・y*Y)/src・y]<[(dst・y*(Y+1))/src・y] …(7)
border・y(Y)=0:[(dst・y*Y)/src・y]≧[(dst・y*(Y+1))/src・y] …(8)
図37には、平均法のデータの流れ(横方向)の説明図を示す。
この図面を用いて、途中結果バッファ54の構成とこの具体例で実行される画素値の合計処理について説明する。
例えば、図に示すように、入力画像を構成する画素74が主走査方向に連続して、図29に示す入力画像バッファ53に格納されたものとする。これを順番に図に示した左端から処理する。最初の画素の画素値は図29に示した横方向の合計カウンタHTに格納する。次の画素の画素値はその合計カウンタHTに加算する。そして、次々に各画素の画素値を横方向の合計カウンタHTに累積して格納していくが、丁度そのグループの境界画素を検出すると、そこでレジスタ54Aへ画素値を転記して加算を終了する。境界画素の検出はborder・xの値から判断する。
従って、この図に示すように、border・xの値が“1”になると、途中結果バッファ54で使用するレジスタを54Aから54Bに切り換える。そして、次のグループの画素についてその画素値を順に加算していく。従って、1ライン分の処理が終了すると、途中結果バッファ54に設けられた主走査方向に見た小領域の数分のレジスタに、それぞれ同一の小領域に含まれる画素の画素値の合計が格納される。
図38には、平均法のデータの流れ(縦方向)の説明図を示す。
主走査方向に見る処理は図37に示すようにして進められる。そして、1ライン分の処理が終了すると、次の1ライン分の処理が進められる。この副走査方向の処理がこの図に示すように行われる。
副走査方向の処理を実行する場合、その処理開始前に必ずborder・yの値を参照する。border・yの値が“0”の場合には、図37で示した1ライン分の集計処理が実行される。途中結果バッファ54の各レジスタの内容は、1ライン毎に加算され累積される。ここで、border・yの値が“1”となったラインを処理することを考える。このラインは領域の最後に配置された画素値群であるから、領域毎にその画素値の集計を行うと、途中結果バッファを構成する各レジスタの保持する値は、このライン上にある全ての小領域のそれぞれ画素値の合計値である。これとは別に、図29に示したパラメータ保持部60の横方向のドット数xnumと、縦方向のドット数ynumとをカウントしているため、各領域を構成する画素数が計算できる。従って、各領域の画素値の合計を各領域に含まれる画素数で割ることによって、平均値を求めることができる。これがフレームバッファ57に格納されて出力画素の画素値となる。
図39には、以上説明した具体例6の動作を順に説明するためのフローチャートを図示した。
ステップS1〜ステップS4は初期化の処理である。ステップS1では、入力画素縦カウンタIYと出力画素縦カウンタOYとを“0”にセットする。これによって、1ライン目からの読み出しを可能にする。ステップS2では、横方向の合計カウンタHTを“0”にする。これは画素値の中間的な集計結果を保存するためのものである。最初は1番左の画素を指定する。ステップS3では、縦方向のドット数ynumを“1”にし、横方向のドット数xnumを“1”にする。これによって、領域内の画素数を主走査方向と副走査方向に向かってカウント開始する。ステップS4では、途中結果バッファ54をクリアする。これで全ての小領域画素値集計結果に対応するレジスタがクリアされる。
次のステップS5では、入力画素横カウンタIXが“0”にされ、出力画素横カウンタOXが“0”にされる。こうして左端の画素から以下の処理が繰り返される。ステップS6では、入力画像を1行(1ライン)分読み込む。ステップS7では、HTに画像バッファのIX番目の要素(画素値)を足す。こうしてHTには現在処理中の画素の画素値合計が一時保持される。次に、ステップS8において、border・xの値をチェックする。この値が“0”の場合にはステップS11に進み、入力画素横カウンタIXをインクリメントしてステップS12に進む。ステップS12では、IXが入力画像の幅を超えないかどうかを判断し、幅を超えなければステップS7に戻る。
こうして画素値は順にHTに累積保持され、border・xの値が“1”になるとステップS9に進み、途中結果バッファ54のOX番目の要素(図36に示すレジスタ)にHTの値を足す。これで途中結果バッファ54の該当するレジスタに処理対象となる画素を含む領域の画素値についての合計が格納される。次に、出力画素横カウンタOXをインクリメントし、領域内集計用の横方向の合計カウンタHTを“0”にリセットする。そして、ステップS11に戻り、IXをインクリメントしてステップS12に進む。こうしてステップS7〜ステップS12の処理によって、1ライン分の画素値をそれぞれ領域毎に集計し、途中結果バッファ54に格納する。
これらの処理が終了するとステップS13に進み、今度はborder・yの値をチェックする。border・yの値が“0”ならばステップS15に進み、IYをインクリメントして、次のラインの処理に進む。また、同時に縦方向のドット数ynumをインクリメントし、ステップS16に進む。ステップS16では、入力画素縦カウンタIYが入力画像の高さ以下であるかどうかを判断し、その高さ以下であればステップS5に戻る。これによって、1画面分の処理が終了したかどうかが判断される。
一方、ステップS13において、border・yの値が“1”になった場合には、ステップS14の割り算処理に進む。
図40には、この割り算処理のフローチャートを示した。
割り算処理においては、まずステップS1において、横方向のドット数xnumに初期値“1”を代入する。また、入力画素横カウンタIXに初期値“0”を代入する。更に、ステップS2において、出力画素横カウンタOXに初期値“0”を代入する。
これらによって、1ライン分の最初の画素から処理を開始する準備を行う。
次のステップS3において、border・xの値を判断する。border・xの値は主走査方向に見た場合に、2以上の画素が1つの領域に含まれる場合、最初は通常“0”である。従って、ステップS8に進み、入力画素横カウンタIXに“1”を加える。更に、領域内の横方向の画素数をカウントする横方向のドット数xnumをインクリメントする。そして、ステップS9に進み、IXが入力画像幅より大きくならなければ再びステップS3に戻る。こうしてborder・xの値が“1”になるまでステップS3,S8,S9の処理を繰り返す。この処理は、単に領域に含まれる主走査方向に配列された画素の数即ち差、横方向のドット数xnumをカウントするための処理である。
このラインの画素値の集計は、既に図39のステップS7〜ステップS12の処理によって終了している。ここで、border・xの値が“1”になるとステップS4に進み、途中結果バッファの該当するレジスタの値をテンポラリファイルTMPに格納する。更に、ステップS5において平均値を計算し、フレームバッファ上の該当する画素の画素値を決定する。途中結果バッファの値を横方向のドット数×縦方向のドット数で割った答が平均値となる。ステップS6では、横方向のドット数xnumをゼロクリアする。これは、次の領域のドット数をカウントするための準備である。ステップS7では、OXに“1”を加える。これは出力画素の横カウンタをインクリメントして、次の出力画素を指定する処理である。
ステップS8で入力画素を1つ右に進め、xnumに“1”を加えて初期化し、再びステップS9において、全ての1ライン分の処理が終了したかを判断する。次の領域が存在すれば再びステップS3に戻り、これまで説明した処理を繰り返す。こうして、border・yが“1”のラインについて、途中結果バッファの各レジスタに格納されたそれぞれの領域に含まれる画素値の合計を、それぞれの領域を構成する画素の数で割ることにより平均値を求める処理を終える。これらの処理が全て終了すると、ステップS10でynumをゼロクリアし、次の処理に備える。また、ステップS11では、途中結果バッファをクリアし、次のラインから再び新たな集計を開始する。
〈具体例6の効果〉
以上の例によれば、入力画像を構成する画素を1ライン分ずつ保持し、主走査方向に見たときの小領域の境界画素を検出しながら、画素値の集計値を求めて途中結果バッファに格納し、副走査方向に見たときの境界画素を検出して、各小領域の画素値の集計値を領域に含まれる画素数で割ることによって、各領域における画素値の平均値を求める。このようにしたので、入力画像を構成する画素値を保持するためのメモリが、1ライン分の入力画像バッファと比較的小容量の途中結果バッファのみとなり、使用メモリ量を少なくすることができる。
〈具体例7〉
図41に、具体例7の装置のブロック図を示す。
この装置は、具体例6の装置に対しパラメータ保持部60にサンプリングの間隔Aを保持するためのレジスタを設けたものである。そして、これによって、各小領域の全ての画素値を加算して平均するのでなく、一部サンプリングした画素の画素値を平均する。
図42には、サンプリングされる入力画素の説明図を示す。
図に示すように、入力画像1は、副走査方向に平行な境界51Vと主走査方向に平行な境界51Hによって小領域に等分割されている。この小領域には多数の画素が含まれるが、図に示すように黒丸の画素74Aと白丸の画素74Bとを設定し、黒丸の画素74Aのみをサンプリングする。領域に含まれる画素の両端の画素間隔を図に示すように主走査方向Dx、副走査方向Dyとした。そして、サンプリング間隔をAとした。ここでは、実際には主走査方向も副走査方向もAの間隔で1個おきに画素がサンプリングされる。
図43には、サンプリング後の画像説明図を示す。
図の左側に示すものが元の入力画像であって、右側に示すものがサンプリングされた入力画素の集まりを示す。この図に示すように、サンプリング間隔を縦横同じに設定すると、サンプリングされた入力画素の集まりが元の入力画像と相似形の画像となる。
図44には、具体例7の動作フローチャートを示す。
この処理は、大部分図39に示す具体例6の動作フローチャートと同様である。図44の具体例では、ステップS5とステップS8とステップS9を新たに追加している。他の部分は図39と同様の処理であるため、重複する説明を省略する。まず図44のステップS5ではAの値を求める。即ち、ここでサンプリングの間隔を読み込む。画素1個おきでサンプリングを行う場合には、このAの値は既に説明したように“2”となる。更に、ステップS7で入力画素を読み込んだ直後、ステップS8でIYをAで割った余りと0を比較することで、サンプリング行であるかどうかの判断をする。
これによって、今読み込んだラインがサンプリング間隔から見て合計処理をすべきラインか、スキップするラインかを判断する。スキップするラインであれば、ステップS8からステップS16まで進む。なお、サンプリング対象となっていないラインであっても領域の境界になる場合がある。従って、ステップS8からステップS16への処理に進んでborder・yの値を調べるようになっている。ステップS16以下は具体例1と同一のため図示を省略した。
ステップS8では読み込んだラインがスキップすべきものかを判断したが、ステップS9では、そのラインの処理に移った場合に、着目している画素がスキップすべきものかどうかを、IXをAで割った余りと0を比較することによって判断する。スキップすべきものであればステップS9からステップS11に進み、その画素が境界画素かどうかの判断に移る。サンプリングすべき画素と判断した場合には、ステップS9からステップS10に進み、その画素値がHTに加算され集計される。
なお、IYとAあるいはIXとAの剰余を求める場合には、次のような処理を具体的に行う。
ここで、予めいくつかのパラメータを設定する。
(1)具体例1と同様に、平均は出力画素に対応する入力画素のグループ毎に求める。ただし、具体例1と異なり、グループ内全ての入力画素の合計を求めるわけではない。
(2)一定の間隔Aで、合計を取る入力画素をサンプリングする。A=1の場合は全ての入力画素をサンプリングすることになる。サンプリングの間隔Aは縦横一定である。これは、サンプリング後の画像が、元の画像と相似になるようにしたいためである。
次にAの求め方を示す。求め方を示すにあたって、いくつかパラメータを設定する。
(1)合計できる入力画素の最大数をNとする。Nは合計の計算の精度と、入力画素の階調数によって求まる。例えば、画素値が256階調(この場合、画素値の最大数は255)で、16ビットで合計を求める場合、16ビットで表現できる最大数は65535なので、全ての画素が255である場合を考えるとN*255≦65535を満たす必要がある。つまり、N=257となる。
(2)グループ中の横方向の画素の数をDx、縦方向の画素の数をDyとする。Aの間隔でサンプリングする場合、サンプリングする画素数はグループ中には横方向にDx/A、縦方向にDy/Aである。そして、サンプリング数はNを超えてはいけないので、間隔Aは、次のような式を満たす必要がある。
(Dx/A)*(Dy/A)≦N …(9)
ただし、Aは整数である。
また、Aを必要以上に大きくすることは、サンプリングする量を減らしてしまうことになるため、Aは(9)式を満たす最小の数である必要がある。つまり、A−1は(9)式を満たさないが、Aは(9)式を満たすような値がAの値である。このようなAは(Dx/A′)*(Dy/A′)=NとなるA′について小数部を切り上げることで求めることができる。
A′の値は、(Dx/A′)*(Dy/A′)=Nを解くことで、次のようになる。
A′=sqrt((Dx*Dy)/N) …(10)
AはA′の小数部分を切り上げたものなので、次のようになる。
A=[A′]+1 (A′が整数でない場合) …(11)
A=A′ (A′が整数のとき) …(12)
ただし、[A′]はガウス記号でA′を超えない最大の整数の意味であり、sqrtは平方根の意味である。
なお、Dx,Dyの値は、グループによって異なる。つまり、あるグループのDx,Dyで求めたAは別のグループではオーバーフローを引き起こしてしまう可能性がある。
しかし、Aの計算の際に、Dx,Dyの最大値を用いることで、全てのグループで問題無く使用できるAの値を得ることができる。
Dx,Dyの最大値は、入力画像のサイズsrc・x,src・yから、次の式で求めることができる。
Dx:src・x/dst・xを切り上げたもの
Dy:src・y/dst・yを切り上げたもの
〈具体例7の効果〉
以上のように、一定の間隔Aでサンプリングを行えば、小領域に含まれる画素数が多い場合に、これらのうちの任意の数の画素に絞って合計を行うことができる。これにより、途中結果バッファに合計を求めて保持する場合に、その合計値が必要以上に大きくならず、バッファのメモリ容量を十分に小さく抑えることができる。
〈具体例8〉
図45に、具体例8の装置のブロック図を示す。
この具体例では、具体例7の装置に対しサンプリングの間隔Aと共にサンプリング合計カウンタSTを記憶する領域を加える。他の部分は具体例7と同様の構成である。
図46には、具体例8の処理説明図を示す。
上記の処理では、サンプリングを行うことによって途中結果バッファのレジスタがオーバーフローすることなく、画素値を合計しその平均を求めることができる。なお、この場合、サンプリングされない入力画素は無視されていた。この具体例でサンプリングされない画素についても平均をとるようにし、画質の向上を図る。この平均をとる範囲を定義するために、サンプリング領域という概念を導入する。サンプリング領域は、サンプリング対象になるラインについて、サンプリングの対象となっている入力画素から、すぐ右の隣のサンプリング対象となっている入力画素を含むいくつかの入力画素から構成される。これは幅がAで、高さが1ライン分の入力画像上の領域となる。図46に示す黒丸の画素は、サンプリング対象となるラインの画素である。そして、ここでは隣合う2個ずつの画素をサンプリング領域80に設定する。こうして、図の左側に示すような元の入力画像に対し画素を平均化することによって、図の右側に示すような、元の入力画像と相似形の入力画素の集まりができる。
図47には、サンプリング領域の説明図を示す。
例えば、この図に示すように、境界51Hと51Vとによって設定された1つの小領域に多数の画素が存在する場合、Aライン毎にサンプリングが行われるとする。このとき、最初のラインの黒丸の画素74Aとその右隣の画素47Bとは同一のサンプリング領域80に含まれる。この同一のサンプリング領域80に含まれる画素の画素値は図45に示すサンプリング合計カウンタSTでその都度加算され平均化され、その後図45に示す横方向の合計カウンタHTに累積される。このように、その都度サンプリング領域に含まれる画素値を平均化した上で、途中結果バッファ54にその画素値を累積するようにすれば、実質的にサンプリング数が多くても合計値がオーバーフローするおそれがない。
図48には、具体例8の動作フローチャートを示す。
このフローチャートは、図39を用いて説明した具体例6のフローチャートと、ステップS5〜ステップS8の部分のみが異なる。まず、ステップS1〜ステップS4までで初期化処理が行われるが、ステップS5で、1ライン分の各画素の処理に移ったとき、図45に示したサンプリング合計カウンタSTに入力画素バッファのIX番目の要素を足す。次のステップS6で、IX+1番目、即ちその隣の画素とサンプリング数との比較を行う。サンプリング数よりも小さい場合には、サンプリング領域内部である。従って、このステップS6で、サンプリング合計カウンタSTに同一のサンプリング領域に含まれる画素の画素値全てを加算する処理を繰り返す。全ての加算処理が終えるとステップS6からステップS7に進み、ここではサンプリング合計カウンタSTをサンプリング数で割ることによって、サンプリング領域内の画素値の平均を求める。次に、これを横方向の合計カウンタHTに加算する。こうして、サンプリング領域内の画素値の平均をHTに加算した上で、ステップS8でサンプリング合計カウンタSTの初期化を行い、次の処理へ進む。
このようなステップS5〜ステップS8の処理をこれまでの具体例に含めることによって、サンプリング領域内の平均値算出が可能になる。
図49には、具体例8の初期化処理フローチャートを示す。
図48のステップS1では、この具体例8特有の初期化処理が行われる。その内容は、この図に示すように、ステップS31〜ステップS34については、図44のステップ1〜ステップS4のこれまでの初期化処理と全く同様である。また、ステップS35では、図44の具体例7の処理と同様に、サンプリング間隔Aの値を求める。そして、ステップS36では、サンプリング合計カウンタSTの初期化を行う。こうして、合計処理のための準備が終了する。
〈具体例8の効果〉
この具体例8によれば、小領域に含まれる画素数が多く、これらの画素値を合計した場合に、途中結果バッファの各レジスタが桁数の面でオーバーフローするような場合に、元の画像の画質を損なうことなく平均化処理が可能になる。即ち、サンプリング領域については予め平均化を行った後、途中結果バッファにその平均値を加算するような累積方法をとるため、途中結果バッファがオーバーフローしない。
なお、上記の例では、主走査方向についてのみサンプリング領域を設定する例を示したが、副走査方向についても同様のサンプリング領域を設定して、オーバーフローを防止することが可能である。
〈具体例9〉
これまで説明した例では、例えば画像を拡大する場合、各行及び各列単位に画素を何回コピーするかという整数倍率を計算する必要があった。こうして計算した結果をもとに、まず、拡大/縮小テーブルを用意し、その後、このテーブルを参照しながら拡大/縮小処理を行う。こうすれば、テーブルの参照だけで画素ごとの拡大/縮小倍率を得られることから、画像拡大/縮小処理の高速化が図られる。しかしながら、拡大前後の画像サイズによっては、拡大/縮小テーブルのデータ量が大きくなり、メモリ効率を低下させる場合もある。この具体例では、拡大/縮小倍率の演算を高速に簡単に行えるようにして、これまでとは逆に、拡大/縮小テーブルを不要にして、メモリエリアを節約する。
この具体例では、以下、行とかラインとかいう用語を用いて説明を行うが、これは主走査方向を示す。列方向即ち、副走査方向についても同様の処理ができることはいうまでもない。
図50には、この具体例において実施をする妥当なアルゴリズムの説明図を示す。
図の1番左に示す(1)が原画像であって、白または黒で塗り潰した部分は1ライン分の画素群である。図の真ん中に示した(2)は、(1)の画像を縦方向に丁度1.75倍した状態を示す。もし、各ラインが実数倍即ち1.75倍という倍率で縦方向にそのまま拡大できるならば、この(2)に示すような結果になる。
即ち、1ライン目は0.00〜1.75、2ライン目は1.75〜3.50、…というように拡大され、最後の8ライン目は12.25〜14.00という幅に拡大される。従って、原画像8ライン分が拡大画像では、14ライン分の幅に拡大されたことになる。しかしながら、画像データでは、各ラインは整数単位でしか拡大/縮小をすることができない。つまり、ライン間の境界は整数になる必要がある。そこで、ライン間の境界を実数倍率で得られた値を超えない整数と定義する。その結果、1ライン目はそのまま、2ライン目は2倍、3ライン目は2倍、4ライン目も2倍、5ライン目は1倍というように原画像の各ラインを整数倍にし、最終的に原画像7ライン分を14ライン分に拡大する。
上記のような各ラインの整数倍率は以下の計算で求められる。
MUL(n)=[n*mul]−[(n−1)*mul]
但し、mul=(出力画像のサイズ)/(入力画像のサイズ)である。
また、式の中で使用した各記号の意味は次の通りである。
[]:ガウス記号(内部の実数を超えない整数)
n:行番号(n=1から始まるものとする)
拡大処理の要領は、行方向も列方向も全く同様である。従って、各画素に割り振る整数倍率は、このように計算すれば、拡大処理ができる。ところが、この計算では、上記の整数倍率計算式に示すように、整数演算を2回、実数演算を2回、実数から整数への型変換を2回行う。こうした演算は非常に時間がかかり、1画素ずつ処理をする度にこの計算を実行すると、CPUの能力によっては、時間がかかり過ぎて現実的でない。
上記のアルゴリズムによって、各ラインに分配される整数倍率を分析してみる。各ラインの倍率は最低でも実数倍率の整数部分となっている。つまり、1.75倍であれば、各ラインの倍率は最低でも1倍となり、2.5倍ならば2倍となる。また、小数部分が桁上がりした場合にのみ、倍率が1だけ増加する。つまり、指定された実数倍率をmulとすると、全てのラインは最低でもBASE=[mul]倍となり、小数部分が繰り上がった場合のみBASE+1倍となる。
そこで、小数部分が繰り上がったかどうかを判定する方法を考える。指定された実数倍率の小数部分をDEC、行番号nとした場合、n*DECの小数部分がDECより小さいときに、繰り上がりが発生したと判定できる。
図51には、繰り上がり発生の判定方法説明図を示す。
例えば、ここでDEC=0.3の場合を考える。最初の1ライン目は小数部分が0.3である。2ライン目は小数部分が0.6になる。3番目は小数部分が0.9になる。そして、4番目は小数部分が0.2となり、1だけ繰り上がるから1ライン増やすことになる。ここで、1ライン目、2ライン目、3ライン目の小数部分は必ずDECより大きい。そして、繰り上がりが生じるときの小数部分は0.2となっている。このとき、初めて小数部分がDECより小さくなる。このアルゴリズムをまとめると次のようになる。
前処理として、以下の値を計算しておく。
BASE=[mul]
DEC =mul−BASE
各行毎の倍率は以下のように求める。
DEC*nの小数部≧DECの場合、倍率はBASE
DEC*nの小数部<DECの場合、倍率はBASE+1
以上のようなアルゴリズムは実数乗算が1回、実数比較(実数減算)が1回、実数から小数部分のみを取り出す処理(実数減算)が1回必要となるが、既に説明した処理に比べて演算回数が減少している。
ここで、このアルゴリズムの演算処理をレジスタ幅の限界を利用して高速化する。例えば、CPU幅が32ビットであると仮定する。
前処理として、以下の値を計算しておく。
BASE=[mul]
DEC =(mul−BASE)*232+1
DECは32ビット幅の整数レジスタで保持する。
上記BASEは整数部分、DECは小数部分である。+1としたのは、さらに下位の小数部分が存在する場合に、切り上げ処理をするためである。
DECに処理対象ライン位置nをかける。この計算結果をDEC2とする。
DEC2=DEC*n
計算結果のDEC2は32ビット幅の整数レジスタで保持する。
DEC,DEC2の大小比較により、整数倍率を決定する。
DEC2≧DECの場合、倍率はBASE
DEC2<DECの場合、倍率はBASE+1
以上の処理では32ビット幅の整数レジスタを利用し、小数部を0〜232−1までの整数で表現する。DEC*nの計算においては、整数部分を意図的にオーバーフローさせてしまう。これにより、計算結果として、整数部分を無効にし、小数部分だけが残るアルゴリズムを利用する。整数の乗算が1回、整数比較(整数減算)が1回行われるだけの高速なアルゴリズムである。但し、このアルゴリズムでは、小数部を0〜232−1までの整数に丸めてしまう。従って浮動小数点の精度で計算した場合とは厳密には一致しないことが有り得る。この処理は、インクリメントするCPUのレジスタ幅によって、64ビット、128ビット等に拡張でき、レジスタ幅が大きくなるほど精度が向上する。
図52に、具体例9の装置のブロック図を示す。
この装置は、外部記憶装置91と最近傍法拡大/縮小装置92を備える。この最近傍法拡大/縮小装置92には、倍率計算部93、最近傍法拡大/縮小処理部94及びラインバッファ95が設けられている。また、この装置の出力は、出力画像フレームバッファ96に取り出されるよう構成されている。
外部記憶装置91は、拡大/縮小処理前の入力画像データを保持する装置である。出力画像フレームバッファ96は、最近傍法による拡大/縮小後の出力画像を保持する記憶装置である。
最近傍法拡大/縮小処理部94は、ラインバッファ95内のラインデータに対して倍率計算部93により計算された整数倍率分だけ拡大/縮小を施して、画像データを出力画像フレームバッファ96に出力する装置である。倍率計算部93は、最近傍法拡大/縮小処理部94から入力画素の座標値を受け入れ、その画素に対応する整数倍率を演算する部分である。ラインバッファ95は、外部記憶装置91から1ライン分ずつ読み込んだ入力画像データを保持する記憶部である。
図53に、図52に示した倍率計算部93のブロック図を示す。
この倍率計算部93は、乗算部103,104、比較/選択部105,106及び倍率計算器107を備えている。倍率計算器107には、レジスタDECX1,DECX2,BASEX1,BASEX2,DECY1,DECY2,BASEY1,BASEY2が設けられている。乗算部103は、X座標101を受け入れて所定の整数乗算を行う計算部である。乗算部104は、Y座標102を受け入れて所定の整数乗算を行う計算部である。
比較/選択部105は、レジスタDECX1,DECX2,BASEX1,BASEX2の出力を受け入れてそのいずれかを選択し、X方向倍率108を出力する部分である。比較/選択部106は、レジスタDECY1,DECY2,BASEY1,BASEY2の出力を受け入れて、そのいずれかを選択し、Y方向倍率109を出力する部分である。X座標101、Y座標102は、図52に示した最近傍法拡大/縮小処理部94により指定された処理対象画素の座標値である。
X方向倍率108、Y方向倍率109は倍率計算部93から出力され、最近傍法拡大/縮小処理部94に向けて出力される計算結果である。これによって、指定された座標値に対応する整数倍率がX方向、Y方向について、それぞれ出力されることになる。
図54には、具体例9の動作フローチャートを示す。
まず、ステップS1において、最初に指定された実数倍率に従って倍率計算部93内部のレジスタの設定を行う。レジスタ設定については後で詳細に説明する。次に、ステップS2において、外部記憶装置91からラインバッファ95へ入力画像1ライン分を読み込む。ステップS3において、読み込んだラインデータのY座標に対応する整数倍率を倍率計算部93によって計算する。ステップS4では、ラインバッファ中の処理対象画像データのX座標に対応する整数倍率を倍率計算部93により計算する。
次に、ステップS5に進み、画素を複製し、出力画像フレームバッファ96に出力する。ステップS6は、これをX方向倍率分繰り返すための処理である。ステップS7は、入力画像ライン幅分だけこの処理を繰り返す制御を行う部分である。ステップS8は、ステップS4〜ステップS7の処理をラインデータのY方向倍率分だけ繰り返す制御を行う。ステップS9で、入力画像ライン数分、上記の処理を繰り返す。
以上の処理によって、出力画像フレームバッファには、入力画像データの上から下、左から右に向かって順に各画素の複製が出力されていく。
図55には、拡大/縮小の処理過程の説明図を示す。
図の黒丸印で示した画素は出力画像の画素である。また、図の格子で仕切った各領域は入力画素の1画素に対応する。X軸方向、Y軸方向共に整数倍率でないため、入力画素1画素分の領域は、それぞれ異なる画素数の出力画素に対応している。
図56には、レジスタ設定のフローチャートを示す。
なお、以下のレジスタ設定動作と倍率計算方法については、X方向の説明のみを行う。Y方向については同様なので説明を省略する。
まず、図53に示すレジスタDECX1,DECX2,BASEX1,BASEX2の幅をNビットとする。また、指定された実数倍の倍率をmulで表す。具体例として、レジスタ幅を32ビット(N=32)、拡大倍率2.5倍(mul=2.5)について説明する。
図56のステップS11において、まず指定された実数倍率を整数部と小数部に分離する。具体例のmul=2.5では、BASE=2、DEC=0.5となる。そして、整数部を示すレジスタBASEの値をBASEX1に設定する(ステップS12)。また、繰り上がりの場合は、これより“1”だけ大きい倍率が設定されるから、ステップS13において、整数分の値に“1”を加算した値をレジスタBASEX2に設定する。具体例では、BASEX1=2、BASEX2=3になる。
次に小数部を格納したレジスタDECに2Nを掛け、1を加えた整数値をDECX1に設定する。即ち、具体例では、例えば次のような計算をする。
DECX1 = DEC*2N+1
= 0.5*232+1
= 2,147,483,649
次に、倍率計算を実行する。
図57には、X方向倍率計算のフローチャートを示した。
ここでは、具体例としてN=32、mul=2.5、X座標は2(X=2)の場合について説明する。図53に示した乗算部103は、図52に示す最近傍法拡大/縮小処理部94によって指定されたX座標とレジスタDECX1の内容とを掛け合わせ、レジスタDECX2に設定する(ステップS21)。次のステップS22では、判断処理(ステップS23)の結果により、ステップS24あるいはステップS25を実行する。
即ち、X座標の積を求めた結果得られた小数部DECX2が実数倍率の小数部DECX1より大きいかあるいは等しい場合には繰り上げはしない。最初の小数部以下の場合には繰り上げをする。繰り上げをしない場合には、レジスタBASEX1の内容を出力する。繰り上げをする場合には、レジスタBASEX2の内容を出力する。こうして、X方向の倍率が、レジスタBASEX1あるいはBASEX2の内容のいずれか一方を選択して得られる。
以上のようにすれば、座標値に応じた整数倍率の計算が整数乗算と比較/選択のみにより実現する。
〈具体例9の効果〉
この具体例によれば、最近傍法による画像データの実数倍率の拡大/縮小をする場合に、各行/各列に割り振る整数倍率の計算を、レジスタ幅の限界を利用して高速化できる。これによって、拡大/縮小テーブルを予め全て用意する必要がなくなる。従って、拡大/縮小テーブルを保持するためのメモリが不用になり、コンピュータのメモリ使用効率が向上する。また、最近傍法による画像データの実数倍率の拡大/縮小処理を、少ないメモリ容量で高速に実行することを可能にする。
〈具体例10〉
画像の拡大をした場合に、コピーした画素の画素値を決定する方法として、最近傍法と一次補間法とがある。具体例4等で説明した一次補間法では、周囲4画素の画素値と各画素までの距離を用いて、尤もらしい画素値を求める。これにより、拡大処理を行った際のジャギを目立たなくし、画質を向上させる。この方法では、例えば具体例4を説明する図19に示した近傍エリアテーブルを利用する。ここにも、具体例9で用いたアルゴリズムを採用することができる。
図58を用いて、既にいくつかの具体例で説明した近傍エリアについて再度説明を行う。
図58の左側には入力画像を示し、右側には出力画像を示した。
図に示すように、入力画素で作られる格子を出力画像にマッピングすると、入力画素で作られる格子で囲まれた領域が近傍エリアとなる。一次補間処理は、この近傍エリアと呼ばれる領域を単位に行う。この近傍エリアに含まれる出力画素の数は以下の式で得られる。
A=1のとき MUL(n)=B
A≠1のとき MUL(0)=1
MUL(n)=[n*mul]−[(n−1)*mul]
(n>0)
但し、mul=(B−1)/(A−1)である。
具体例4の図19においても同様の趣旨の説明をした。
また、式中の記号、及び演算子の意味は下記の通りである。
A:入力画像のサイズ
B:出力画像のサイズ
n:=近傍エリアの番号(n=0から始まるものとする)
MUL(X):X番目の近傍エリアの画素数
[]:ガウス記号(内部の実数を超えない最大の整数)
具体例4の図19においても同様の趣旨の説明をした。
上記の式は、最近傍法の式と基本的には変わらない。しかし、上端と左端については一次補間では常に“1”になる。これも、図19に示したとおりである。一次補間における近傍エリアに含まれる出力画素の数と最近傍法における各入力画素毎の整数倍率は基本的に同じものである。
図59には、最近傍法と一次補間との処理の順番の違いを示すフローチャートを図示した。
図59(a)において、最近傍法では、まずステップS31で、X方向の倍率計算を行う。そして、ステップS32において、1画素分画素を複製し、ステップS33において、X方向の倍率分画素の複製が終了したかを判断する。これによって、X方向の倍率分画素を複製する。更に、その複製が終了すると、ステップS34において、入力画像ライン幅分の画素複製が終了したかどうかを判断する。これによって、ライン幅方向の画素複製を実行する。こうしてX方向及びY方向の画素複製が終了する。
図の(b)における一次補間法では、まずステップS41において、現在の整数倍率を示すMULXに初期値“1”を設定する。次にステップS42において、一次補間を実行し、ステップS43においては、MULX分の処理が終了したかどうかを判断する。そして、ステップS42をこの回数分繰り返し、ステップS44に移る。ステップS44では、MULXを更新し、ステップS45で、入力画像ライン幅分の処理が終了したかどうかを判断する。これによって、ステップS42〜ステップS44の処理を繰り返し、X方向の幅分画素の一次補間処理を終了する。
上記倍率計算とMULXの計算は、同一の演算をしている。
そこで、以下の説明では、近傍エリアに含まれる出力画素の数と整数倍率とを区別せず、一次補間の場合も整数倍率と表記する。一次補間の処理は、上端の近傍エリアから下へ、左端の近傍エリアから右へと行われる。従って、全ての近傍エリアを走査するループにおいて、ループの最初では拡大倍率は“1”となり、それ以後は最近傍法の場合と同様の計算方法で整数倍率を求める。最初の近傍エリアのみ整数倍率を“1”にするための方法は、次の2つが考えられる。
(1)上端または左端の場合とそうでない場合とにループを分ける。
(2)整数倍率を計算する式に条件判定を入れ、画素の位置が上端または左端の場合には整数倍率を“1”にするようにする。
しかしながら、上記(1)の方式は処理が複雑になり、プログラムサイズが大きくなる欠点がある。(2)の方式は条件判定が1つ増えるため、プログラムの実行速度が落ちてしまう。この具体例10では、プログラムサイズもあまり大きくならず、実行速度も落ちない方法を紹介する。これは次の考え方で実現できる。
(1)具体例9の最近傍法の場合に用いた変数の他に、現在の整数倍率を示す変数MULXを用意する。
(2)MULXは近傍エリアを走査するループの先頭で、“1”に初期化する。
(3)拡大率の計算のタイミングをループの先頭ではなく、後方で行うように変更する。
こうすることで、MULXにはループの始めでは“1”が、それ以降ではBASEX1またはBASEX2が入ることになる。
なお、これは横方向についてのみ説明したが、縦方向についても全く同様である。
図60に、具体例10の装置のブロック図を示す。
この装置は、外部記憶装置111、一次補間拡大/縮小装置112及び出力画像フレームバッファ119から構成される。一次補間拡大/縮小装置112は、倍率計算部113、一次補間拡大/縮小処理部114、前行ポインタ115、現行ポインタ116、ラインバッファ117、ラインバッファ118により構成される。
この装置は、具体例9の装置と比較すると、前行ポインタ115、現行ポインタ116、ラインバッファ117及びラインバッファ118を備えた点が異なる。近傍エリアを作るためには、上下2ラインの画素が必要であるため、このように2ライン分のラインバッファを用意した。この2ライン分のラインバッファ117,118は、上下が交互に入れ替わるので、上の行を示すポインタを前行ポインタ115、下の行を示すポインタを現行ポインタ116として区別した。
図61には、倍率計算部のブロック図を示す。
この倍率計算部113は、具体例9の場合と同様、X座標121、Y座標122を受け入れて、X方向倍率124及びY方向倍率125を出力する回路である。倍率計算部113の中には、乗算部126,127、比較/選択部128,129及び倍率計算部123が設けられている。具体例9の場合と異なるのは、比較/選択部128の出力側にMULX131が設けられ、比較/選択部129の出力側にMULY132が設けられた点である。
これらのレジスタMULX,MULYは、倍率を格納するレジスタである。このレジスタの初期値に“1”を入れておくことにより、最初の近傍エリアの拡大率を“1”にすることができる。
図62には、具体例10の動作フローチャートを示す。
まず、ステップS1において、倍率計算部のレジスタ設定を実行する。この各レジスタに格納される値は、後で詳しく説明するが、レジスタMULX及びMULYに、それぞれ“1”を入れておくことが重要である。次に、ステップS2において、外部記憶装置から現行ポインタ116が指し示すラインバッファ117あるいは118にデータを読み込む。
そして、ステップS3において、これらのラインバッファを使用して一次補間を行う。ステップS4は、このステップS3の処理をX方向の倍率分繰り返す制御である。倍率を示すレジスタMULXは、“1”に初期化されている。X方向の拡大/縮小のループが終了したら、次のX方向の拡大率を計算し、MULXに格納する。そして、ステップS6において、以上の処理を必要なライン幅だけ行ったかどうかを判断する。
ステップS7では、次の行の処理を行うために、MULXを1に設定する。ステップS8は、ステップS3からステップS7までの1行分の一次補間処理をY方向の拡大幅分即ちMULY分実行する制御である。MULYも初期値は“1”に設定されている。
次に、ステップS9において、Y方向の倍率を計算し、MULYに格納する。ステップS10は、バッファポインタを入れ替えることによって更新する。そして、ステップS11において、ステップS2〜ステップS10までの処理を入力画像のライン数分繰り返す制御を行う。
図63には、倍率計算部のレジスタ設定フローチャートを示す。
ここでも、具体例9の場合と同様に、図61に示した倍率計算部113の各レジスタのビット幅をNビットとする。入力画像の幅Aと出力画像の幅Bから実数倍率mulを求める(ステップS11)。次に、求めた実数倍率mulを整数部と小数部とに分離する(ステップS12)。BASEは整数部、DECは小数部である。
次に、BASEX1にBASEをセットする(ステップS13)。また、BASEX2にBASE+1を設定する(ステップS14)。更に、DECに2Nを掛け1を加えた値を設定する(ステップS15)。最後にステップS16において、MULXを“1”に初期化する。例えば、入力画像の幅が3で、出力画像の幅が6の場合には、mulは次の式で求められる。
mul=(6−1)/(3−1)
=2.5
更に、DECX1は、次の式で求められる。
DECX1=DEC*2N+1
=0.5*232+1
=2,147,483,649
図61に示した比較/選択部128は、DECX1とDECX2の大小関係に応じてBASEX1あるいはBASEX2のどちらかを選択し、X方向倍率としてMULXレジスタにセットする。但し、DEC2は一次補間拡大/縮小処理部で管理されるX座標とDECX1とを掛け合わせた結果である。検索結果が2Nを超える場合には、比較/選択の規則は次の通りになる。
DECX2≧DECX1の場合、倍率はBASEX1
DECX2<DECX1の場合、倍率はBASEX2
以上の計算を近傍エリアごとに行えば、図19で示した近傍エリアテーブルを保持しておく必要が無い。
〈具体例10の効果〉
以上の例によれば、一次補間法による画像データの実数倍率の拡大/縮小において、拡大倍率を保持するレジスタを利用し、具体例9で説明したアルゴリズムを併用して、近傍エリアテーブル保持によるメモリ効率の低下を解消した。なお、一次補間法による画像データの実数倍率の拡大/縮小をこれにより、高速でかつ省メモリにより実現できる。
〈具体例11〉
印字しようとするイメージが印字可能な領域をはみ出る場合、イメージを印字領域の大きさに合わせて切り取る必要がある。この切り取る作業をクリッピングと呼ぶ。
図64には、クリッピングが必要な例説明図を示す。
この例では、イメージを最近傍法で5倍に拡大して印字している。図の黒塗り部分135が最近傍法で5倍に拡大されたイメージである。そのドット構成を下側に示す。丸印は各画素である。
ここで、図の上側に白枠で示した部分を印字可能領域とすると、黒塗りの領域135の左側は、印字可能領域をはみ出している。即ち、このイメージの左側は印字されずクリッピングされてしまう。領域138は、横方向に画素を5倍に拡大した有効な部分である。領域137と136とは、画素を横方向に5倍に拡大したものの、左側の領域136は印刷されないから捨てられる。このように、クリッピングされる境界は、拡大画像の途中に来ることが普通である。また、拡大処理は印字領域内にあるイメージ分だけ行えばよく、印字領域外で行う必要はない。即ち、領域136の黒丸のデータは、単に捨ててしまってもよい。以上の点から、クリッピングを考慮すると、イメージの端は通常と異なる拡大率であってもよいことになる。
図の例では、印字可能領域の境界線を139とした場合に、境界線の内側即ち領域138より右側の白丸のドットは全て印字されるから、5倍に拡大する。境界線139と接する領域137の白丸のドットは3倍に拡大する。また、境界139外の部分にある領域136の黒丸のドットは、印字されないから、拡大しない。こうしたクリッピングを実現するために、画像の部分的な拡大率が通常の拡大率と異なる制御をする必要がある。
この具体例では、実数倍の拡大/縮小において、左側または上側のクリッピングを効率よく行う方法を提供する。なお、これから説明する例は、上側または左側のクリッピングにとくに適した方法である。
以上の具体例11を実現するために、まず拡大率を保持するレジスタMULXまたはMULYを用意する。なお、これらのレジスタをまとめてレジスタMULと呼ぶ。画像の左端、上端については、拡大率を計算するのではなく、MULの初期値を拡大率として用いる。ここは、具体例10と同様である。MULの初期値は具体例10では常に“1”であったが、この具体例では条件によって異なる。従って、左端、上端の拡大率を予め計算する。
図65には、具体例11の装置のブロック図を示す。
この装置は、外部記憶装置141、最近傍法拡大/縮小装置142及び出力画像フレームバッファ143から構成される。また、最近傍法拡大/縮小装置142は、倍率計算部144、クリッピング計算装置145、最近傍法拡大/縮小装置146及びラインバッファ147から構成される。
この装置を具体例9の装置と比較した場合、クリッピング計算装置145が追加されている部分が異なる。このクリッピング計算装置145は、画素の位置情報と印字可能領域の情報をもとに、印字領域の上端と左端の画素の拡大倍率を計算する部分である。この結果は倍率計算部144の内部に設けられたレジスタMULX及びMULYに格納される。
図66に、具体例11の動作フローチャートを示す。
まず、ステップS1において、上端、左端の拡大倍率をクリッピング計算装置145を用いて計算する。次にステップS2で、倍率計算部で用いるレジスタを初期化する。この場合、レジスタMULX及びMULYは、ステップS1で求めた値を設定する。次に、ステップS3において、外部記憶装置から1ライン分のデータを読み込み、ラインバッファに格納する。
次に、ステップS4において、現在の入力画像の画素を出力画像フレームバッファに複製する。次に、ステップS5において、X方向倍率分この処理を繰り返す制御を行う。また、ステップS6では、X方向倍率に相当するレジスタMULXの内容をアップデートする。なお、この倍率計算の仕方は、具体例10の場合と同様である。即ち、DECX2がDECX1よりも大きければ、BASEX1を選択し、そうでなければBASEX2を選択する。
ステップS4〜ステップS6までの処理を入力画像ライン幅分繰り返す(ステップS7)。次の行の処理を行うために、MULXに左端の画素の拡大率を設定する(ステップS7)更に、ステップS4〜ステップS8までの処理をY方向倍率回数繰り返す(ステップS9)。また、Y方向倍率計算によりレジスタMULYの値をアップデートする(ステップS10)。倍率計算の仕方は具体例11の場合と同様で、DECY2がDECY1よりも大きければBASEY1を選択し、そうでなければBASEY2を選択する。ステップS4〜ステップS10の処理を入力ライン数分繰り返す制御を行い(ステップS11)、全てのライン数分を実行して処理を実行する。
図67に、倍率計算部レジスタ設定のフローチャートを示す。
図のステップS11〜ステップS14までの処理は、具体例9の処理と同一である。即ち、実数倍率mulの整数部をBASEに、小数部分をDECに設定する。そして、レジスタBASEX1にはBASEを、レジスタBASEX2にはBASE+1を設定する。その後、レジスタDECX1には、DEC*2N+1を設定し、MULXに、クリッピング計算装置を用いて計算した左端の画素の拡大率を設定する。
〈具体例11の効果〉
以上の例によれば、最近傍法による画像データの実数倍の拡大/縮小において、クリッピングが必要な場合においても、先頭の倍率計算を行うレジスタにその倍率を予め計算し、設定するようにしたので、実数倍率の拡大/縮小を高速かつ省メモリで実現することが可能になる。もちろん、一次補間による様々な拡大/縮小処理において、クリッピングに対処することが可能になる。
具体例1による拡大/縮小処理部の動作説明図である。 具体例1による画像データ拡大/縮小装置のブロック図である。 整数倍率の拡大法説明図である。 最近傍法による拡大/縮小処理説明図である。 具体例1の拡大/縮小方法を示すフローチャートである。 モジュロ演算を用いる画像拡大/縮小装置のブロック図である。 拡大/縮小テーブルの冗長性の説明図である。 割り算の余りを求める計算(モジュロ演算)の説明図である。 具体例2の拡大/縮小方法動作フローチャートである。 具体例3による拡大/縮小装置のブロック図である。 従来より画像の拡大/縮小処理に採用されていた画素値補正のためのリサンプリングの説明図である。 正方格子の説明図である。 一次補間の一般的計算法説明図である。 具体例3による一次補間の説明図である。 具体例3による一次補間の処理例説明図である。 具体例3の装置の動作フローチャートである。 具体例4の原理説明図である。 具体例4の装置のブロック図である。 近傍エリアテーブルの説明図である。 ラインバッファの説明図である。 画像データ格納処理説明図である。 近傍エリアの拡大図である。 具体例4の動作フローチャートである。 具体例4の計算内容説明図である。 具体例5の装置のブロック図である。 ドット間の相関関係説明図である。 ドット間の相関関係説明図である。 具体例5の装置の動作フローチャートである。 具体例6の装置のブロック図である。 グループ定義説明図(その1)である。 グループ定義説明図(その2)である。 グループ定義説明図(その3)である。 グループ定義説明図(その4)である。 グループの領域説明図である。 境界画素を利用した平均法の説明図である。 境界画素の判定基準説明図である。 平均法のデータの流れ(横方向)の説明図である。 平均法のデータの流れ(縦方向)の説明図である。 サンプリングされる入力画素の説明図である。 具体例6の動作フローチャートである。 割り算処理のフローチャートである。 具体例7の装置のブロック図である。 サンプリング後の画像説明図である。 具体例7の動作フローチャートである。 具体例8の装置のブロック図である。 具体例8の処理説明図である。 サンプリング領域の説明図である。 具体例8の動作フローチャートである。 具体例8の初期化処理フローチャートである。 妥当なアルゴリズムの説明図である。 繰り上がり発生の判定方法説明図である。 具体例9の装置のブロック図である。 具体例9の倍率計算部のブロック図である。 具体例9の動作フローチャートである。 拡大/縮小の処理過程の説明図である。 倍率計算部レジスタ設定のフローチャートである。 X方向倍率計算のフローチャートである。 近傍エリアの説明図である。 最近傍法と一次補間との処理の順番の違い説明図である。 具体例10の装置のブロック図である。 具体例10の倍率計算部のブロック図である。 具体例10の動作フローチャートである。 倍率計算部レジスタ設定のフローチャートである。 クリッピングが必要な例説明図である。 具体例11の装置のブロック図である。 具体例11の動作フローチャートである。 倍率計算部レジスタ設定のフローチャートである。
符号の説明
3 入力画像データ
4 出力画像データ
1X,1Y 拡大/縮小テーブル

Claims (4)

  1. 入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像データを生成する画像データの縮小方法において、
    前記入力画像データを小領域に分割し、小領域に含まれる入力画素と小領域の境界上の入力画素とを区別して認識し、前記小領域内の入力画素値と認識された境界上の入力画素値とに基づいて小領域内の入力画素値を演算して出力画素値を求める画像データの縮小方法であって、
    前記小領域内の入力画素をサンプリングするサンプリング領域を指定し、サンプリング領域内の画素値を演算することにより出力画素値を求めることを特徴とする画像データの縮小方法。
  2. 入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像を生成する画像データの縮小装置において、
    前記入力画像を複数の入力画素を含む小領域に区分し、隣接する小領域間を仕切る境界線上に位置する入力画素を検知して該入力画素を含むいずれかの小領域を一定条件に基づいて決定する境界線画素判定手段と、
    前記各小領域に含まれる複数の入力画素の各画素値に基づいて出力画素の画素値を演算する画素値演算手段と、
    を有する画像データの縮小装置であって、
    前記画素値演算手段は、前記小領域にサンプリング領域を設定し、該サンプリング領域内の入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの縮小装置。
  3. 入力画像を、主走査方向に平行な境界と副走査方向に平行な境界により小領域に等分割し、各領域中に含まれる画素の画素値を平均して出力画素の画素値を求めることにより、入力画像を縮小した出力画像を得るものにおいて、
    入力画像を構成する画素の画素値を主走査方向にみて1ライン分受け入れて保持する入力画像バッファと、
    前記入力画像バッファに受け入れた各画素の画素値を主走査方向に順に累積していき、副走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた、同一小領域内の画素値の合計を、小領域単位で保持する途中結果バッファと、
    副走査方向に1ライン分ずつ入力画像を処理していき、主走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた各小領域内の画素値の合計を、途中結果バッファから読みだして、各小領域に含まれる画素数で割って、小領域毎の画素値の平均値を求め、その平均値を出力画像の画素の画素値とする制御部とを備えた画像データの縮小装置であって、
    前記入力画像を分割した小領域に含まれる画素のうちの一部をサンプリングして、それらの画素値を集計するために、サンプリングの間隔を設定して保持するパラメータ保持部を設け、
    途中結果バッファは、
    前記パラメータ保持部を参照して、サンプリング間隔ごとに画素値を集計して保持することを特徴とする画像データの縮小装置。
  4. 請求項3に記載の縮小装置において、
    入力画像を分割した小領域に含まれる画素を、主走査方向に連続した任意の数の画素を含む複数のサンプリング領域で区分し、そのサンプリング領域毎に画素値を集計するために、サンプリング合計カウンタを設け、
    前記制御部は、
    サンプリング領域ごとに集計された画素値とそのサンプリング領域に含まれる画素数により、サンプリング領域における画素値の平均値を求め、
    前記途中結果バッファは、
    サンプリング領域における画素値の平均値を累積した、同一小領域内の画素値の合計を、小領域単位で保持することを特徴とする画像データの縮小装置。
JP2004096463A 1996-10-30 2004-03-29 画像データの縮小装置及び方法 Expired - Fee Related JP3962029B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2004096463A JP3962029B2 (ja) 1996-10-30 2004-03-29 画像データの縮小装置及び方法

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP30384496 1996-10-30
JP35878696 1996-12-27
JP2004096463A JP3962029B2 (ja) 1996-10-30 2004-03-29 画像データの縮小装置及び方法

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP27809197A Division JP3865165B2 (ja) 1996-10-30 1997-09-24 画像データの拡大/縮小方法

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2007062458A Division JP4069300B2 (ja) 1996-10-30 2007-03-12 画像データの拡大装置

Publications (2)

Publication Number Publication Date
JP2004288198A JP2004288198A (ja) 2004-10-14
JP3962029B2 true JP3962029B2 (ja) 2007-08-22

Family

ID=33303581

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004096463A Expired - Fee Related JP3962029B2 (ja) 1996-10-30 2004-03-29 画像データの縮小装置及び方法

Country Status (1)

Country Link
JP (1) JP3962029B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101375662B1 (ko) 2007-08-06 2014-03-18 삼성전자주식회사 이미지 데이터 압축 방법 및 장치
CN115239561B (zh) * 2022-07-25 2023-04-18 广东保伦电子股份有限公司 一种图像缩小下防止图像剪切现象的处理方法及处理终端
CN116863861B (zh) * 2023-09-05 2023-11-24 欣瑞华微电子(上海)有限公司 基于非显性点判断的图像处理方法、设备及可读存储介质

Also Published As

Publication number Publication date
JP2004288198A (ja) 2004-10-14

Similar Documents

Publication Publication Date Title
JP3865165B2 (ja) 画像データの拡大/縮小方法
EP0336776B1 (en) Image magnification
US7043091B2 (en) Method and apparatus for increasing spatial resolution of an image
JPH05334427A (ja) 画像の拡大縮小方法
JP2009049562A (ja) 画像処理装置、方法およびプログラム
JP4947351B2 (ja) 画像処理装置、及び、プログラム
JP3962029B2 (ja) 画像データの縮小装置及び方法
JP2001028051A (ja) 画像処理装置、画像処理方法、及び画像処理プログラム記録媒体
JP4069300B2 (ja) 画像データの拡大装置
US8902474B2 (en) Image processing apparatus, control method of the same, and program
JP2885999B2 (ja) 画像処理装置及びその方法
JP4156194B2 (ja) 第1の解像度のラスタのデジタルデータを第2の解像度のデジタルデータに変換する方法
JP2000187726A (ja) デ―タ補間方法および装置及び記憶媒体
JP4265363B2 (ja) 画像処理装置
JP4517288B2 (ja) 画像処理装置、画像処理方法及びそのプログラム
JP2780405B2 (ja) デジタル画像処理装置
JP3760634B2 (ja) 画像処理装置、画像処理方法および記録媒体
JP2009122841A (ja) 画像一覧イメージ構築装置、記録媒体及び画像形成装置
JP4517287B2 (ja) 画像処理装置、画像処理方法及びそのプログラム
JP2906717B2 (ja) 画像変倍方法
JP2641392B2 (ja) デジタルハーフトーンスクリーン生成方法および装置
JP3517982B2 (ja) 図形描画装置
JPH0668247A (ja) ディジタル画像データ変倍方法および装置
JPH05236257A (ja) デジタル画像処理装置
JP2857260B2 (ja) 矩形領域の判定方法

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20061220

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070109

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070308

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20070417

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20070517

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100525

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110525

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120525

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130525

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140525

Year of fee payment: 7

LAPS Cancellation because of no payment of annual fees