(57)【要約】      （修正有）【解決手段】入力画像を複数の小領域に区分し、小領域間の境界上の入力画素を一定規則でいずれかの小領域に含ませ、各小領域内の出力画素に基づいて出力画素の画素値を演算する。演算は小領域内の入力画素を所定の間隔でサンプリングして得た画素値をもとに行う。【効果】少ないメモリで入力画像の縮小処理を行う。【選択図】図２９
2004288198.tif 000002
【特許請求の範囲】
【請求項１】
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像データを生成する画像データの拡大／縮小方法において、
前記入力画像データを小領域に分割し、小領域に含まれる入力画素と小領域の境界上の入力画素とを区別して認識し、前記小領域内の入力画素値と認識された境界上の入力画素値とに基づいて小領域内の入力画素値を演算して出力画素値を求めることを特徴とする画像データの拡大／縮小方法。
【請求項２】
請求項１記載の画像データの拡大／縮小方法において、
前記入力画素値の演算は、前記小領域内の入力画素を所定の間隔でサンプリングして得られた入力画素値により行われることを特徴とする画像データの拡大／縮小方法。
【請求項３】
請求項２記載の画像データの拡大／縮小方法において、
前記小領域内の入力画素をサンプリングするサンプリング領域を指定し、サンプリング領域内の画素値を演算することにより出力画素値を求めることを特徴とする画像データの拡大／縮小方法。
【請求項４】
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像を生成する画像データの拡大／縮小装置において、
前記入力画像を複数の入力画素を含む小領域に区分し、隣接する小領域間を仕切る境界線上に位置する入力画素を検知して該入力画素を含むいずれかの小領域を一定条件に基づいて決定する境界線画素判定手段と、
前記各小領域に含まれる複数の入力画素の各画素値に基づいて出力画素の画素値を演算する画素値演算手段と、
を有することを特徴とする画像データの拡大／縮小装置。
【請求項５】
請求項４記載の画像データの拡大／縮小装置において、
前記画素値演算手段は、前記小領域の複数の入力画素をサンプリングし、サンプリングした入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの拡大／縮小装置。
【請求項６】
請求項５記載の画像データの拡大／縮小装置において、
前記画素値演算手段は、前記小領域にサンプリング領域を設定し、該サンプリング領域内の入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの拡大／縮小装置。
【請求項７】
入力画像を、主走査方向に平行な境界と副走査方向に平行な境界により小領域に等分割し、各領域中に含まれる画素の画素値を平均して出力画素の画素値を求めることにより、入力画像を縮小した出力画像を得るものにおいて、
入力画像を構成する画素の画素値を主走査方向にみて１ライン分受け入れて保持する入力画像バッファと、
前記入力画像バッファに受け入れた各画素の画素値を主走査方向に順に累積していき、副走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた、同一小領域内の画素値の合計を、小領域単位で保持する途中結果バッファと、
副走査方向に１ライン分ずつ入力画像を処理していき、主走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた各小領域内の画素値の合計を、途中結果バッファから読みだして、各小領域に含まれる画素数で割って、小領域毎の画素値の平均値を求め、その平均値を出力画像の画素の画素値とする制御部を備えたことを特徴とする画像データの拡大／縮小装置。
【請求項８】
請求項７に記載の拡大／縮小装置において、
入力画像を分割した小領域に含まれる画素のうちの一部をサンプリングして、それらの画素値を集計するために、サンプリングの間隔を設定して保持するパラメータ保持部を設け、
途中結果バッファは、
前記パラメータ保持部を参照して、サンプリング間隔ごとに画素値を集計して保持することを特徴とする画像データの拡大／縮小装置。
【請求項９】
請求項８に記載の拡大／縮小装置において、
入力画像を分割した小領域に含まれる画素を、主走査方向に連続した任意の数の画素を含む複数のサンプリング領域で区分し、そのサンプリング領域毎に画素値を集計するために、サンプリング合計カウンタを設け、
制御部は、
サンプリング領域ごとに集計された画素値とそのサンプリング領域に含まれる画素数により、サンプリング領域における画素値の平均値を求め、
途中結果バッファは、
サンプリング領域における画素値の平均値を累積した、同一小領域内の画素値の合計を、小領域単位で保持することを特徴とする画像データの拡大／縮小装置。
【請求項１０】
処理対象となる整数値を実数倍した乗算結果のうちの小数点以下Ｎ桁の数値を保持する第１の記憶部と、
前記実数の少数点以下Ｎ桁の数値を記憶する第２の記憶部と、
前記第１の記憶部に格納された数値と第２の記憶部に格納された数値とを比較し、
前者の数値が後者の数値以上のときは、前記乗算結果の整数部分を演算結果として出力し、前者の数値が後者の数値に満たないときは、前記乗算結果の少数点以下を切り上げた結果を演算結果として出力する演算部を備えたことを特徴とする整数倍率演算器。
【請求項１１】
入力画像中の各画素の座標値と、入力画像の拡大倍率を表す実数との積を求めて、この積の結果を越えない整数を、当該画素のコピー回数に決定して、出力画像データを得るものにおいて、
前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、
前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、
前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記コピー回数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記コピー回数に決定する倍率計算部を備えたことを特徴とする画像データの拡大／縮小装置。
【請求項１２】
入力画像を所定の実数倍率で拡大して出力画像を得て、入力画素を出力画像上にマッピングし、マッピングされた出力画素によって作られる矩形の領域を近傍エリアとして、
前記近傍エリアに含まれる、出力画素の座標軸方向に並んだ出力画素の数を求める場合に、
前記近傍エリアの出力画像中の位置を示す座標値と、前記拡大倍率との積を求めて、この積の結果を越えない整数を、該当する近傍エリア中の前記出力画素の数に決定するものにおいて、
前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、
前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、
前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記出力画素の数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記出力画素の数に決定する倍率計算部を備えたことを特徴とする画像データの拡大／縮小装置。
【請求項１３】
請求項１２に記載の拡大／縮小装置において、
倍率計算部の出力の初期値を予め設定した定数としたことを特徴とする画像データの拡大／縮小装置。
【請求項１４】
入力画像中の各画素の座標値と、入力画像の拡大倍率を表す実数との積を求めて、この積の結果を越えない整数を、当該画素のコピー回数に決定して、出力画像データを得るものにおいて、
前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、
前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、
前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記コピー回数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記コピー回数に決定する倍率計算部と、
出力画像の端部が印字可能領域をはみ出る場合に、出力画像の端部の拡大倍率を印字可能領域の情報に基づいて演算し、前記コピー回数の初期値とするクリッピング計算装置を備えたことを特徴とする画像データの拡大／縮小装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置を用いて表示したり印刷したりする画像データを、任意の倍率で拡大しあるいは縮小するために利用される、画像データの拡大／縮小装置及び方法に関する。
【背景技術】
【０００２】
パーソナルコンピュータやプリンタ、その他各種の情報処理装置において、画像データの解像度が相違するアプリケーション間で画像データを転送する場合には、画素数を増減して解像度を調整する画像データの拡大／縮小処理が行われる。また、画素数の多い画像データをメモリに記憶する場合、メモリの記憶容量削減のために、画素数を減少させる画像データの縮小処理が行われる。画像データを通信線を介して送受信する場合の送信速度スピードアップを図るためにも、画素数を減少させる画像データの縮小処理を行う場合がある。
【０００３】
ここで、例えば、画像データの縦横の画素数をそれぞれ整数倍に拡大する場合には、各画素をその倍率分だけ縦横方向にコピーして画素数を増やす。従って、例えば各画素はＸ方向にＮ倍、Ｙ方向にＭ倍だけコピーされてＮ×Ｍ倍の画素から成る画像データが得られる。
一方、１．５倍とか２．５倍というように、いずれかの方向に整数倍にならない倍率で拡大／縮小を行う場合には、コピーをして数を増やす画素と、コピーをしない画素を適当に混在させる。
【０００４】
画素をコピーする場合、同一の画素値の画素を隣に増やしていく方法がもっとも単純な方法である。しかしながら、それでは、中間調を表現する画像の場合に、不自然な濃淡が発生して、画質が劣化する。特に、整数倍にならない倍率で画像データの拡大／縮小を行う場合に、その傾向が著しい。
そこで、出力画像中のコピーによって増加した画素の画素値が互いに滑らかに変化するように、周辺の複数の画素を参照しながら適当な演算処理を行う。この方法は、リサンプリング処理と呼ばれ、各画素の画素値の計算には一次補間法や最近傍法等が採用される。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ところで、上記のような従来の技術には、次のような解決すべき課題があった。
上記のようにして、入力する画像データをＸ軸方向やＹ軸方向に任意の実数倍率、即ち整数倍でない倍率で拡大／縮小処理しようとするときには、一次補間法や最近傍法による画素値の計算が行われる。このとき、予め画素値を求めるべき出力画素の周辺に存在する入力画素の画素値を、計算に利用できるように、準備しておかなければならない。従って、画像データをほぼ１ページ分あるいは画素値の参照に必要な分だけ読み取って、バッファメモリに予め格納し、その後再び同じ画像データを順に受け入れて処理をする必要がある。これでは、画像データをそのまま逐次処理をして出力を得るというわけにはいかない。
従って、従来の技術には、各種のシステムにおいてメモリを効率的に使用するという目的に反し、また処理時間も長くなるという問題があった。
【課題を解決するための手段】
【０００６】
本発明は以上の点を解決するため次の構成を採用する。
〈構成１〉
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像データを生成する画像データの拡大／縮小方法において、前記入力画像データを小領域に分割し、小領域に含まれる入力画素と小領域の境界上の入力画素とを区別して認識し、前記小領域内の入力画素値と認識された境界上の入力画素値とに基づいて小領域内の入力画素値を演算して出力画素値を求めることを特徴とする画像データの拡大／縮小方法。
【０００７】
〈構成２〉
構成１において、前記入力画素値の演算は、前記小領域内の入力画素を所定の間隔でサンプリングして得られた入力画素値により行われることを特徴とする画像データの拡大／縮小方法。
【０００８】
〈構成３〉
構成２において、前記小領域内の入力画素をサンプリングするサンプリング領域を指定し、サンプリング領域内の画素値を演算することにより出力画素値を求めることを特徴とする画像データの拡大／縮小方法。
【０００９】
〈構成４〉
入力画像データを形成する複数の入力画素を所定の倍率で複数の出力画素に縮小して出力画像を生成する画像データの拡大／縮小装置において、前記入力画像を複数の入力画素を含む小領域に区分し、隣接する小領域間を仕切る境界線上に位置する入力画素を検知して該入力画素を含むいずれかの小領域を一定条件に基づいて決定する境界線画素判定手段と、前記各小領域に含まれる複数の入力画素の各画素値に基づいて出力画素の画素値を演算する画素値演算手段と、を有することを特徴とする画像データの拡大／縮小装置。
【００１０】
〈構成５〉
構成４において、  前記画素値演算手段は、前記小領域の複数の入力画素をサンプリングし、サンプリングした入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの拡大／縮小装置。
【００１１】
〈構成６〉
構成５において、前記画素値演算手段は、前記小領域にサンプリング領域を設定し、該サンプリング領域内の入力画素に基づいて前記出力画素の画素値を演算することを特徴とする画像データの拡大／縮小装置。
【００１２】
〈構成７〉
入力画像を、主走査方向に平行な境界と副走査方向に平行な境界により小領域に等分割し、各領域中に含まれる画素の画素値を平均して出力画素の画素値を求めることにより、入力画像を縮小した出力画像を得るものにおいて、
入力画像を構成する画素の画素値を主走査方向にみて１ライン分受け入れて保持する入力画像バッファと、
前記入力画像バッファに受け入れた各画素の画素値を主走査方向に順に累積していき、副走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた、同一小領域内の画素値の合計を、小領域単位で保持する途中結果バッファと、
副走査方向に１ライン分ずつ入力画像を処理していき、主走査方向に平行な境界の手前で、この境界に最も近い境界画素を検出したときまでに求められた各小領域内の画素値の合計を、途中結果バッファから読みだして、各小領域に含まれる画素数で割って、小領域毎の画素値の平均値を求め、その平均値を出力画像の画素の画素値とする制御部を備えたことを特徴とする画像データの拡大／縮小装置。
【００１３】
〈構成８〉
構成７において、入力画像を分割した小領域に含まれる画素のうちの一部をサンプリングして、それらの画素値を集計するために、サンプリングの間隔を設定して保持するパラメータ保持部を設け、途中結果バッファは、前記パラメータ保持部を参照して、サンプリング間隔ごとに画素値を集計して保持することを特徴とする画像データの拡大／縮小装置。
【００１４】
〈構成９〉
構成８において、入力画像を分割した小領域に含まれる画素を、主走査方向に連続した任意の数の画素を含む複数のサンプリング領域で区分し、そのサンプリング領域毎に画素値を集計するために、サンプリング合計カウンタを設け、制御部は、サンプリング領域ごとに集計された画素値とそのサンプリング領域に含まれる画素数により、サンプリング領域における画素値の平均値を求め、途中結果バッファは、サンプリング領域における画素値の平均値を累積した、同一小領域内の画素値の合計を、小領域単位で保持することを特徴とする画像データの拡大／縮小装置。
【００１５】
〈構成１０〉
処理対象となる整数値を実数倍した乗算結果のうちの小数点以下Ｎ桁の数値を保持する第１の記憶部と、前記実数の少数点以下Ｎ桁の数値を記憶する第２の記憶部と、前記第１の記憶部に格納された数値と第２の記憶部に格納された数値とを比較し、前者の数値が後者の数値以上のときは、前記乗算結果の整数部分を演算結果として出力し、前者の数値が後者の数値に満たないときは、前記乗算結果の少数点以下を切り上げた結果を演算結果として出力する演算部を備えたことを特徴とする整数倍率演算器。
【００１６】
〈構成１１〉
入力画像中の各画素の座標値と、入力画像の拡大倍率を表す実数との積を求めて、この積の結果を越えない整数を、当該画素のコピー回数に決定して、出力画像データを得るものにおいて、前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記コピー回数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記コピー回数に決定する倍率計算部を備えたことを特徴とする画像データの拡大／縮小装置。
【００１７】
〈構成１２〉
入力画像を所定の実数倍率で拡大して出力画像を得て、入力画素を出力画像上にマッピングし、マッピングされた出力画素によって作られる矩形の領域を近傍エリアとして、前記近傍エリアに含まれる、出力画素の座標軸方向に並んだ出力画素の数を求める場合に、前記近傍エリアの出力画像中の位置を示す座標値と、前記拡大倍率との積を求めて、この積の結果を越えない整数を、該当する近傍エリア中の前記出力画素の数に決定するものにおいて、前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記出力画素の数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記出力画素の数に決定する倍率計算部を備えたことを特徴とする画像データの拡大／縮小装置。
【００１８】
〈構成１３〉
構成１２において、倍率計算部の出力の初期値を予め設定した定数としたことを特徴とする画像データの拡大／縮小装置。
【００１９】
〈構成１４〉
入力画像中の各画素の座標値と、入力画像の拡大倍率を表す実数との積を求めて、この積の結果を越えない整数を、当該画素のコピー回数に決定して、出力画像データを得るものにおいて、前記積の結果のうち、小数点以下Ｎ桁により表される数値のみを保持し、小数点以上の数値をオーバーフローさせて無効にするレジスタを備え、前記積を求める演算を実行する度にこのレジスタに保持される数値と、前記拡大倍率を表す実数の少数点以下Ｎ桁により表される数値とを比較して、前者が後者以上のときは、前記積の結果のうち少数点以下を切り捨てた値を前記コピー回数に決定し、前者が後者未満のときは、前記積の結果の少数点以下を切り上げた値を前記コピー回数に決定する倍率計算部と、出力画像の端部が印字可能領域をはみ出る場合に、出力画像の端部の拡大倍率を印字可能領域の情報に基づいて演算し、前記コピー回数の初期値とするクリッピング計算装置を備えたことを特徴とする画像データの拡大／縮小装置。
【発明の効果】
【００２０】
本発明によれば、入力画像を小領域に区分し、小領域間の境界上の入力画素を一定規則でいずれかの小領域に含ませた上で各小領域毎に入力画素に基づいて出力画素値を演算するようにしたので、少ないメモリで入力画像の縮小処理を行うことができる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の実施の形態を具体例を用いて説明する。
〈具体例１〉
図１は、具体例１による拡大／縮小処理部の動作説明図である。
図の（ａ）は本発明の方法に使用する拡大／縮小テーブルを示し、（ｂ）は入力画像データと出力画像データとを示している。
例えば入力画像データ３のＸ方向には（ｘ２／ｘ１）倍、Ｙ方向には（ｙ２／ｙ１）倍に画像を拡大するとき、図の（ｂ）に示すように、各画素をそれぞれＸ方向とＹ方向に所定の回数コピーする。画素値はそのままでコピーする。コピーする画素数は入力画像の画素の位置によって異なる。こうして、整数倍でない倍率の拡大を実現する。ここで、こうした拡大／縮小処理を効率良く実行するために、各画素毎の該当する方向の倍率を示す拡大／縮小テーブルを用意する。
【００２２】
図１の（ａ）に示した左側のテーブルがＸ方向の倍率を示し、右側のテーブルはＹ方向の倍率を示す。例えば入力画像データの第０列、第０行の画素、即ち（ｂ）に１番と番号表示した画素は、これらのテーブルを参照すると、Ｘ方向に２倍、Ｙ方向に３倍だけコピーされる。入力画像データの２行目の４番と番号表示した画素はＸ方向に２倍、Ｙ方向に４倍コピーされる。
画像データは通常ビットストリームとして扱われ、１画素分ずつＸ軸方向（主走査方向）に処理し、その処理をＹ軸方向（副走査方向）に繰り返す。以上のような拡大／縮小テーブルを新たに設けたのは、入力画像データ３をこのように走査方向にシリアルに受け入れて、そのまま順に拡大／縮小処理することを可能にするためである。
【００２３】
図２には、具体例１による画像データ拡大／縮小装置のブロック図を示す。
図の装置は、外部記憶装置５に記憶された入力画像データを受け入れて、この画像データを拡大処理あるいは縮小処理するための装置である。拡大／縮小装置６には、現ラインバッファ７、拡大／縮小テーブル８、拡大／縮小処理部９及び出力画像フレームバッファ１１が設けられている。現ラインバッファ７は、外部記憶装置５から走査方向に入力した画像データを１ラインずつ格納し保持するためのメモリである。拡大／縮小テーブル８には、図１（ａ）に示したＸ方向の倍率テーブル１ＸやＹ方向の倍率テーブル１Ｙ等が格納されている。拡大／縮小処理部９は、拡大／縮小テーブル８を参照しながら図１（ｂ）に示したような拡大／縮小処理を行う部分である。拡大／縮小処理後の画像データは、出力画像フレームバッファ１１に格納される。出力画像フレームバッファ１１には図示しない外部装置が接続され、そこに拡大／縮小された画像データが転送される。
【００２４】
ここで、画像データを整数倍で格納した場合と、整数倍以外の倍率で格納した場合とを比較して説明する。
図３に、整数倍率の拡大法説明図を示す。
図に示すように、例えばオリジナルの画素２が存在する場合、Ｘ方向に２倍、Ｙ方向に２倍の拡大を行おうとすれば、図の（ｂ）に示すようになる。また、Ｘ方向に３倍、Ｙ方向に３倍の拡大を行おうとすれば（ｃ）に示すようになり、Ｘ方向に４倍、Ｙ方向に４倍の拡大を行おうとすれば（ｄ）に示すようになる。もちろん、Ｘ方向とＹ方向の倍率を自由に変更しても同様の結果となる。整数倍ではすべての入力画素にこれと同一の処理を施す。
【００２５】
一方、図４には、最近傍法による拡大／縮小処理説明図を示す。
この例では、Ｘ方向とＹ方向と、それぞれ任意の実数倍率で画像データを拡大するために、画素毎にそのコピー倍率を変えている。例えば、図に示す(1)の画素は出力画像データ４において、Ｘ方向に３倍、Ｙ方向に２倍になるようにコピーされている。また、(2)の画素は、Ｘ方向に２倍、Ｙ方向に２倍となるようコピーされている。更に(5)の画素は、Ｘ方向に３倍、Ｙ方向に３倍となるようにコピーされている。こうした組合せによって、全体として例えば１．２倍とか２．３倍といった拡大処理が可能となる。縮小処理としては、例えば出力画像データ４から入力画像データ３の方向への縮小が考えられる。このような場合には、１個の出力画素を得るたびに、続く画素をＸ方向に何個、Ｙ方向に何個間引くかといった処理となる。
【００２６】
本発明の具体例１による処理では、入力画像データが図の(1)、(2)、(3)、…という順にシリアルに入力した場合に、直ちに出力画像データ４を得ることができるように図１（ａ）に示す拡大／縮小テーブルを用意した。
【００２７】
図５には、図２に示す装置の動作即ち具体例１の拡大／縮小方法を示すフローチャートを図示した。
まず、ステップＳ１において、拡大／縮小テーブルの作成を行う。これは拡大／縮小倍率を元に、予め経験的に得られたデータに従ってテーブルの作成を行う処理である。なお、このようなテーブルの内容は、各拡大／縮小倍率毎に予め用意されていてもよいし、その都度計算して作成されるようにしてもよい。また、オペレータが任意の適当な手段で作成し、情報処理装置のメモリ等に格納するようにしてもよい。
【００２８】
次のステップＳ２において、図２に示す外部記憶装置５から現ラインバッファ７に対し１ライン分のデータ（ビットストリーム）が読み込まれる。次のステップＳ３では、拡大／縮小処理部９は、拡大／縮小テーブルの縦方向、即ちＹ方向の倍率テーブルを参照する。更に、ステップＳ４において、横方向、即ちＸ方向の倍率テーブルを参照する。こうして、Ｘ方向とＹ方向の画素のコピー回数を認識すると、ステップＳ５において、入力画像の各画素についてドットコピーが行われる。ドットコピーというのは、同一の画素値のドットを縦方向や横方向にコピーして、必要な数だけ増加させることをいう。次にステップＳ６において、横方向倍率分をコピーしたかどうかを判断する。こうして、入力画素をＸ方向にテーブルで指定された数だけコピーする。
【００２９】
次に同様の処理をＸ方向に順に行うために、ステップＳ７において、現ラインバッファ７中の全ての画素について処理をしたかどうかを判断する。こうして、ステップＳ４、Ｓ５、Ｓ６が現ラインバッファ７中の画素数分繰り返される。その処理が終了すれば、ステップＳ７からステップＳ８に進み、出力画像の次のラインの処理に進む。即ち、ステップＳ４、Ｓ５、Ｓ６、Ｓ７の処理が、Ｙ方向の倍率テーブル分だけ繰り返される。この処理が終了すれば、入力画像データ１ライン分のＸ方向とＹ方向の拡大処理を終了する。そして、ステップＳ８から次のステップＳ９に進み、入力画像データの次のラインについて拡大／縮小処理を実行する。
ステップＳ２〜ステップＳ９の処理を入力が画像データのライン数分繰り返すことによって、入力画像データ全ての画素についての拡大／縮小処理を終了する。
【００３０】
〈具体例１の効果〉
以上のように、任意の方向に任意の拡大／縮小倍率が設定されている場合に、その方向毎に各画素の拡大／縮小倍率を表示したテーブルを用意すると、入力する画像データを走査方向にシリアルに受け入れながら、順番に拡大／縮小処理を行うことが可能になる。即ち、演算処理の前に、予め入力画像データを１ページ分バッファメモリに格納しておくといった処理を必要とせず、限られたメモリ資源を有効に活用することができる。しかも、画像処理中にはテーブル参照だけで拡大／縮小処理を行うことが可能だから、処理の高速化が実現する。
【００３１】
なお、上記の例では拡大を行うケースのみを示したが、拡大／縮小テーブルの、Ｘ方向の倍率の部分にゼロを表示すればその画素は削除され、Ｙ方向の倍率の部分にゼロを表示すれば、そのラインは削除されるといった規則にすることによって、画素やラインを間引く縮小も容易に行える。また、上記拡大／縮小テーブルは、任意の方向に画素数を何倍拡大するかあるいは縮小するかといった情報を示すようなデータであればよく、その表現方法や構成は自由にして差し支えない。
【００３２】
〈具体例２〉
上記の具体例１では、各入力画素に割り振る整数倍率を拡大／縮小テーブルの形で保持することから、倍率や入力画像サイズによってはテーブルのデータ量が比較的大きくなる。この具体例２では、テーブルのデータ量を縮小する方法を提供する。
図６に、モジュロ演算を用いる画像拡大／縮小装置のブロック図を示す。
図の装置は、図２に示した具体例１の装置の拡大／縮小装置６の部分に、倍率演算部１３を設けた点を特徴とする。この倍率演算部１３には、拡大／縮小テーブル８とモジュロ演算部１０が設けられる。なお、この拡大／縮小テーブル８の内容は具体例１の場合と異なり、十分に縮小された内容となる。
【００３３】
図７に、拡大／縮小テーブルの冗長性の説明図を示す。
（ａ）は、例えば図１に示したＸ方向の倍率テーブル１Ｘ、あるいはＹ方向の倍率テーブル１Ｙを示す。インデックス（Ｉｎｄｅｘ）は、列番号または行番号のいずれかを示す。図の（ａ）の倍率テーブル１Ｘは、例えば横方向に整数倍（ここでは４倍）の拡大を行うことを示している。しかしながら、このテーブルでは、全ての画素の倍率が４であるから、画素数分の同一内容の倍率表示データがメモリに格納されることになり、実質的に極めて冗長である。（ｂ）には、１．５倍の倍率にしたときのテーブルの内容を示す。この場合、各画素の倍率は１，２，１，２，…というように１と２を交互に繰り返す内容となる。このような規則性のあるデータを全てメモリに保持しておくことも冗長であり、資源の有効利用を妨げる。
【００３４】
そこで、こうした拡大／縮小テーブルを演算によって求める。即ち、画像データ中の各画素の位置と拡大／縮小倍率との規則的な対応関係を考慮して、画素毎の倍率を演算処理により求める。こうすれば、そのデータを使用して直ちに拡大／縮小処理をすることもできるし、またいったんその演算処理によって拡大／縮小テーブルを生成し、その後、実際の拡大／縮小処理をしてもよい。いずれの場合においても、拡大倍率ごとに作成した大量の拡大／縮小テーブルデータを、メモリ内部に予め全て保持しておく必要がないという効果がある。
【００３５】
図８のモジュロ演算は、割り算の余りを求める計算である。図の左端にはライン番号を表示した。第０番目のラインは０、１番目のラインは１というように演算値を設定する。そして、これを２で割って余りを求めるモジュロ演算処理を％で表すことにする。このようにすると、図に示すように、０番目のラインについては演算結果は０、１番目のラインについては演算結果が１、２番目のラインについては演算結果が０というように、交互に０，１，０，１という演算結果が得られる。一方、図の（ｂ）に示すように、例えば１．５倍の拡大を行うような場合、インデックスが０のときは１倍、インデックスが１のときは２倍というテーブルを用意する。これで、モジュロ演算結果によりライン毎に画素を何倍するかというデータが得られる。
以上のようにして、図８（ｂ）に示すような少量のテーブルデータで、全ての拡大／縮小処理が可能となる。
【００３６】
図９に、具体例２の拡大／縮小方法動作フローチャートを示す。
この動作は、既に図５を用いて説明した具体例１の場合と類似している。まずステップＳ１において、拡大／縮小テーブルの作成を行う。そのテーブルの構成は、図８を用いて説明した通りのものである。次に、ステップＳ２において、１ライン分のデータを読み込み、ステップＳ３において、図８の（ａ）に示したようなモジュロ演算を実行する。そして、その結果をインデックスとし、拡大／縮小テーブルを参照する。この処理はステップＳ３では縦方向について行い、ステップＳ４では横方向について行う。そして、ステップＳ５において、テーブルで指示された通りドットコピーを行い、ステップＳ６では横方向倍率分コピーが終了したかどうかを判断し、ステップＳ７では入力画像ライン幅分コピーを終了したかを判断する。そして、ステップＳ８で、縦方向倍率分コピーしたかを判断し、１ライン分の処理が終了するとステップＳ９に移り、全ての入力ライン数分処理したかどうかの判断がされる。こうして、それぞれのループを処理し、全ての入力画像データについて拡大／縮小処理を行う。
【００３７】
以上のように、ステップＳ３とＳ４で、拡大／縮小テーブルを参照するべき処理のたびにモジュロ演算を実行し、該当部分（テーブルの一部）のテーブルを生成しながら処理をすると、拡大／縮小テーブルデータ全体を保持しておく必要がない。また、ステップＳ１でモジュロ演算を実行して、拡大／縮小テーブル全体を生成してもよい。少なくとも、こうした処理が要求される直前に拡大／縮小テーブルを生成するようにすれば、拡大倍率ごとにテーブル全体をメモリに保存しておく場合に比べて、十分にテーブル保存用メモリの節約ができる。
【００３８】
〈具体例２の効果〉
この例では、入力画像データの全ての画素について、それぞれ例えばＸ方向に何倍、Ｙ方向に何倍といった表示をテーブルデータとして保持しなくても、各画素を拡大／縮小方向に見て、その入力画像データ中の各画素の位置と拡大／縮小倍率との間に規則的な対応関係が存在する場合、演算処理によって拡大／縮小テーブルを生成して参照することができる。従って、予めメモリに保存しておくべき拡大／縮小テーブルのサイズを十分少なくし、記憶容量の削減を図ることができる。
【００３９】
〈具体例３〉
図１０に、具体例３による拡大／縮小装置のブロック図を示す。
この装置は、これまでの具体例の、拡大／縮小装置６の部分に、前ラインバッファ７Ａと現ラインバッファ７Ｂの２ライン分のバッファを設ける。そしてさらに、これから説明する一次補間処理を行うための、一次補間拡大／縮小処理部１６を設ける。
【００４０】
図１１に、従来から画像の拡大／縮小処理に採用されていた画素値補正のためのリサンプリングの説明図を示す。また、図１２に、正方格子の説明図を示す。なお、正方格子というのは、縦横の各辺の長さは自由で、いわゆる矩形の頂点に画素が配置されたものをいう。従って、必ずしも４辺が等しい正方形でなくてよく、長方形であってもさしつかえない。
図１１の入力画像データ３を拡大処理したものを出力画像データ４とする。拡大処理をすると、入力画素の各画素の間隔と出力画素の各画素の間隔とは、必ずしも一致しない。また、画像中の対応する画素の位置も正確には一致しないことがある。この場合に、出力画像データ４の各画素の画素値は、出力画像の画質を劣化させないために、次のようにして演算処理をして変換する。
【００４１】
まず、出力画像データ４の各画素が、入力画像データ３中のどの位置にあるべき画素かを求める。この場合に、図１２に示すように、Ｘ点の出力画素は、Ａ、Ｂ、Ｃ、Ｄ点の入力画素の正方格子に囲まれた位置にあるものとする。このとき、Ａ、Ｂ、Ｃ、Ｄ点の４つの画素の画素値と、Ｘ点とＡ、Ｂ、Ｃ、Ｄ点との距離の関係から、適切な画素値を演算処理し、これをＸ点の画素の画素値とする。
【００４２】
図１３は、一次補間の一般的計算法説明図である。
例えば、図１２に示すように、×印の点に出力画素が存在したとする。このとき、×点の上辺からの距離をｑ、左辺からの距離をｐとする。ｐとｑはいずれも０と１の間の小数で表す。このとき、×印の点の画素の出力値は図１３（ａ）に示す式で表される。ここで、（ｂ）に示すように、出力画素Ｆの出力画像上の座標と、入力画素Ａの入力画像上の座標と、画像の拡大図をそれぞれ設定すると、ｐ，ｑ及び各座標値や拡大率との関係は（ｃ）式に示すようになる。
このような処理をしようとすれば、予め処理対象となる画素の周辺の入力画像データを全てバッファメモリに格納した上で、出力画像データの画素値を演算処理する必要がある。
【００４３】
図１４には、具体例３による一次補間の説明図を示す。
この具体例では、例えば具体例１を実施して、入力画像データ３をＸ軸方向に４倍、Ｙ軸方向に３倍に拡大している。このとき、各画素数を増加させて得られた出力画像データ４の４×３画素のブロック（図中太い黒線の枠で囲んだマトリクス）中で、例えば右下端の画素が正方格子上の画素であると定義する。この画素を図では黒く塗りつぶしてある。
【００４４】
例えば入力画像データ３のＸ＝３，Ｙ＝２の座標にある黒く塗りつぶした画素は、出力画像データ４のＸ＝１２，Ｙ＝６の座標にコピーされる。この画素を含むブロック中の各画素の画素値は、図に示すように塗りつぶした周囲４画素の画素値を用いて一次補間する。入力画像中で隣同士にあった画素の間に追加した新たな画素の画素値を、もともと隣同士にあった画素の間で滑らかに変化させて、高画質の出力画像を得るためである。
【００４５】
ここで、前ラインと現ラインの２ライン分の画像データ、即ち、入力画像データ３のハッチングを付した画素と黒く塗りつぶした画素の４個分の画素値を保持していれば、太い黒い線で囲んだ枠の中の、１２個分の画素全てについて、その画素値を演算処理することが可能になる。その演算式は図の（ｂ）に示した。各記号の意味はその下に示す通りである。
【００４６】
図１５に、具体例３による一次補間の処理例説明図を示す。
ここには、上記の定義に従って実際に各画素に画素値を与えた場合の演算処理結果を数値で示した。入力画像は、格子点の画素の画素値が例えば“０”、“１００”、“５０”及び“２００”という値とする。これを縦３倍横４倍に拡大すると、それぞれの画素値は対応するブロックの右下隅にコピーされる。そして、例えば画素値が“２００”の画素を含むブロックについて、残りの１１個の画素に具体的に一次補間により計算した値を書き込んだ。図の下側には一例として、Ｐ＝２，Ｑ＝２の場合の画素値計算例を図示した。このようにして画素値を計算することによって、画質を低下させずに拡大処理を行うことができる。
【００４７】
図１６には、具体例３の装置の動作フローチャートを示す。
このフローチャートにおいて、ステップＳ１〜ステップＳ４は、図５を用いて説明した具体例１の処理と同様である。即ち、拡大／縮小テーブルを作成し、ラインデータを読み込み、その後拡大／縮小テーブルを参照する。そして、具体例３では、ステップＳ５において、上記の通り説明した一次補間処理を行う。この処理をブロック中の全ての画素について行い、更に走査方向に順に、全てのブロックついて実行する。その他の処理は具体例１と同様である。なお、ブロックの右下隅に入力画素の画素値をコピーしたが、これはシリアルに入力したバッファメモリ中の２ライン分の画像データだけを利用して演算処理できるようにするためである。
なお、こうした効果を得る画素の位置は、各ブロックの４つの角部であればよい。
【００４８】
〈具体例３の効果〉
この具体例によれば、入力画像全体をバッファメモリに読み込んでからでなければ実現が不可能であった一次補間による拡大／縮小処理を、２ライン分のデータをバッファメモリに保持するだけで実行可能になった。これによって、高画質の拡大／縮小処理をバッファメモリの使用量を十分に少なくして実現できる。
【００４９】
〈具体例４〉
図１７は、具体例４の原理説明図である。
ここでは、入力画像データ３の正方格子の座標を出力画像データ４上の座標に変換し、出力画像データ４を対応する正方格子によって作られる領域で分割する。この領域のことを、以下近傍エリアと呼ぶ。この図では、入力画像データ３の破線で囲んだ４つの画素（丸印）によって正方格子を定義したとき、これに対応する近傍エリアを、出力画像データ４の中に実線の四角で書き込んだ。この四角で囲んだ領域を近傍エリアと呼ぶが、ここには図に示すように例えば９個の出力画素（四角印）が含まれる。これらの画素の画素値を入力画像データ３の４個の画素の画素値から上記の一次補間法によって求める。こうすれば、近傍エリアに含まれる各画素の画素値を入力画像データの４つの隣合った画素の画素値のみで求めることができる。従って、バッファメモリへは具体例３と同様に２ライン分程度のデータを格納すればよい。しかも、その演算処理は後で説明するように、これまでよりも更に容易になる。
【００５０】
図１８に、具体例４の装置のブロック図を示す。
この装置の拡大／縮小装置６の部分には、処理対象となるデータを格納するために、ラインバッファ７Ａと７Ｂとを設ける。そして、各ラインバッファ中の演算処理対象となる画素値を指定するために、前行ポインタ１９Ａと現行ポインタ１９Ｂとが設けられる。更に、先に説明した近傍エリアを指定するための近傍エリアテーブル１８が設けられ、一次補間拡大／縮小処理部１６において、近傍エリア内の各画素の画素値を演算処理する。
【００５１】
図１９には、近傍エリアテーブルの説明図を示す。
近傍エリアテーブルは、具体例１で説明した拡大／縮小テーブルと同様に、縦方向の演算処理をするためのものと、横方向の演算処理をするためのものと、それぞれ１個ずつ存在する。縦方向のためのテーブルを近傍エリア縦テーブル、横方向のためのテーブルを近傍エリア横テーブルと呼ぶ。この（ａ）に示す例では、３×３画素の入力画像を５×５画素に拡大している。近傍エリアは、図の出力画像中の破線の格子に示すように設定した。例えば出力画像の左上隅の近傍エリアには１個の画素が存在し、右下隅の近傍エリアには２×２個の画素が存在する。このように、各近傍エリア中の出力画素数を表示するために縦テーブル、横テーブルを設ける。なお、このテーブルの内容は、一般的には図の（ｂ）に示すような式によって求めることができる。なお、図（ｂ）中のＡという記号は入力画像の縦方向の画素数あるいは横方向の画素数を示す。また、Ｂという記号は出力画像の横方向あるいは縦方向の画素数を示す。Ｘという記号は、最初から何番目の近傍エリアかを示すパラメータである。
【００５２】
図２０は、ラインバッファの説明図を示す。
上記のように、装置には拡大／縮小処理の演算処理中２ライン分の画像データが格納される。ラインバッファ７Ａと７Ｂとは、それぞれ交互に新たな１ライン分の入力データを受け入れて格納する。前行ポインタ１９Ａと現行ポインタ１９Ｂは、どちらのラインバッファが先にデータを格納されたものかを示すためのものである。従って、初期値はいずれもラインバッファ７Ａを示している。前行ポインタ１９Ａと現行ポインタ１９Ｂとが指すべきバッファは、例えば図の（ｂ）に示すような演算で求めることができる。これは、先に説明したようなモジュロ演算による。これで、入力画像のどのラインがどのラインバッファに格納されるか明確になる。
【００５３】
図の（ｃ）は、各ラインバッファの構成を示す。各ラインバッファは、実際の入力画像の幅より１画素分だけ大きくしてある。先頭の画素、即ちバッファの最初の要素には、２番目の要素と同じ値が格納される。これは入力画像の幅が１である場合に、そのままでは一次補間を行うための４画素分のデータを用意することができないため、ダミードットを格納するようにしたためである。
【００５４】
図２１には、画像データ格納処理説明図を示す。
以上の構成により、この図に示すように、例えばラインバッファ１７Ａに直前に処理した行が格納され、ラインバッファ１７Ｂに現在処理中の行が格納された状態で処理を進める。ラインバッファ１７Ｂの処理が終了したときには、ラインバッファ１７Ａに次の新たな１ライン分のデータを格納する。従って、現行ポインタ１９Ｂは、今度はラインバッファ１７Ａを指し、前行ポインタ１９Ａがラインバッファ１７Ｂを指すことになる。
【００５５】
図２２に、近傍エリアの拡大図を示す。
上記近傍エリアを、例えば画素値Ａ，Ｂ，Ｃ，Ｄの画素によって構成するとすれば、その近傍エリア中に含まれる実線の四角印の出力画素の画素値Ｆは、この図の中に示すような演算処理によって求められる。この演算処理そのものは一次補間の処理で説明した式と全く同様である。なお、格子の間隔を横方向にα、縦方向にβとした。また、対象となる画素の上辺からの距離をｑ、左辺からの距離をｐとした。ただし、α，βは、画像の拡大率をＸ方向、Ｙ方向それぞれｍｘ，ｍｙとしたときα＝１／ｍｘ，β＝１／ｍｙとすることができる。
【００５６】
図２３に、具体例４の動作フローチャートを示す。
具体例４では、まず既に説明したような横テーブルと縦テーブルの作成をステップＳ１において行う。そして、ステップＳ２において、各ラインバッファの初期化を行う。その後、ステップＳ３においてラインデータを読み込み、ステップＳ４において上記の図２２に示した出力画素値計算を実行する。ステップＳ５では、近傍エリアの横サイズ分を処理したかどうかを判断し、ステップＳ６では、入力画像幅分の処理を終了したかを判断する。ステップＳ６までで１ライン分の処理が終了するとステップＳ７において近傍エリアの縦サイズ分が終了したかどうかの判断をし、これが終了すると、ステップＳ８に進み、バッファを更新する。更に、次のラインに移り、ステップＳ９で入力画像ライン数分が終了したかどうかの判断をして処理を終える。
【００５７】
〈具体例４の効果〉
図２４は、具体例４の計算内容説明図である。
この図を用いて効果を説明する。
以上のようにして、近傍エリア内に含まれた９個の画素の画素値は全てこの図に示すように４個の画素値から計算される。これにより、入力画像を２ライン分だけ保持して、順番にその内容を入れ替えながら処理をすれば、全ての出力画素の画素値を一次補間法によって順に計算処理することが可能になり、使用するメモリ量を十分に減少させることができる。
【００５８】
〈具体例５〉
上記の場合には、各出力画素即ち近傍エリア内に含まれる出力画素について、それぞれ７回の足し算と１０回の掛け算を行うことになる。ところが、これらの位置の規則的な関係を考慮すると、更に演算処理を簡略化することができる。
図２５に、具体例５の装置のブロック図を示す。
この装置は、ラインバッファ３１Ａ，３１Ｂに画素を格納し、具体例４と同様の演算処理を行う一方、更に演算処理を簡略化する。その目的のために、一次補間拡大／縮小処理部４０をここに示すような構成とした。ここにはパラメータ計算装置４１、左端画素値記憶装置４２、加算器４３、ΔＹメモリ４４、ΔＸ１メモリ４５、加算器４６、ΔΔＸメモリ４７、現画素メモリ４８及び加算器４９が設けられている。近傍エリアテーブル３２の出力は、パラメータ計算装置４１に入力する。一次補間拡大／縮小処理部４０の出力は出力画像フレームバッファ３４に格納するように構成されている。
【００５９】
図２６には、ドット間の相関関係説明図を示す。
この具体例５では、ドット間の相関関係を用いて計算を簡略化する。即ち、この図に示すように、例えば近傍エリアの中に先に説明した通りの９個の画素が含められているとする。この場合に、これらの画素の横方向の間隔はΔＸ１、縦方向の間隔はΔＹというように表示できる。このように、各画素の間隔が規則的に一定であることから、左端即ち図に示すＤ１の出力画素の画素値とΔＸ１やΔＹ１を求めておくことによって、順次その右側あるいは下側の画素の画素値を換算処理することが可能になる。即ち、隣合う画素の画素値の差はΔＸ１、ΔＹ、ΔΔＸ等によって求めることが可能になる。この具体例では、その原理を利用して各画素値の演算処理を簡単にした。
【００６０】
図２７は、図２６と同様のドット間の相関関係説明図である。
この図には、この具体例５を用いて行う各画素値の計算式を示した。
図のように、左端の画素Ｂ１の画素値を計算すれば、右方向あるいは縦方向に並んだ各画素の画素値を遥かに簡単な式により演算処理することが可能になる。
【００６１】
図２８には、具体例５の装置の動作フローチャートを示す。
図のステップＳ１において、まず近傍エリア左上端の画素値を計算する。その計算方法は、既に図２７を用いて示した。次に、ステップＳ２において、ΔＸ１の計算を行う。更に、ステップＳ３において、ΔＹの計算を行う。次にステップＳ４において、ΔΔＸの計算を行う。その後ステップＳ５において、出力画素値の設定を行い、ステップＳ６において、出力画素値を更新する。ステップＳ７では、近傍エリアの横サイズ分処理が終了したかを判断し、ステップＳ６，Ｓ７のループを繰り返す。次に、近傍エリアのすぐ下の行を処理する場合ステップＳ８に移り、ΔＸ１を更新し、ステップＳ９において、左端の画素値を更新する。その後、ステップＳ１０において、近傍エリアの縦サイズ分の処理が終了したかどうかを判断し、終了していない場合には、ステップＳ５〜ステップＳ９の処理を繰り返す。これによって、図２７に示す計算処理が完了する。
【００６２】
〈具体例５の効果〉
以上の処理によって、左端の画素について、７回の足し算と１０回の掛け算を実行するが、その他の画素については、それ以下の数回の足し算によってその画素値を求めることができる。これによって、一次補間処理の向上を図ることができる。
【００６３】
〈具体例６〉
図２９は、具体例６の装置のブロック図である。
以下の具体例は画像縮小処理に適するものである。
以下の具体例では、図に示す入力画像５１を主走査方向に平行な境界５１Ｈと副走査方向に平行な境界５１Ｖとによって小領域５１Ｚに等分割する。そして、これらの各小領域５１Ｚ中に含まれる画素の画素値を平均して、出力画素の画素値を求める。この場合に、全ての画素の画素値を実際の処理をする装置側のバッファに保持しようとすると大きなメモリを必要とする。そこで、この図２９に示すような構成とする。
入力画像５１の全ての画素の画素値は外部記憶装置５２に格納されている。これらを処理するために、入力画像バッファ５３、途中結果バッファ５４、制御装置５５、フレームバッファ５７が設けられている。
【００６４】
入力画像バッファ５３は、入力画像５１を構成する画素を、主走査方向に１ライン分ずつ受け入れて保持する記憶装置である。また、途中結果バッファ５４は、入力画像５１を主走査方向に見たときに、等分割した小領域の数だけ画素値の集計値を格納するメモリとなっている。フレームバッファ５７には、制御装置５５によって処理された出力画像５８が格納される。なお、制御装置５５は、これらの処理の間に必要な、横方向のグループ内ドット数ｘｎｕｍ、縦方向のグループ内ドット数ｙｎｕｍ、入力画素横カウンタＩＸ、入力画素縦カウンタＩＹ、出力画素横カウンタＯＸ、出力画素縦カウンタＯＹ、横方向の合計カウンタＨＴを格納したパラメータ保持部６０を備える。
【００６５】
横方向のグループ内ドット数ｘｎｕｍは、等分割した小領域５１Ｚに含まれる画素数をカウントし、平均化処理のために保持しておくパラメータで、横方向というのは主走査方向、縦方向というのは副走査方向のことである。入力画素横カウンタＩＸは入力画像５１を主走査方向に見た画素数をカウントし、１ライン分の処理を終了するかどうかを判断するためのパラメータである。入力画素縦カウンタＩＹは、副走査方向の画素数をカウントして１ページ分の処理が終了したかを判断するためのパラメータである。出力画素横カウンタＯＸは、フレームバッファ上の出力画素値を、主走査方向のどの位置に格納するかを示すパラメータである。カウンタＯＹは、出力画素値を、フレームバッファ上の副走査方向のどの位置に格納するかを示すパラメータである。横方向の合計カウンタＨＴは、入力画像バッファ５３に格納された各画素の画素値を順番に合計し、その途中集計値を一時的に保持するデータ保持領域である。このデータは、１個の小領域分の合計を終了する都度、途中結果バッファ５４に移される。
【００６６】
図３０〜図３３を用いて、入力画像を小領域に等分割した場合の、入力画像を構成する画素のグループ化について述べる。
図３０に示した破線の格子点には、それぞれ入力画像の画素が存在するものとする。ここで、このような入力画像を、図の右側に四角印を並べて示すような画素配列の出力画像に縮小する場合を考える。このとき、各出力画素Ａ毎に、対応する入力画像上の座標を求める。その位置は図の格子中に四角印で表示した。この出力画素Ａの画素値は、その周辺に存在する入力画像の画素の画素値を平均して求める。
【００６７】
このために、図３１に示すように、各出力画素Ａの中間に線を引いて入力画像を等分割する。これによって、例えばこの図に示すように、副走査方向即ち縦方向に見た場合に、出力画素Ａが２Ｌ間隔で配列されていたとすると、２Ｌ間隔で主走査方向に平行な境界５１Ｈが設定される。同様にして、副走査方向に平行な境界５１Ｌが設定される。こうして、入力画像を構成する各画素は、境界５１Ｈと５１Ｌによって小領域毎にグループ分けされる。
【００６８】
図３２には、それぞれ出力画素Ａに対応する入力画素を黒丸で示した。ここで、図の右下にある出力画素Ａの画素値は、これに対応する４個の黒丸の、入力画素の画素値を平均したものになる。また、境界の選定上、図の左下に示された出力画素Ｂに対応する入力画素のグループは６個の黒丸となる。
即ち、入力画素が丁度境界上に存在する場合には、例えば図３３に示すようなルールを設定する。図３３に示すように、境界５１Ｌあるいは５１Ｈの真上に存在する画素はいずれも、例えば左側あるいは上側の領域に含まれる画素のグループに属するものと定義する。
【００６９】
図３４には、グループの領域説明図を示す。
この図により、縦方向の境界画素７１と横方向の境界画素７２とを定義する。境界５１Ｌと５１Ｈによって囲まれた小領域には、図に示すような白丸と黒丸で表現される入力画素が含まれる。このとき、主走査方向に平行な境界５１Ｈに最も近い１列の画素を横方向の境界画素７２と定義する。また、副走査方向に平行な境界５１Ｌに最も近い画素を縦方向の境界画素７１と定義する。図２９に示した装置は、これらの境界画素を他の画素と区別して認識し、境界画素を認識したとき、所定の集計処理や平均化処理を実行する。これによって、比較的小容量の途中結果バッファ５４（図２９）や入力画像バッファ５３（図２９）を利用して、領域毎に入力画素のグループに対する画素値の平均値を求める。
【００７０】
図３５には、境界画素を利用した平均法の説明図を示す。
上記のような領域設定とグループ化を行うと、例えばこの図に示すように、枠７３によって入力画素がそれぞれグループ化され、これらの平均値をとるために縦方向の境界画素７１や横方向の境界画素７２が読み込まれる。
【００７１】
図３６には、境界画素の判定基準説明図を示す。
上記のような境界画素を判定しようとする場合には、この図に示すような境界画素の判定基準が必要となる。図に示すように、入力画像５１を横方向の境界５１Ｈと縦方向の境界５１Ｌとによって、それぞれグループの領域５１Ｚという単位に等分割する。このとき、横方向の境界画素の判別関数をborder・ｘ（Ｘ）とし、縦方向の境界画素判別関数をborder・ｙ（Ｙ）とする。border・ｘ（Ｘ）は、図の（ｂ）に示すように、ｄｓｔ・ｘとｓｒｃ・ｘとＸの関数である。ｄｓｔ・ｘは出力画像の主走査方向の幅である。また、ｓｒｃ・ｘは入力画像の主走査方向の幅である。Ｘは、入力画像を主走査方向に見た場合の着目する画素の順位である。入力画素の間隔を“１”とすれば、全ての小領域の幅はｓｒｃ・ｘ／ｄｓｔ・ｘとなる。こうした条件で、左から数えてＸ番目の入力画素が境界画素になるための条件は、Ｘ番目とＸ＋１番目の入力画素の間に領域の境界が来ることである。領域の境界は、ｓｒｃ・ｘ／ｄｓｔ・ｘの間隔で並んでいるから、Ｘ番目の入力画素が境界画素になるための条件は次の（１）式の通りになる。
Ｘ＜（（ｓｒｃ・ｘ＊ｎ）／ｄｓｔ・ｘ）≦Ｘ＋１    …（１）
【００７２】
更に、Ｘ番目の入力画素が境界画素になるための条件は、次の（２）式を満たすような整数ｍが存在することである。
Ｘ＜（（ｓｒｃ・ｘ＊ｍ）／ｄｓｔ・ｘ）≦Ｘ＋１    …（２）
この（２）式において、まず両辺にｄｓｔ・ｘ／ｓｒｃ・ｘを掛ける。ｄｓｔ・ｘ／ｓｒｃ・ｘは正なので不等号の向きは変わらない。
（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ＜ｍ≦
（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ    …（３）
ここで、ｍは整数なので両辺にガウス記号をつけてもこの関係は変わらないから次の（４）式の関係が成り立つ。
［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］＜ｍ≦［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］    …（４）
【００７３】
更に、［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］，［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］は整数なので、［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］＜［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］であれば［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］＜ｍ≦［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］となるｍが存在する。少なくともｍ＝［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］は条件を満たす。
つまり、［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］＜［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］が、Ｘが境界画素になるための条件である。
以上のことから、border・ｘ（Ｘ）の定義は次のようになる。
border・ｘ（Ｘ）＝１：［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］＜［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］    …（５）
border・ｘ（Ｘ）＝０：［（ｄｓｔ・ｘ＊Ｘ）／ｓｒｃ・ｘ］≧［（ｄｓｔ・ｘ＊（Ｘ＋１））／ｓｒｃ・ｘ］    …（６）
【００７４】
同様に、副走査方向即ち縦方向に見た場合にも同様に判別関数を使用できる。
border・ｙ（Ｙ）＝１：［（ｄｓｔ・ｙ＊Ｙ）／ｓｒｃ・ｙ］＜［（ｄｓｔ・ｙ＊（Ｙ＋１））／ｓｒｃ・ｙ］    …（７）
border・ｙ（Ｙ）＝０：［（ｄｓｔ・ｙ＊Ｙ）／ｓｒｃ・ｙ］≧［（ｄｓｔ・ｙ＊（Ｙ＋１））／ｓｒｃ・ｙ］    …（８）
【００７５】
図３７には、平均法のデータの流れ（横方向）の説明図を示す。
この図面を用いて、途中結果バッファ５４の構成とこの具体例で実行される画素値の合計処理について説明する。
例えば、図に示すように、入力画像を構成する画素７４が主走査方向に連続して、図２９に示す入力画像バッファ５３に格納されたものとする。これを順番に図に示した左端から処理する。最初の画素の画素値は図２９に示した横方向の合計カウンタＨＴに格納する。次の画素の画素値はその合計カウンタＨＴに加算する。そして、次々に各画素の画素値を横方向の合計カウンタＨＴに累積して格納していくが、丁度そのグループの境界画素を検出すると、そこでレジスタ５４Ａへ画素値を転記して加算を終了する。境界画素の検出はborder・ｘの値から判断する。
【００７６】
従って、この図に示すように、border・ｘの値が“１”になると、途中結果バッファ５４で使用するレジスタを５４Ａから５４Ｂに切り換える。そして、次のグループの画素についてその画素値を順に加算していく。従って、１ライン分の処理が終了すると、途中結果バッファ５４に設けられた主走査方向に見た小領域の数分のレジスタに、それぞれ同一の小領域に含まれる画素の画素値の合計が格納される。
【００７７】
図３８には、平均法のデータの流れ（縦方向）の説明図を示す。
主走査方向に見る処理は図３７に示すようにして進められる。そして、１ライン分の処理が終了すると、次の１ライン分の処理が進められる。この副走査方向の処理がこの図に示すように行われる。
副走査方向の処理を実行する場合、その処理開始前に必ずborder・ｙの値を参照する。border・ｙの値が“０”の場合には、図３７で示した１ライン分の集計処理が実行される。途中結果バッファ５４の各レジスタの内容は、１ライン毎に加算され累積される。ここで、border・ｙの値が“１”となったラインを処理することを考える。このラインは領域の最後に配置された画素値群であるから、領域毎にその画素値の集計を行うと、途中結果バッファを構成する各レジスタの保持する値は、このライン上にある全ての小領域のそれぞれ画素値の合計値である。これとは別に、図２９に示したパラメータ保持部６０の横方向のドット数ｘｎｕｍと、縦方向のドット数ｙｎｕｍとをカウントしているため、各領域を構成する画素数が計算できる。従って、各領域の画素値の合計を各領域に含まれる画素数で割ることによって、平均値を求めることができる。これがフレームバッファ５７に格納されて出力画素の画素値となる。
【００７８】
図３９には、以上説明した具体例６の動作を順に説明するためのフローチャートを図示した。
ステップＳ１〜ステップＳ４は初期化の処理である。ステップＳ１では、入力画素縦カウンタＩＹと出力画素縦カウンタＯＹとを“０”にセットする。これによって、１ライン目からの読み出しを可能にする。ステップＳ２では、横方向の合計カウンタＨＴを“０”にする。これは画素値の中間的な集計結果を保存するためのものである。最初は１番左の画素を指定する。ステップＳ３では、縦方向のドット数ｙｎｕｍを“１”にし、横方向のドット数ｘｎｕｍを“１”にする。これによって、領域内の画素数を主走査方向と副走査方向に向かってカウント開始する。ステップＳ４では、途中結果バッファ５４をクリアする。これで全ての小領域画素値集計結果に対応するレジスタがクリアされる。
【００７９】
次のステップＳ５では、入力画素横カウンタＩＸが“０”にされ、出力画素横カウンタＯＸが“０”にされる。こうして左端の画素から以下の処理が繰り返される。ステップＳ６では、入力画像を１行（１ライン）分読み込む。ステップＳ７では、ＨＴに画像バッファのＩＸ番目の要素（画素値）を足す。こうしてＨＴには現在処理中の画素の画素値合計が一時保持される。次に、ステップＳ８において、border・ｘの値をチェックする。この値が“０”の場合にはステップＳ１１に進み、入力画素横カウンタＩＸをインクリメントしてステップＳ１２に進む。ステップＳ１２では、ＩＸが入力画像の幅を超えないかどうかを判断し、幅を超えなければステップＳ７に戻る。
【００８０】
こうして画素値は順にＨＴに累積保持され、border・ｘの値が“１”になるとステップＳ９に進み、途中結果バッファ５４のＯＸ番目の要素（図３６に示すレジスタ）にＨＴの値を足す。これで途中結果バッファ５４の該当するレジスタに処理対象となる画素を含む領域の画素値についての合計が格納される。次に、出力画素横カウンタＯＸをインクリメントし、領域内集計用の横方向の合計カウンタＨＴを“０”にリセットする。そして、ステップＳ１１に戻り、ＩＸをインクリメントしてステップＳ１２に進む。こうしてステップＳ７〜ステップＳ１２の処理によって、１ライン分の画素値をそれぞれ領域毎に集計し、途中結果バッファ５４に格納する。
【００８１】
これらの処理が終了するとステップＳ１３に進み、今度はborder・ｙの値をチェックする。border・ｙの値が“０”ならばステップＳ１５に進み、ＩＹをインクリメントして、次のラインの処理に進む。また、同時に縦方向のドット数ｙｎｕｍをインクリメントし、ステップＳ１６に進む。ステップＳ１６では、入力画素縦カウンタＩＹが入力画像の高さ以下であるかどうかを判断し、その高さ以下であればステップＳ５に戻る。これによって、１画面分の処理が終了したかどうかが判断される。
一方、ステップＳ１３において、border・ｙの値が“１”になった場合には、ステップＳ１４の割り算処理に進む。
【００８２】
図４０には、この割り算処理のフローチャートを示した。
割り算処理においては、まずステップＳ１において、横方向のドット数ｘｎｕｍに初期値“１”を代入する。また、入力画素横カウンタＩＸに初期値“０”を代入する。更に、ステップＳ２において、出力画素横カウンタＯＸに初期値“０”を代入する。
これらによって、１ライン分の最初の画素から処理を開始する準備を行う。
【００８３】
次のステップＳ３において、border・ｘの値を判断する。border・ｘの値は主走査方向に見た場合に、２以上の画素が１つの領域に含まれる場合、最初は通常“０”である。従って、ステップＳ８に進み、入力画素横カウンタＩＸに“１”を加える。更に、領域内の横方向の画素数をカウントする横方向のドット数ｘｎｕｍをインクリメントする。そして、ステップＳ９に進み、ＩＸが入力画像幅より大きくならなければ再びステップＳ３に戻る。こうしてborder・ｘの値が“１”になるまでステップＳ３，Ｓ８，Ｓ９の処理を繰り返す。この処理は、単に領域に含まれる主走査方向に配列された画素の数即ち差、横方向のドット数ｘｎｕｍをカウントするための処理である。
【００８４】
このラインの画素値の集計は、既に図３９のステップＳ７〜ステップＳ１２の処理によって終了している。ここで、border・ｘの値が“１”になるとステップＳ４に進み、途中結果バッファの該当するレジスタの値をテンポラリファイルＴＭＰに格納する。更に、ステップＳ５において平均値を計算し、フレームバッファ上の該当する画素の画素値を決定する。途中結果バッファの値を横方向のドット数×縦方向のドット数で割った答が平均値となる。ステップＳ６では、横方向のドット数ｘｎｕｍをゼロクリアする。これは、次の領域のドット数をカウントするための準備である。ステップＳ７では、ＯＸに“１”を加える。これは出力画素の横カウンタをインクリメントして、次の出力画素を指定する処理である。
【００８５】
ステップＳ８で入力画素を１つ右に進め、ｘｎｕｍに“１”を加えて初期化し、再びステップＳ９において、全ての１ライン分の処理が終了したかを判断する。次の領域が存在すれば再びステップＳ３に戻り、これまで説明した処理を繰り返す。こうして、border・ｙが“１”のラインについて、途中結果バッファの各レジスタに格納されたそれぞれの領域に含まれる画素値の合計を、それぞれの領域を構成する画素の数で割ることにより平均値を求める処理を終える。これらの処理が全て終了すると、ステップＳ１０でｙｎｕｍをゼロクリアし、次の処理に備える。また、ステップＳ１１では、途中結果バッファをクリアし、次のラインから再び新たな集計を開始する。
【００８６】
〈具体例６の効果〉
以上の例によれば、入力画像を構成する画素を１ライン分ずつ保持し、主走査方向に見たときの小領域の境界画素を検出しながら、画素値の集計値を求めて途中結果バッファに格納し、副走査方向に見たときの境界画素を検出して、各小領域の画素値の集計値を領域に含まれる画素数で割ることによって、各領域における画素値の平均値を求める。このようにしたので、入力画像を構成する画素値を保持するためのメモリが、１ライン分の入力画像バッファと比較的小容量の途中結果バッファのみとなり、使用メモリ量を少なくすることができる。
【００８７】
〈具体例７〉
図４１に、具体例７の装置のブロック図を示す。
この装置は、具体例６の装置に対しパラメータ保持部６０にサンプリングの間隔Ａを保持するためのレジスタを設けたものである。そして、これによって、各小領域の全ての画素値を加算して平均するのでなく、一部サンプリングした画素の画素値を平均する。
【００８８】
図４２には、サンプリングされる入力画素の説明図を示す。
図に示すように、入力画像１は、副走査方向に平行な境界５１Ｖと主走査方向に平行な境界５１Ｈによって小領域に等分割されている。この小領域には多数の画素が含まれるが、図に示すように黒丸の画素７４Ａと白丸の画素７４Ｂとを設定し、黒丸の画素７４Ａのみをサンプリングする。領域に含まれる画素の両端の画素間隔を図に示すように主走査方向Ｄｘ、副走査方向Ｄｙとした。そして、サンプリング間隔をＡとした。ここでは、実際には主走査方向も副走査方向もＡの間隔で１個おきに画素がサンプリングされる。
【００８９】
図４３には、サンプリング後の画像説明図を示す。
図の左側に示すものが元の入力画像であって、右側に示すものがサンプリングされた入力画素の集まりを示す。この図に示すように、サンプリング間隔を縦横同じに設定すると、サンプリングされた入力画素の集まりが元の入力画像と相似形の画像となる。
【００９０】
図４４には、具体例７の動作フローチャートを示す。
この処理は、大部分図３９に示す具体例６の動作フローチャートと同様である。図４４の具体例では、ステップＳ５とステップＳ８とステップＳ９を新たに追加している。他の部分は図３９と同様の処理であるため、重複する説明を省略する。まず図４４のステップＳ５ではＡの値を求める。即ち、ここでサンプリングの間隔を読み込む。画素１個おきでサンプリングを行う場合には、このＡの値は既に説明したように“２”となる。更に、ステップＳ７で入力画素を読み込んだ直後、ステップＳ８でＩＹをＡで割った余りと０を比較することで、サンプリング行であるかどうかの判断をする。
【００９１】
これによって、今読み込んだラインがサンプリング間隔から見て合計処理をすべきラインか、スキップするラインかを判断する。スキップするラインであれば、ステップＳ８からステップＳ１６まで進む。なお、サンプリング対象となっていないラインであっても領域の境界になる場合がある。従って、ステップＳ８からステップＳ１６への処理に進んでborder・ｙの値を調べるようになっている。ステップＳ１６以下は具体例１と同一のため図示を省略した。
【００９２】
ステップＳ８では読み込んだラインがスキップすべきものかを判断したが、ステップＳ９では、そのラインの処理に移った場合に、着目している画素がスキップすべきものかどうかを、ＩＸをＡで割った余りと０を比較することによって判断する。スキップすべきものであればステップＳ９からステップＳ１１に進み、その画素が境界画素かどうかの判断に移る。サンプリングすべき画素と判断した場合には、ステップＳ９からステップＳ１０に進み、その画素値がＨＴに加算され集計される。
【００９３】
なお、ＩＹとＡあるいはＩＸとＡの剰余を求める場合には、次のような処理を具体的に行う。
ここで、予めいくつかのパラメータを設定する。
（１）具体例１と同様に、平均は出力画素に対応する入力画素のグループ毎に求める。ただし、具体例１と異なり、グループ内全ての入力画素の合計を求めるわけではない。
（２）一定の間隔Ａで、合計を取る入力画素をサンプリングする。Ａ＝１の場合は全ての入力画素をサンプリングすることになる。サンプリングの間隔Ａは縦横一定である。これは、サンプリング後の画像が、元の画像と相似になるようにしたいためである。
【００９４】
次にＡの求め方を示す。求め方を示すにあたって、いくつかパラメータを設定する。
（１）合計できる入力画素の最大数をＮとする。Ｎは合計の計算の精度と、入力画素の階調数によって求まる。例えば、画素値が２５６階調（この場合、画素値の最大数は２５５）で、１６ビットで合計を求める場合、１６ビットで表現できる最大数は６５５３５なので、全ての画素が２５５である場合を考えるとＮ＊２５５≦６５５３５を満たす必要がある。つまり、Ｎ＝２５７となる。
（２）グループ中の横方向の画素の数をＤｘ、縦方向の画素の数をＤｙとする。Ａの間隔でサンプリングする場合、サンプリングする画素数はグループ中には横方向にＤｘ／Ａ、縦方向にＤｙ／Ａである。そして、サンプリング数はＮを超えてはいけないので、間隔Ａは、次のような式を満たす必要がある。
（Ｄｘ／Ａ）＊（Ｄｙ／Ａ）≦Ｎ    …（９）
ただし、Ａは整数である。
【００９５】
また、Ａを必要以上に大きくすることは、サンプリングする量を減らしてしまうことになるため、Ａは（９）式を満たす最小の数である必要がある。つまり、Ａ−１は（９）式を満たさないが、Ａは（９）式を満たすような値がＡの値である。このようなＡは（Ｄｘ／Ａ′）＊（Ｄｙ／Ａ′）＝ＮとなるＡ′について小数部を切り上げることで求めることができる。
Ａ′の値は、（Ｄｘ／Ａ′）＊（Ｄｙ／Ａ′）＝Ｎを解くことで、次のようになる。
Ａ′＝ｓｑｒｔ（（Ｄｘ＊Ｄｙ）／Ｎ）    …（１０）
【００９６】
ＡはＡ′の小数部分を切り上げたものなので、次のようになる。
Ａ＝［Ａ′］＋１  （Ａ′が整数でない場合）    …（１１）
Ａ＝Ａ′          （Ａ′が整数のとき）    …（１２）
ただし、［Ａ′］はガウス記号でＡ′を超えない最大の整数の意味であり、ｓｑｒｔは平方根の意味である。
【００９７】
なお、Ｄｘ，Ｄｙの値は、グループによって異なる。つまり、あるグループのＤｘ，Ｄｙで求めたＡは別のグループではオーバーフローを引き起こしてしまう可能性がある。
しかし、Ａの計算の際に、Ｄｘ，Ｄｙの最大値を用いることで、全てのグループで問題無く使用できるＡの値を得ることができる。
Ｄｘ，Ｄｙの最大値は、入力画像のサイズｓｒｃ・ｘ，ｓｒｃ・ｙから、次の式で求めることができる。
Ｄｘ：ｓｒｃ・ｘ／ｄｓｔ・ｘを切り上げたもの
Ｄｙ：ｓｒｃ・ｙ／ｄｓｔ・ｙを切り上げたもの
【００９８】
〈具体例７の効果〉
以上のように、一定の間隔Ａでサンプリングを行えば、小領域に含まれる画素数が多い場合に、これらのうちの任意の数の画素に絞って合計を行うことができる。これにより、途中結果バッファに合計を求めて保持する場合に、その合計値が必要以上に大きくならず、バッファのメモリ容量を十分に小さく抑えることができる。
【００９９】
〈具体例８〉
図４５に、具体例８の装置のブロック図を示す。
この具体例では、具体例７の装置に対しサンプリングの間隔Ａと共にサンプリング合計カウンタＳＴを記憶する領域を加える。他の部分は具体例７と同様の構成である。
【０１００】
図４６には、具体例８の処理説明図を示す。
上記の処理では、サンプリングを行うことによって途中結果バッファのレジスタがオーバーフローすることなく、画素値を合計しその平均を求めることができる。なお、この場合、サンプリングされない入力画素は無視されていた。この具体例でサンプリングされない画素についても平均をとるようにし、画質の向上を図る。この平均をとる範囲を定義するために、サンプリング領域という概念を導入する。サンプリング領域は、サンプリング対象になるラインについて、サンプリングの対象となっている入力画素から、すぐ右の隣のサンプリング対象となっている入力画素を含むいくつかの入力画素から構成される。これは幅がＡで、高さが１ライン分の入力画像上の領域となる。図４６に示す黒丸の画素は、サンプリング対象となるラインの画素である。そして、ここでは隣合う２個ずつの画素をサンプリング領域８０に設定する。こうして、図の左側に示すような元の入力画像に対し画素を平均化することによって、図の右側に示すような、元の入力画像と相似形の入力画素の集まりができる。
【０１０１】
図４７には、サンプリング領域の説明図を示す。
例えば、この図に示すように、境界５１Ｈと５１Ｖとによって設定された１つの小領域に多数の画素が存在する場合、Ａライン毎にサンプリングが行われるとする。このとき、最初のラインの黒丸の画素７４Ａとその右隣の画素４７Ｂとは同一のサンプリング領域８０に含まれる。この同一のサンプリング領域８０に含まれる画素の画素値は図４５に示すサンプリング合計カウンタＳＴでその都度加算され平均化され、その後図４５に示す横方向の合計カウンタＨＴに累積される。このように、その都度サンプリング領域に含まれる画素値を平均化した上で、途中結果バッファ５４にその画素値を累積するようにすれば、実質的にサンプリング数が多くても合計値がオーバーフローするおそれがない。
【０１０２】
図４８には、具体例８の動作フローチャートを示す。
このフローチャートは、図３９を用いて説明した具体例６のフローチャートと、ステップＳ５〜ステップＳ８の部分のみが異なる。まず、ステップＳ１〜ステップＳ４までで初期化処理が行われるが、ステップＳ５で、１ライン分の各画素の処理に移ったとき、図４５に示したサンプリング合計カウンタＳＴに入力画素バッファのＩＸ番目の要素を足す。次のステップＳ６で、ＩＸ＋１番目、即ちその隣の画素とサンプリング数との比較を行う。サンプリング数よりも小さい場合には、サンプリング領域内部である。従って、このステップＳ６で、サンプリング合計カウンタＳＴに同一のサンプリング領域に含まれる画素の画素値全てを加算する処理を繰り返す。全ての加算処理が終えるとステップＳ６からステップＳ７に進み、ここではサンプリング合計カウンタＳＴをサンプリング数で割ることによって、サンプリング領域内の画素値の平均を求める。次に、これを横方向の合計カウンタＨＴに加算する。こうして、サンプリング領域内の画素値の平均をＨＴに加算した上で、ステップＳ８でサンプリング合計カウンタＳＴの初期化を行い、次の処理へ進む。
このようなステップＳ５〜ステップＳ８の処理をこれまでの具体例に含めることによって、サンプリング領域内の平均値算出が可能になる。
【０１０３】
図４９には、具体例８の初期化処理フローチャートを示す。
図４８のステップＳ１では、この具体例８特有の初期化処理が行われる。その内容は、この図に示すように、ステップＳ３１〜ステップＳ３４については、図４４のステップ１〜ステップＳ４のこれまでの初期化処理と全く同様である。また、ステップＳ３５では、図４４の具体例７の処理と同様に、サンプリング間隔Ａの値を求める。そして、ステップＳ３６では、サンプリング合計カウンタＳＴの初期化を行う。こうして、合計処理のための準備が終了する。
【０１０４】
〈具体例８の効果〉
この具体例８によれば、小領域に含まれる画素数が多く、これらの画素値を合計した場合に、途中結果バッファの各レジスタが桁数の面でオーバーフローするような場合に、元の画像の画質を損なうことなく平均化処理が可能になる。即ち、サンプリング領域については予め平均化を行った後、途中結果バッファにその平均値を加算するような累積方法をとるため、途中結果バッファがオーバーフローしない。
なお、上記の例では、主走査方向についてのみサンプリング領域を設定する例を示したが、副走査方向についても同様のサンプリング領域を設定して、オーバーフローを防止することが可能である。
【０１０５】
〈具体例９〉
これまで説明した例では、例えば画像を拡大する場合、各行及び各列単位に画素を何回コピーするかという整数倍率を計算する必要があった。こうして計算した結果をもとに、まず、拡大／縮小テーブルを用意し、その後、このテーブルを参照しながら拡大／縮小処理を行う。こうすれば、テーブルの参照だけで画素ごとの拡大／縮小倍率を得られることから、画像拡大／縮小処理の高速化が図られる。しかしながら、拡大前後の画像サイズによっては、拡大／縮小テーブルのデータ量が大きくなり、メモリ効率を低下させる場合もある。この具体例では、拡大／縮小倍率の演算を高速に簡単に行えるようにして、これまでとは逆に、拡大／縮小テーブルを不要にして、メモリエリアを節約する。
この具体例では、以下、行とかラインとかいう用語を用いて説明を行うが、これは主走査方向を示す。列方向即ち、副走査方向についても同様の処理ができることはいうまでもない。
【０１０６】
図５０には、この具体例において実施をする妥当なアルゴリズムの説明図を示す。
図の１番左に示す(1)が原画像であって、白または黒で塗り潰した部分は１ライン分の画素群である。図の真ん中に示した(2)は、(1)の画像を縦方向に丁度１．７５倍した状態を示す。もし、各ラインが実数倍即ち１．７５倍という倍率で縦方向にそのまま拡大できるならば、この(2)に示すような結果になる。
【０１０７】
即ち、１ライン目は０．００〜１．７５、２ライン目は１．７５〜３．５０、…というように拡大され、最後の８ライン目は１２．２５〜１４．００という幅に拡大される。従って、原画像８ライン分が拡大画像では、１４ライン分の幅に拡大されたことになる。しかしながら、画像データでは、各ラインは整数単位でしか拡大／縮小をすることができない。つまり、ライン間の境界は整数になる必要がある。そこで、ライン間の境界を実数倍率で得られた値を超えない整数と定義する。その結果、１ライン目はそのまま、２ライン目は２倍、３ライン目は２倍、４ライン目も２倍、５ライン目は１倍というように原画像の各ラインを整数倍にし、最終的に原画像７ライン分を１４ライン分に拡大する。
【０１０８】
上記のような各ラインの整数倍率は以下の計算で求められる。
ＭＵＬ（ｎ）＝［ｎ＊ｍｕｌ］−［（ｎ−１）＊ｍｕｌ］
但し、ｍｕｌ＝（出力画像のサイズ）／（入力画像のサイズ）である。
また、式の中で使用した各記号の意味は次の通りである。
［］：ガウス記号（内部の実数を超えない整数）
ｎ：行番号（ｎ＝１から始まるものとする）
【０１０９】
拡大処理の要領は、行方向も列方向も全く同様である。従って、各画素に割り振る整数倍率は、このように計算すれば、拡大処理ができる。ところが、この計算では、上記の整数倍率計算式に示すように、整数演算を２回、実数演算を２回、実数から整数への型変換を２回行う。こうした演算は非常に時間がかかり、１画素ずつ処理をする度にこの計算を実行すると、ＣＰＵの能力によっては、時間がかかり過ぎて現実的でない。
【０１１０】
上記のアルゴリズムによって、各ラインに分配される整数倍率を分析してみる。各ラインの倍率は最低でも実数倍率の整数部分となっている。つまり、１．７５倍であれば、各ラインの倍率は最低でも１倍となり、２．５倍ならば２倍となる。また、小数部分が桁上がりした場合にのみ、倍率が１だけ増加する。つまり、指定された実数倍率をｍｕｌとすると、全てのラインは最低でもＢＡＳＥ＝［ｍｕｌ］倍となり、小数部分が繰り上がった場合のみＢＡＳＥ＋１倍となる。
【０１１１】
そこで、小数部分が繰り上がったかどうかを判定する方法を考える。指定された実数倍率の小数部分をＤＥＣ、行番号ｎとした場合、ｎ＊ＤＥＣの小数部分がＤＥＣより小さいときに、繰り上がりが発生したと判定できる。
【０１１２】
図５１には、繰り上がり発生の判定方法説明図を示す。
例えば、ここでＤＥＣ＝０．３の場合を考える。最初の１ライン目は小数部分が０．３である。２ライン目は小数部分が０．６になる。３番目は小数部分が０．９になる。そして、４番目は小数部分が０．２となり、１だけ繰り上がるから１ライン増やすことになる。ここで、１ライン目、２ライン目、３ライン目の小数部分は必ずＤＥＣより大きい。そして、繰り上がりが生じるときの小数部分は０．２となっている。このとき、初めて小数部分がＤＥＣより小さくなる。このアルゴリズムをまとめると次のようになる。
【０１１３】
前処理として、以下の値を計算しておく。
ＢＡＳＥ＝［ｍｕｌ］
ＤＥＣ  ＝ｍｕｌ−ＢＡＳＥ
各行毎の倍率は以下のように求める。
ＤＥＣ＊ｎの小数部≧ＤＥＣの場合、倍率はＢＡＳＥ
ＤＥＣ＊ｎの小数部＜ＤＥＣの場合、倍率はＢＡＳＥ＋１
以上のようなアルゴリズムは実数乗算が１回、実数比較（実数減算）が１回、実数から小数部分のみを取り出す処理（実数減算）が１回必要となるが、既に説明した処理に比べて演算回数が減少している。
【０１１４】
ここで、このアルゴリズムの演算処理をレジスタ幅の限界を利用して高速化する。例えば、ＣＰＵ幅が３２ビットであると仮定する。
前処理として、以下の値を計算しておく。
ＢＡＳＥ＝［ｍｕｌ］
ＤＥＣ  ＝（ｍｕｌ−ＢＡＳＥ）＊２３２＋１
ＤＥＣは３２ビット幅の整数レジスタで保持する。
上記ＢＡＳＥは整数部分、ＤＥＣは小数部分である。＋１としたのは、さらに下位の小数部分が存在する場合に、切り上げ処理をするためである。
【０１１５】
ＤＥＣに処理対象ライン位置ｎをかける。この計算結果をＤＥＣ２とする。
ＤＥＣ２＝ＤＥＣ＊ｎ
計算結果のＤＥＣ２は３２ビット幅の整数レジスタで保持する。
ＤＥＣ，ＤＥＣ２の大小比較により、整数倍率を決定する。
ＤＥＣ２≧ＤＥＣの場合、倍率はＢＡＳＥ
ＤＥＣ２＜ＤＥＣの場合、倍率はＢＡＳＥ＋１
【０１１６】
以上の処理では３２ビット幅の整数レジスタを利用し、小数部を０〜２３２−１までの整数で表現する。ＤＥＣ＊ｎの計算においては、整数部分を意図的にオーバーフローさせてしまう。これにより、計算結果として、整数部分を無効にし、小数部分だけが残るアルゴリズムを利用する。整数の乗算が１回、整数比較（整数減算）が１回行われるだけの高速なアルゴリズムである。但し、このアルゴリズムでは、小数部を０〜２３２−１までの整数に丸めてしまう。従って浮動小数点の精度で計算した場合とは厳密には一致しないことが有り得る。この処理は、インクリメントするＣＰＵのレジスタ幅によって、６４ビット、１２８ビット等に拡張でき、レジスタ幅が大きくなるほど精度が向上する。
【０１１７】
図５２に、具体例９の装置のブロック図を示す。
この装置は、外部記憶装置９１と最近傍法拡大／縮小装置９２を備える。この最近傍法拡大／縮小装置９２には、倍率計算部９３、最近傍法拡大／縮小処理部９４及びラインバッファ９５が設けられている。また、この装置の出力は、出力画像フレームバッファ９６に取り出されるよう構成されている。
【０１１８】
外部記憶装置９１は、拡大／縮小処理前の入力画像データを保持する装置である。出力画像フレームバッファ９６は、最近傍法による拡大／縮小後の出力画像を保持する記憶装置である。
【０１１９】
最近傍法拡大／縮小処理部９４は、ラインバッファ９５内のラインデータに対して倍率計算部９３により計算された整数倍率分だけ拡大／縮小を施して、画像データを出力画像フレームバッファ９６に出力する装置である。倍率計算部９３は、最近傍法拡大／縮小処理部９４から入力画素の座標値を受け入れ、その画素に対応する整数倍率を演算する部分である。ラインバッファ９５は、外部記憶装置９１から１ライン分ずつ読み込んだ入力画像データを保持する記憶部である。
【０１２０】
図５３に、図５２に示した倍率計算部９３のブロック図を示す。
この倍率計算部９３は、乗算部１０３，１０４、比較／選択部１０５，１０６及び倍率計算器１０７を備えている。倍率計算器１０７には、レジスタＤＥＣＸ１，ＤＥＣＸ２，ＢＡＳＥＸ１，ＢＡＳＥＸ２，ＤＥＣＹ１，ＤＥＣＹ２，ＢＡＳＥＹ１，ＢＡＳＥＹ２が設けられている。乗算部１０３は、Ｘ座標１０１を受け入れて所定の整数乗算を行う計算部である。乗算部１０４は、Ｙ座標１０２を受け入れて所定の整数乗算を行う計算部である。
【０１２１】
比較／選択部１０５は、レジスタＤＥＣＸ１，ＤＥＣＸ２，ＢＡＳＥＸ１，ＢＡＳＥＸ２の出力を受け入れてそのいずれかを選択し、Ｘ方向倍率１０８を出力する部分である。比較／選択部１０６は、レジスタＤＥＣＹ１，ＤＥＣＹ２，ＢＡＳＥＹ１，ＢＡＳＥＹ２の出力を受け入れて、そのいずれかを選択し、Ｙ方向倍率１０９を出力する部分である。Ｘ座標１０１、Ｙ座標１０２は、図５２に示した最近傍法拡大／縮小処理部９４により指定された処理対象画素の座標値である。
【０１２２】
Ｘ方向倍率１０８、Ｙ方向倍率１０９は倍率計算部９３から出力され、最近傍法拡大／縮小処理部９４に向けて出力される計算結果である。これによって、指定された座標値に対応する整数倍率がＸ方向、Ｙ方向について、それぞれ出力されることになる。
【０１２３】
図５４には、具体例９の動作フローチャートを示す。
まず、ステップＳ１において、最初に指定された実数倍率に従って倍率計算部９３内部のレジスタの設定を行う。レジスタ設定については後で詳細に説明する。次に、ステップＳ２において、外部記憶装置９１からラインバッファ９５へ入力画像１ライン分を読み込む。ステップＳ３において、読み込んだラインデータのＹ座標に対応する整数倍率を倍率計算部９３によって計算する。ステップＳ４では、ラインバッファ中の処理対象画像データのＸ座標に対応する整数倍率を倍率計算部９３により計算する。
【０１２４】
次に、ステップＳ５に進み、画素を複製し、出力画像フレームバッファ９６に出力する。ステップＳ６は、これをＸ方向倍率分繰り返すための処理である。ステップＳ７は、入力画像ライン幅分だけこの処理を繰り返す制御を行う部分である。ステップＳ８は、ステップＳ４〜ステップＳ７の処理をラインデータのＹ方向倍率分だけ繰り返す制御を行う。ステップＳ９で、入力画像ライン数分、上記の処理を繰り返す。
以上の処理によって、出力画像フレームバッファには、入力画像データの上から下、左から右に向かって順に各画素の複製が出力されていく。
【０１２５】
図５５には、拡大／縮小の処理過程の説明図を示す。
図の黒丸印で示した画素は出力画像の画素である。また、図の格子で仕切った各領域は入力画素の１画素に対応する。Ｘ軸方向、Ｙ軸方向共に整数倍率でないため、入力画素１画素分の領域は、それぞれ異なる画素数の出力画素に対応している。
【０１２６】
図５６には、レジスタ設定のフローチャートを示す。
なお、以下のレジスタ設定動作と倍率計算方法については、Ｘ方向の説明のみを行う。Ｙ方向については同様なので説明を省略する。
まず、図５３に示すレジスタＤＥＣＸ１，ＤＥＣＸ２，ＢＡＳＥＸ１，ＢＡＳＥＸ２の幅をＮビットとする。また、指定された実数倍の倍率をｍｕｌで表す。具体例として、レジスタ幅を３２ビット（Ｎ＝３２）、拡大倍率２．５倍（ｍｕｌ＝２．５）について説明する。
【０１２７】
図５６のステップＳ１１において、まず指定された実数倍率を整数部と小数部に分離する。具体例のｍｕｌ＝２．５では、ＢＡＳＥ＝２、ＤＥＣ＝０．５となる。そして、整数部を示すレジスタＢＡＳＥの値をＢＡＳＥＸ１に設定する（ステップＳ１２）。また、繰り上がりの場合は、これより“１”だけ大きい倍率が設定されるから、ステップＳ１３において、整数分の値に“１”を加算した値をレジスタＢＡＳＥＸ２に設定する。具体例では、ＢＡＳＥＸ１＝２、ＢＡＳＥＸ２＝３になる。
【０１２８】
次に小数部を格納したレジスタＤＥＣに２Ｎを掛け、１を加えた整数値をＤＥＣＸ１に設定する。即ち、具体例では、例えば次のような計算をする。
ＤＥＣＸ１  ＝  ＤＥＣ＊２Ｎ＋１
＝  ０．５＊２３２＋１
＝  2,147,483,649
【０１２９】
次に、倍率計算を実行する。
図５７には、Ｘ方向倍率計算のフローチャートを示した。
ここでは、具体例としてＮ＝３２、ｍｕｌ＝２．５、Ｘ座標は２（Ｘ＝２）の場合について説明する。図５３に示した乗算部１０３は、図５２に示す最近傍法拡大／縮小処理部９４によって指定されたＸ座標とレジスタＤＥＣＸ１の内容とを掛け合わせ、レジスタＤＥＣＸ２に設定する（ステップＳ２１）。次のステップＳ２２では、判断処理（ステップＳ２３）の結果により、ステップＳ２４あるいはステップＳ２５を実行する。
【０１３０】
即ち、Ｘ座標の積を求めた結果得られた小数部ＤＥＣＸ２が実数倍率の小数部ＤＥＣＸ１より大きいかあるいは等しい場合には繰り上げはしない。最初の小数部以下の場合には繰り上げをする。繰り上げをしない場合には、レジスタＢＡＳＥＸ１の内容を出力する。繰り上げをする場合には、レジスタＢＡＳＥＸ２の内容を出力する。こうして、Ｘ方向の倍率が、レジスタＢＡＳＥＸ１あるいはＢＡＳＥＸ２の内容のいずれか一方を選択して得られる。
以上のようにすれば、座標値に応じた整数倍率の計算が整数乗算と比較／選択のみにより実現する。
【０１３１】
〈具体例９の効果〉
この具体例によれば、最近傍法による画像データの実数倍率の拡大／縮小をする場合に、各行／各列に割り振る整数倍率の計算を、レジスタ幅の限界を利用して高速化できる。これによって、拡大／縮小テーブルを予め全て用意する必要がなくなる。従って、拡大／縮小テーブルを保持するためのメモリが不用になり、コンピュータのメモリ使用効率が向上する。また、最近傍法による画像データの実数倍率の拡大／縮小処理を、少ないメモリ容量で高速に実行することを可能にする。
【０１３２】
〈具体例１０〉
画像の拡大をした場合に、コピーした画素の画素値を決定する方法として、最近傍法と一次補間法とがある。具体例４等で説明した一次補間法では、周囲４画素の画素値と各画素までの距離を用いて、尤もらしい画素値を求める。これにより、拡大処理を行った際のジャギを目立たなくし、画質を向上させる。この方法では、例えば具体例４を説明する図１９に示した近傍エリアテーブルを利用する。ここにも、具体例９で用いたアルゴリズムを採用することができる。
【０１３３】
図５８を用いて、既にいくつかの具体例で説明した近傍エリアについて再度説明を行う。
図５８の左側には入力画像を示し、右側には出力画像を示した。
図に示すように、入力画素で作られる格子を出力画像にマッピングすると、入力画素で作られる格子で囲まれた領域が近傍エリアとなる。一次補間処理は、この近傍エリアと呼ばれる領域を単位に行う。この近傍エリアに含まれる出力画素の数は以下の式で得られる。
Ａ＝１のとき    ＭＵＬ（ｎ）＝Ｂ
Ａ≠１のとき    ＭＵＬ（０）＝１
ＭＵＬ（ｎ）＝［ｎ＊ｍｕｌ］−［（ｎ−１）＊ｍｕｌ］
（ｎ＞０）
但し、ｍｕｌ＝（Ｂ−１）／（Ａ−１）である。
具体例４の図１９においても同様の趣旨の説明をした。
【０１３４】
また、式中の記号、及び演算子の意味は下記の通りである。
Ａ：入力画像のサイズ
Ｂ：出力画像のサイズ
ｎ：=近傍エリアの番号（ｎ＝０から始まるものとする）
ＭＵＬ（Ｘ）：Ｘ番目の近傍エリアの画素数
［］：ガウス記号（内部の実数を超えない最大の整数）
具体例４の図１９においても同様の趣旨の説明をした。
【０１３５】
上記の式は、最近傍法の式と基本的には変わらない。しかし、上端と左端については一次補間では常に“１”になる。これも、図１９に示したとおりである。一次補間における近傍エリアに含まれる出力画素の数と最近傍法における各入力画素毎の整数倍率は基本的に同じものである。
【０１３６】
図５９には、最近傍法と一次補間との処理の順番の違いを示すフローチャートを図示した。
図５９（ａ）において、最近傍法では、まずステップＳ３１で、Ｘ方向の倍率計算を行う。そして、ステップＳ３２において、１画素分画素を複製し、ステップＳ３３において、Ｘ方向の倍率分画素の複製が終了したかを判断する。これによって、Ｘ方向の倍率分画素を複製する。更に、その複製が終了すると、ステップＳ３４において、入力画像ライン幅分の画素複製が終了したかどうかを判断する。これによって、ライン幅方向の画素複製を実行する。こうしてＸ方向及びＹ方向の画素複製が終了する。
【０１３７】
図の（ｂ）における一次補間法では、まずステップＳ４１において、現在の整数倍率を示すＭＵＬＸに初期値“１”を設定する。次にステップＳ４２において、一次補間を実行し、ステップＳ４３においては、ＭＵＬＸ分の処理が終了したかどうかを判断する。そして、ステップＳ４２をこの回数分繰り返し、ステップＳ４４に移る。ステップＳ４４では、ＭＵＬＸを更新し、ステップＳ４５で、入力画像ライン幅分の処理が終了したかどうかを判断する。これによって、ステップＳ４２〜ステップＳ４４の処理を繰り返し、Ｘ方向の幅分画素の一次補間処理を終了する。
上記倍率計算とＭＵＬＸの計算は、同一の演算をしている。
【０１３８】
そこで、以下の説明では、近傍エリアに含まれる出力画素の数と整数倍率とを区別せず、一次補間の場合も整数倍率と表記する。一次補間の処理は、上端の近傍エリアから下へ、左端の近傍エリアから右へと行われる。従って、全ての近傍エリアを走査するループにおいて、ループの最初では拡大倍率は“１”となり、それ以後は最近傍法の場合と同様の計算方法で整数倍率を求める。最初の近傍エリアのみ整数倍率を“１”にするための方法は、次の２つが考えられる。
【０１３９】
（１）上端または左端の場合とそうでない場合とにループを分ける。
（２）整数倍率を計算する式に条件判定を入れ、画素の位置が上端または左端の場合には整数倍率を“１”にするようにする。
しかしながら、上記（１）の方式は処理が複雑になり、プログラムサイズが大きくなる欠点がある。（２）の方式は条件判定が１つ増えるため、プログラムの実行速度が落ちてしまう。この具体例１０では、プログラムサイズもあまり大きくならず、実行速度も落ちない方法を紹介する。これは次の考え方で実現できる。
【０１４０】
（１）具体例９の最近傍法の場合に用いた変数の他に、現在の整数倍率を示す変数ＭＵＬＸを用意する。
（２）ＭＵＬＸは近傍エリアを走査するループの先頭で、“１”に初期化する。
（３）拡大率の計算のタイミングをループの先頭ではなく、後方で行うように変更する。
【０１４１】
こうすることで、ＭＵＬＸにはループの始めでは“１”が、それ以降ではＢＡＳＥＸ１またはＢＡＳＥＸ２が入ることになる。
なお、これは横方向についてのみ説明したが、縦方向についても全く同様である。
【０１４２】
図６０に、具体例１０の装置のブロック図を示す。
この装置は、外部記憶装置１１１、一次補間拡大／縮小装置１１２及び出力画像フレームバッファ１１９から構成される。一次補間拡大／縮小装置１１２は、倍率計算部１１３、一次補間拡大／縮小処理部１１４、前行ポインタ１１５、現行ポインタ１１６、ラインバッファ１１７、ラインバッファ１１８により構成される。
【０１４３】
この装置は、具体例９の装置と比較すると、前行ポインタ１１５、現行ポインタ１１６、ラインバッファ１１７及びラインバッファ１１８を備えた点が異なる。近傍エリアを作るためには、上下２ラインの画素が必要であるため、このように２ライン分のラインバッファを用意した。この２ライン分のラインバッファ１１７，１１８は、上下が交互に入れ替わるので、上の行を示すポインタを前行ポインタ１１５、下の行を示すポインタを現行ポインタ１１６として区別した。
【０１４４】
図６１には、倍率計算部のブロック図を示す。
この倍率計算部１１３は、具体例９の場合と同様、Ｘ座標１２１、Ｙ座標１２２を受け入れて、Ｘ方向倍率１２４及びＹ方向倍率１２５を出力する回路である。倍率計算部１１３の中には、乗算部１２６，１２７、比較／選択部１２８，１２９及び倍率計算部１２３が設けられている。具体例９の場合と異なるのは、比較／選択部１２８の出力側にＭＵＬＸ１３１が設けられ、比較／選択部１２９の出力側にＭＵＬＹ１３２が設けられた点である。
【０１４５】
これらのレジスタＭＵＬＸ，ＭＵＬＹは、倍率を格納するレジスタである。このレジスタの初期値に“１”を入れておくことにより、最初の近傍エリアの拡大率を“１”にすることができる。
【０１４６】
図６２には、具体例１０の動作フローチャートを示す。
まず、ステップＳ１において、倍率計算部のレジスタ設定を実行する。この各レジスタに格納される値は、後で詳しく説明するが、レジスタＭＵＬＸ及びＭＵＬＹに、それぞれ“１”を入れておくことが重要である。次に、ステップＳ２において、外部記憶装置から現行ポインタ１１６が指し示すラインバッファ１１７あるいは１１８にデータを読み込む。
【０１４７】
そして、ステップＳ３において、これらのラインバッファを使用して一次補間を行う。ステップＳ４は、このステップＳ３の処理をＸ方向の倍率分繰り返す制御である。倍率を示すレジスタＭＵＬＸは、“１”に初期化されている。Ｘ方向の拡大／縮小のループが終了したら、次のＸ方向の拡大率を計算し、ＭＵＬＸに格納する。そして、ステップＳ６において、以上の処理を必要なライン幅だけ行ったかどうかを判断する。
【０１４８】
ステップＳ７では、次の行の処理を行うために、ＭＵＬＸを１に設定する。ステップＳ８は、ステップＳ３からステップＳ７までの１行分の一次補間処理をＹ方向の拡大幅分即ちＭＵＬＹ分実行する制御である。ＭＵＬＹも初期値は“１”に設定されている。
次に、ステップＳ９において、Ｙ方向の倍率を計算し、ＭＵＬＹに格納する。ステップＳ１０は、バッファポインタを入れ替えることによって更新する。そして、ステップＳ１１において、ステップＳ２〜ステップＳ１０までの処理を入力画像のライン数分繰り返す制御を行う。
【０１４９】
図６３には、倍率計算部のレジスタ設定フローチャートを示す。
ここでも、具体例９の場合と同様に、図６１に示した倍率計算部１１３の各レジスタのビット幅をＮビットとする。入力画像の幅Ａと出力画像の幅Ｂから実数倍率ｍｕｌを求める（ステップＳ１１）。次に、求めた実数倍率ｍｕｌを整数部と小数部とに分離する（ステップＳ１２）。ＢＡＳＥは整数部、ＤＥＣは小数部である。
【０１５０】
次に、ＢＡＳＥＸ１にＢＡＳＥをセットする（ステップＳ１３）。また、ＢＡＳＥＸ２にＢＡＳＥ＋１を設定する（ステップＳ１４）。更に、ＤＥＣに２Ｎを掛け１を加えた値を設定する（ステップＳ１５）。最後にステップＳ１６において、ＭＵＬＸを“１”に初期化する。例えば、入力画像の幅が３で、出力画像の幅が６の場合には、ｍｕｌは次の式で求められる。
ｍｕｌ＝（６−１）／（３−１）
＝２．５
更に、ＤＥＣＸ１は、次の式で求められる。
ＤＥＣＸ１＝ＤＥＣ＊２Ｎ＋１
＝０．５＊２３２＋１
＝2,147,483,649
【０１５１】
図６１に示した比較／選択部１２８は、ＤＥＣＸ１とＤＥＣＸ２の大小関係に応じてＢＡＳＥＸ１あるいはＢＡＳＥＸ２のどちらかを選択し、Ｘ方向倍率としてＭＵＬＸレジスタにセットする。但し、ＤＥＣ２は一次補間拡大／縮小処理部で管理されるＸ座標とＤＥＣＸ１とを掛け合わせた結果である。検索結果が２Ｎを超える場合には、比較／選択の規則は次の通りになる。
ＤＥＣＸ２≧ＤＥＣＸ１の場合、倍率はＢＡＳＥＸ１
ＤＥＣＸ２＜ＤＥＣＸ１の場合、倍率はＢＡＳＥＸ２
以上の計算を近傍エリアごとに行えば、図１９で示した近傍エリアテーブルを保持しておく必要が無い。
【０１５２】
〈具体例１０の効果〉
以上の例によれば、一次補間法による画像データの実数倍率の拡大／縮小において、拡大倍率を保持するレジスタを利用し、具体例９で説明したアルゴリズムを併用して、近傍エリアテーブル保持によるメモリ効率の低下を解消した。なお、一次補間法による画像データの実数倍率の拡大／縮小をこれにより、高速でかつ省メモリにより実現できる。
【０１５３】
〈具体例１１〉
印字しようとするイメージが印字可能な領域をはみ出る場合、イメージを印字領域の大きさに合わせて切り取る必要がある。この切り取る作業をクリッピングと呼ぶ。
図６４には、クリッピングが必要な例説明図を示す。
この例では、イメージを最近傍法で５倍に拡大して印字している。図の黒塗り部分１３５が最近傍法で５倍に拡大されたイメージである。そのドット構成を下側に示す。丸印は各画素である。
【０１５４】
ここで、図の上側に白枠で示した部分を印字可能領域とすると、黒塗りの領域１３５の左側は、印字可能領域をはみ出している。即ち、このイメージの左側は印字されずクリッピングされてしまう。領域１３８は、横方向に画素を５倍に拡大した有効な部分である。領域１３７と１３６とは、画素を横方向に５倍に拡大したものの、左側の領域１３６は印刷されないから捨てられる。このように、クリッピングされる境界は、拡大画像の途中に来ることが普通である。また、拡大処理は印字領域内にあるイメージ分だけ行えばよく、印字領域外で行う必要はない。即ち、領域１３６の黒丸のデータは、単に捨ててしまってもよい。以上の点から、クリッピングを考慮すると、イメージの端は通常と異なる拡大率であってもよいことになる。
【０１５５】
図の例では、印字可能領域の境界線を１３９とした場合に、境界線の内側即ち領域１３８より右側の白丸のドットは全て印字されるから、５倍に拡大する。境界線１３９と接する領域１３７の白丸のドットは３倍に拡大する。また、境界１３９外の部分にある領域１３６の黒丸のドットは、印字されないから、拡大しない。こうしたクリッピングを実現するために、画像の部分的な拡大率が通常の拡大率と異なる制御をする必要がある。
【０１５６】
この具体例では、実数倍の拡大／縮小において、左側または上側のクリッピングを効率よく行う方法を提供する。なお、これから説明する例は、上側または左側のクリッピングにとくに適した方法である。
【０１５７】
以上の具体例１１を実現するために、まず拡大率を保持するレジスタＭＵＬＸまたはＭＵＬＹを用意する。なお、これらのレジスタをまとめてレジスタＭＵＬと呼ぶ。画像の左端、上端については、拡大率を計算するのではなく、ＭＵＬの初期値を拡大率として用いる。ここは、具体例１０と同様である。ＭＵＬの初期値は具体例１０では常に“１”であったが、この具体例では条件によって異なる。従って、左端、上端の拡大率を予め計算する。
【０１５８】
図６５には、具体例１１の装置のブロック図を示す。
この装置は、外部記憶装置１４１、最近傍法拡大／縮小装置１４２及び出力画像フレームバッファ１４３から構成される。また、最近傍法拡大／縮小装置１４２は、倍率計算部１４４、クリッピング計算装置１４５、最近傍法拡大／縮小装置１４６及びラインバッファ１４７から構成される。
【０１５９】
この装置を具体例９の装置と比較した場合、クリッピング計算装置１４５が追加されている部分が異なる。このクリッピング計算装置１４５は、画素の位置情報と印字可能領域の情報をもとに、印字領域の上端と左端の画素の拡大倍率を計算する部分である。この結果は倍率計算部１４４の内部に設けられたレジスタＭＵＬＸ及びＭＵＬＹに格納される。
【０１６０】
図６６に、具体例１１の動作フローチャートを示す。
まず、ステップＳ１において、上端、左端の拡大倍率をクリッピング計算装置１４５を用いて計算する。次にステップＳ２で、倍率計算部で用いるレジスタを初期化する。この場合、レジスタＭＵＬＸ及びＭＵＬＹは、ステップＳ１で求めた値を設定する。次に、ステップＳ３において、外部記憶装置から１ライン分のデータを読み込み、ラインバッファに格納する。
【０１６１】
次に、ステップＳ４において、現在の入力画像の画素を出力画像フレームバッファに複製する。次に、ステップＳ５において、Ｘ方向倍率分この処理を繰り返す制御を行う。また、ステップＳ６では、Ｘ方向倍率に相当するレジスタＭＵＬＸの内容をアップデートする。なお、この倍率計算の仕方は、具体例１０の場合と同様である。即ち、ＤＥＣＸ２がＤＥＣＸ１よりも大きければ、ＢＡＳＥＸ１を選択し、そうでなければＢＡＳＥＸ２を選択する。
【０１６２】
ステップＳ４〜ステップＳ６までの処理を入力画像ライン幅分繰り返す（ステップＳ７）。次の行の処理を行うために、ＭＵＬＸに左端の画素の拡大率を設定する（ステップＳ７）更に、ステップＳ４〜ステップＳ８までの処理をＹ方向倍率回数繰り返す（ステップＳ９）。また、Ｙ方向倍率計算によりレジスタＭＵＬＹの値をアップデートする（ステップＳ１０）。倍率計算の仕方は具体例１１の場合と同様で、ＤＥＣＹ２がＤＥＣＹ１よりも大きければＢＡＳＥＹ１を選択し、そうでなければＢＡＳＥＹ２を選択する。ステップＳ４〜ステップＳ１０の処理を入力ライン数分繰り返す制御を行い（ステップＳ１１）、全てのライン数分を実行して処理を実行する。
【０１６３】
図６７に、倍率計算部レジスタ設定のフローチャートを示す。
図のステップＳ１１〜ステップＳ１４までの処理は、具体例９の処理と同一である。即ち、実数倍率ｍｕｌの整数部をＢＡＳＥに、小数部分をＤＥＣに設定する。そして、レジスタＢＡＳＥＸ１にはＢＡＳＥを、レジスタＢＡＳＥＸ２にはＢＡＳＥ＋１を設定する。その後、レジスタＤＥＣＸ１には、ＤＥＣ＊２Ｎ＋１を設定し、ＭＵＬＸに、クリッピング計算装置を用いて計算した左端の画素の拡大率を設定する。
【０１６４】
〈具体例１１の効果〉
以上の例によれば、最近傍法による画像データの実数倍の拡大／縮小において、クリッピングが必要な場合においても、先頭の倍率計算を行うレジスタにその倍率を予め計算し、設定するようにしたので、実数倍率の拡大／縮小を高速かつ省メモリで実現することが可能になる。もちろん、一次補間による様々な拡大／縮小処理において、クリッピングに対処することが可能になる。
【図面の簡単な説明】
【０１６５】
【図１】具体例１による拡大／縮小処理部の動作説明図である。
【図２】具体例１による画像データ拡大／縮小装置のブロック図である。
【図３】整数倍率の拡大法説明図である。
【図４】最近傍法による拡大／縮小処理説明図である。
【図５】具体例１の拡大／縮小方法を示すフローチャートである。
【図６】モジュロ演算を用いる画像拡大／縮小装置のブロック図である。
【図７】拡大／縮小テーブルの冗長性の説明図である。
【図８】割り算の余りを求める計算（モジュロ演算）の説明図である。
【図９】具体例２の拡大／縮小方法動作フローチャートである。
【図１０】具体例３による拡大／縮小装置のブロック図である。
【図１１】従来より画像の拡大／縮小処理に採用されていた画素値補正のためのリサンプリングの説明図である。
【図１２】正方格子の説明図である。
【図１３】一次補間の一般的計算法説明図である。
【図１４】具体例３による一次補間の説明図である。
【図１５】具体例３による一次補間の処理例説明図である。
【図１６】具体例３の装置の動作フローチャートである。
【図１７】具体例４の原理説明図である。
【図１８】具体例４の装置のブロック図である。
【図１９】近傍エリアテーブルの説明図である。
【図２０】ラインバッファの説明図である。
【図２１】画像データ格納処理説明図である。
【図２２】近傍エリアの拡大図である。
【図２３】具体例４の動作フローチャートである。
【図２４】具体例４の計算内容説明図である。
【図２５】具体例５の装置のブロック図である。
【図２６】ドット間の相関関係説明図である。
【図２７】ドット間の相関関係説明図である。
【図２８】具体例５の装置の動作フローチャートである。
【図２９】具体例６の装置のブロック図である。
【図３０】グループ定義説明図（その１）である。
【図３１】グループ定義説明図（その２）である。
【図３２】グループ定義説明図（その３）である。
【図３３】グループ定義説明図（その４）である。
【図３４】グループの領域説明図である。
【図３５】境界画素を利用した平均法の説明図である。
【図３６】境界画素の判定基準説明図である。
【図３７】平均法のデータの流れ（横方向）の説明図である。
【図３８】平均法のデータの流れ（縦方向）の説明図である。
【図３９】サンプリングされる入力画素の説明図である。
【図４０】具体例６の動作フローチャートである。
【図４１】割り算処理のフローチャートである。
【図４２】具体例７の装置のブロック図である。
【図４３】サンプリング後の画像説明図である。
【図４４】具体例７の動作フローチャートである。
【図４５】具体例８の装置のブロック図である。
【図４６】具体例８の処理説明図である。
【図４７】サンプリング領域の説明図である。
【図４８】具体例８の動作フローチャートである。
【図４９】具体例８の初期化処理フローチャートである。
【図５０】妥当なアルゴリズムの説明図である。
【図５１】繰り上がり発生の判定方法説明図である。
【図５２】具体例９の装置のブロック図である。
【図５３】具体例９の倍率計算部のブロック図である。
【図５４】具体例９の動作フローチャートである。
【図５５】拡大／縮小の処理過程の説明図である。
【図５６】倍率計算部レジスタ設定のフローチャートである。
【図５７】Ｘ方向倍率計算のフローチャートである。
【図５８】近傍エリアの説明図である。
【図５９】最近傍法と一次補間との処理の順番の違い説明図である。
【図６０】具体例１０の装置のブロック図である。
【図６１】具体例１０の倍率計算部のブロック図である。
【図６２】具体例１０の動作フローチャートである。
【図６３】倍率計算部レジスタ設定のフローチャートである。
【図６４】クリッピングが必要な例説明図である。
【図６５】具体例１１の装置のブロック図である。
【図６６】具体例１１の動作フローチャートである。
【図６７】倍率計算部レジスタ設定のフローチャートである。
【符号の説明】
【０１６６】
３  入力画像データ
４  出力画像データ
１Ｘ，１Ｙ  拡大／縮小テーブル
【図１】
2004288198.tif 000003
【図２】
2004288198.tif 000004
【図３】
2004288198.tif 000005
【図４】
2004288198.tif 000006
【図５】
2004288198.tif 000007
【図６】
2004288198.tif 000008
【図７】
2004288198.tif 000009
【図８】
2004288198.tif 000010
【図９】
2004288198.tif 000011
【図１０】
2004288198.tif 000012
【図１１】
2004288198.tif 000013
【図１２】
2004288198.tif 000014
【図１３】
2004288198.tif 000015
【図１４】
2004288198.tif 000016
【図１５】
2004288198.tif 000017
【図１６】
2004288198.tif 000018
【図１７】
2004288198.tif 000019
【図１８】
2004288198.tif 000020
【図１９】
2004288198.tif 000021
【図２０】
2004288198.tif 000022
【図２１】
2004288198.tif 000023
【図２２】
2004288198.tif 000024
【図２３】
2004288198.tif 000025
【図２４】
2004288198.tif 000026
【図２５】
2004288198.tif 000027
【図２６】
2004288198.tif 000028
【図２７】
2004288198.tif 000029
【図２８】
2004288198.tif 000030
【図２９】
2004288198.tif 000031
【図３０】
2004288198.tif 000032
【図３１】
2004288198.tif 000033
【図３２】
2004288198.tif 000034
【図３３】
2004288198.tif 000035
【図３４】
2004288198.tif 000036
【図３５】
2004288198.tif 000037
【図３６】
2004288198.tif 000038
【図３７】
2004288198.tif 000039
【図３８】
2004288198.tif 000040
【図３９】
2004288198.tif 000041
【図４０】
2004288198.tif 000042
【図４１】
2004288198.tif 000043
【図４２】
2004288198.tif 000044
【図４３】
2004288198.tif 000045
【図４４】
2004288198.tif 000046
【図４５】
2004288198.tif 000047
【図４６】
2004288198.tif 000048
【図４７】
2004288198.tif 000049
【図４８】
2004288198.tif 000050
【図４９】
2004288198.tif 000051
【図５０】
2004288198.tif 000052
【図５１】
2004288198.tif 000053
【図５２】
2004288198.tif 000054
【図５３】
2004288198.tif 000055
【図５４】
2004288198.tif 000056
【図５５】
2004288198.tif 000057
【図５６】
2004288198.tif 000058
【図５７】
2004288198.tif 000059
【図５８】
2004288198.tif 000060
【図５９】
2004288198.tif 000061
【図６０】
2004288198.tif 000062
【図６１】
2004288198.tif 000063
【図６２】
2004288198.tif 000064
【図６３】
2004288198.tif 000065
【図６４】
2004288198.tif 000066
【図６５】
2004288198.tif 000067
【図６６】
2004288198.tif 000068
【図６７】
2004288198.tif 000069