説明

画像処理装置、画像処理方法、プログラムおよび記録媒体

【課題】移動情報を格納する領域をより少なくする。
【解決手段】画像90度回転処理部16は、画像上の各画素毎に移動済か否かの移動情報を格納する格納部を備え、移動済か否かの移動情報として、画像の全画素数をNとしたとき、全画素数Nではなく、(N+1)/2個の画素数を格納する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、画像を回転処理する画像処理装置、画像処理方法、プログラムおよび記録媒体に関する。
【背景技術】
【0002】
本出願人は先に、より小さなメモリ領域上で、画像を90度単位で回転処理する画像処理装置を提案した(特許文献1を参照)。すなわち、画像データ上の回転開始画素の回転後位置を算出する算出工程と、前記回転後位置の画素の画素値を、一時格納部に格納する格納工程と、前記回転後位置の画素の画素値を、前記回転開始画素の画素値に変更する変更工程と、前記回転開始画素を前記回転後位置の画素に置き換えて、前記算出工程、格納工程、変更工程の各処理を繰り返す連鎖処理工程により、前記画像データ上の全画素が一回の移動により回転後の位置に移動される。
【0003】
図4(a)〜(d)は、それぞれ2×2ドット画像(a〜dの画素)、2×3ドット画像(a〜fの画素)、2×4ドット画像(a〜hの画素)、4×3ドット画像(a〜lの画素)を左回りに90度回転処理する場合の移動前後の画素状態と、移動で連鎖する画素の位置関係を矢印で表す。
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかし、上記した技術では、回転処理中に移動済か否かを示す移動情報を全画素(例えば、図4(a)では4画素分、(d)では12画素分)について格納しているため、移動情報を格納する領域として回転対象となる画像の全画素分の領域を確保する必要があった。
【0005】
本発明は、上記した課題に鑑みてなされたもので、
本発明の目的は、移動情報を格納する領域をより少なくした画像処理装置、画像処理方法、プログラムおよび記録媒体を提供することにある。
【課題を解決するための手段】
【0006】
本発明は、画像上の回転開始画素の回転後位置を算出する算出手段と、前記回転後位置の画素の画素値を格納する格納手段と、前記回転後位置の画素の画素値を、前記回転開始画素の画素値に変更する変更手段と、前記回転開始画素を前記回転後位置の画素に置き換えて、前記算出手段、格納手段、変更手段を繰り返す連鎖処理を実行する連鎖処理手段を備え、前記画像上の全画素が一回の移動により回転後の位置に移動される画像処理装置であって、前記画像上の各画素毎に移動済か否かの移動情報を格納する移動情報格納手段を備え、前記移動済か否かの移動情報として、前記画像の全画素数をNとしたとき、(N+1)/2個(小数以下切捨て)の画素数を格納することを最も主要な特徴とする。
【発明の効果】
【0007】
本発明によれば、移動済か否かの移動情報として、全画素の半分の移動情報の格納で済む。
【図面の簡単な説明】
【0008】
【図1】本発明の実施例の構成を示す。
【図2】画像回転処理のフローチャートを示す。
【図3】本発明の処理フローチャートを示す。
【図4】画像の回転例を説明する図である。
【発明を実施するための形態】
【0009】
以下、発明の実施の形態について図面により詳細に説明する。
【実施例1】
【0010】
図1は、本発明の実施例の構成を示す(前掲した公報の図2に対応)。画像処理装置は、CPU11、ROM12、RAM13、時計回路14、磁気ディスク装置15、画像90度回転処理部16、ソースデータ符号化部17、画像領域ノイズ除去部18、画像領域内グラデーション化部19、画像領域内面積算出部20、画像領域内変更後の活用部21、CRT画面表示装置22、表示制御部23、キーボード装置24、画面指示装置25、入力制御部26、ネットワークI/F27、ネットワーク伝送制御部28、バス29を有する。
【0011】
CPU11は、画像処理装置の動作を制御し、ROM12は、CPU11が起動時に実行するプログラムや必要なデータ等を記憶し、RAM13は、CPU11のワークエリア等を構成する記憶装置であり、時計回路14は、現在の日時情報を出力し、磁気ディスク装置15は、アプリケーションプログラム、ワークデータ、ファイルデータ、画像データなどを記憶する。
【0012】
画像90度回転処理部16は、磁気ディスク装置15に格納されている画像データに対して、右回りまたは左回りに90度単位で回転処理を施し、回転処理が施された画像データは、磁気ディスク装置15に保存された後、後述する画像領域内変更後の活用部21に送信される。
【0013】
ソースデータ符号化部17は、後述する入力制御部26で入力された暗号化または符号化指示に基づき、磁気ディスク装置15に格納された画像データに対して暗号化または符号化を行う。ソースデータ符号化部17により暗号化または符号化された画像データは、磁気ディスク装置5に保存された後、画像90度回転処理部16、後述の画像領域ノイズ除去部18、画像領域内グラデーション化部19、または画像領域内面積算出部20などに送信される。
【0014】
画像領域ノイズ除去部18は、磁気ディスク装置15に格納されている画像データに対して特定画像領域のノイズを除去し、ノイズ除去されたデータは、磁気ディスク装置15に保存された後、後述の画像領域内変更後の活用部21に送信される。画像領域内グラデーション化部19は、磁気ディスク装置15に格納されている画像データに対して特定画像領域内をグラデーション化し、特定画像領域内をグラデーション化されたデータは、磁気ディスク装置15に保存された後、後述の画像領域内変更後の活用部21に送信される。
【0015】
画像領域内面積算出部20は、磁気ディスク装置15に格納されている画像データに対して特定画像領域内のドット面積を算出し、特定画像領域内のドット面積を算出した算出データは、磁気ディスク装置15に保存された後、後述の画像領域内変更後の活用部21に送られる。
【0016】
画像領域内変更後の活用部21は、画像90度回転処理部16、画像領域ノイズ除去部18、画像領域内グラデーション化部19、または画像領域内面積算出部20などで変更(加工)または算出された画像データや算出データを使用して、例えば画像編集、画像圧縮あるいは符号化などの応用処理を行う。
【0017】
CRT画面表示装置22は、画像処理装置を操作するための画面を表示し、表示制御部23は、CRT画面表示装置22の表示内容を制御し、キーボード装置24は、画像処理装置に対してキー操作を行い、画面指示装置25は、CRT画面表示装置22の任意の点を指示する等の操作作業を行う、例えば、操作パネル等である。入力制御部26は、キーボード装置24および画面指示装置25の入力情報を取り込む等の入力に係る制御を行い、ネットワークI/F27は、画像処理装置を図示しない外部ネットワーク等に接続するためのネットワークインタフェース回路等のインタフェース装置であり、ネットワーク伝送制御部28は、画像処理装置がネットワークI/F27を介して外部に接続された図示しない他の端末装置との間で情報伝送を制御する。
【0018】
上記した構成により、磁気ディスク装置15に格納されている(あるいは入力された)画像データは、画像90度回転処理部16により90度単位の回転処理を施され、回転処理が施された画像データは、例えば表示制御部23によってCRT画面表示装置22へ表示されるなどの出力処理が施される。
【0019】
図2は、画像回転処理のフローチャートを示す(前掲した公報の図3に対応)。画像回転処理の一例として画像データを左回り90度単位で回転する処理を説明する。
【0020】
まず、各種設定を入力する(S1)。画像処理装置は、例えばキーボード装置24のキー入力に基づき、(1)画像回転処理の対象画像データ、(2)処理の種類(左回り90度など90度単位の回転処理)、(3)後述する連鎖処理(ステップS9〜S13)の最初の開始画素(例えば画像データの先頭を基準とした相対アドレスで示す:オフセット値a=0)、(4)2回目以降の連鎖処理の開始画素の順番(例えば画像データの先頭を基準とした相対アドレス順)などの各種設定情報を入力する。なお、ここでは、(4)の2回目以降の連鎖処理の開始画素の順番は、画像データの左上端の画素から右下端の画素の順番であるとする。
【0021】
ステップS2で各種初期設定を行う(S2)。画像処理装置は、ステップS1で入力された各種設定情報に基づき、初期設定を行う。例えば、予め用意した連鎖処理の開始画素のアドレスを格納するアドレス変数Asに、上記(3)で入力された最初の開始画素を設定する(As=a=0)。ステップS3で、全画素を開始画素にした連鎖処理は終了したか否かを判定する(S3)。ステップS3では、画像回転処理の終了を判定する。アドレス変数Asに設定された開始画素が対象画像データの最後尾(ここでは右下端)に達したか否かにより判定している。即ち、画像回転処理の終了は、対象画像データ中の上記(4)で入力された順番において最後の画素に対する処理が終了した場合である。ステップS3でYESの場合(S3、YES)、画像回転処理は正常に終了したため、ステップS4で後処理を行う(S4)。ステップS4では、画像処理装置は、対象画像データの90度回転処理の実施/未実施の判断結果を報告したり、実施の場合には処理後の対象画像データを磁気ディスク装置15に格納する等の後処理を行う。
【0022】
ステップS3でNoの場合(S3、No)、画像回転処理は終了していないので、ステップS5へ移る。ステップS5では、ステップS2または後述のステップS14で設定された連鎖処理の開始画素を、現注目画素に設定する(S5)。ここでは、ステップS2または後述のステップS14でアドレス変数Asに設定された位置の画素を、現注目画素に設定する。現注目画素とは画像処理装置が現に処理対象とする一画素である。具体的には、予め用意した現注目画素のアドレスを格納する現注目画素位置Aにアドレス変数Asを設定することにより行う(A=As)。これにより、現に処理対象とする一画素を特定すると共に、以降のステップS6〜S8に示す連鎖処理のチェック処理を行う。
【0023】
続いてステップS6で、現注目画素の回転後位置A1を算出する(S6)。ここでは、ステップS5で設定された現注目画素の回転後位置A1を算出する。
具体的には、
A1=(Floor(A/W)+1)×(W×L+1)−1−L×(1+A) 式(1)
(Floor(z)はzを超えない最大整数である。ただし、Aは現注目画素の位置、Wは回転前の対象画像データの横幅画素数、Lは回転前の対象画像データの縦幅画素数)で示される計算により算出する。
【0024】
ステップS7では、ステップS6で算出された回転後位置A1にある画素は回転済みか否かを判定する(S7)。ステップS7では、連鎖処理を二重に行うことを防ぐために、回転後位置A1にある画素が回転済みか否かを判定している。具体的には、画像処理装置は、ステップS6で算出した回転後位置A1が、アドレス変数Asのアドレス値も上位アドレスになっているか(即ちA1<As)否かにより判定する。これは、アドレス変数Asのアドレス値よりも上位アドレスにある画素については既に連鎖処理されたものであるとみなすことができるからである。
【0025】
ステップS7でYESの場合(S7、YES)、回転後位置A1にある画素は既に回転済みであり、当該連鎖処理空間(ステップS5で設定された現注目画素を開始画素として行う一連の連鎖処理)は既に連鎖処理が済んでいるものとみなして、当該連鎖処理空間のこれ以上の連鎖処理を回避するために、ステップS14へ移る。
【0026】
ステップS7でNoの場合(S7、No)、回転後位置A1にある画素は未回転であり、当該連鎖処理空間は、未だ対象画像データの90度回転処理のためデータ移動がされていないと判断して、ステップS8へ移る。ステップS8では、現在処理中の連鎖処理が終了か否かを判定する(S8)。ここでは、回転後位置A1と開始画素のアドレスAsとが同一か否かにより、現在処理中の連鎖処理が終了か否かを判定している。これは、回転後位置A1と開始画素のアドレスAsとが同一である場合は、回転後位置が開始画素のアドレスに戻ってきたと判断するためである。ステップS8でYESの場合(S8、YES)、ステップS9へ移り、ステップS8でNoの場合(S8、No)、ステップS6へ戻る。
【0027】
以上説明したステップS5〜S8の一連の処理は、当該連鎖処理空間が90度回転処理に係る画素の移動を終了しているか否かを判定する処理である。なお、予め対象画像データの画素毎に、回転後位置に移動されたか否か(移動済か否か)の移動情報を示す、例えば1ビットの指標領域(移動情報格納部)を設けて、回転処理が施された画素の移動情報は、未移動(例えばビット値0)から移動済(例えばビット値1)に変更するようにしてもよい。この場合、ステップS6〜S8に係る繰り返し工程の代わりに、ステップS5で設定された現注目画素の移動情報を確認する工程を設けることにより、当該連鎖処理空間が90度回転処理に係る画素の移動を終了しているか否かを更に高速に判定することができる。これは、1ビット/ドットの画像データの90度回転処理には向かない(移動情報の領域が確保できれば、回転後の画像データを直接この領域に格納できるため)。一方、2ビット/ドット以上の画像データの90度回転処理では、この領域以外には回転時の画素値退避用として作業領域を1画素データ分だけしか確保(90度回転して1画素ずつ移動する時の移動先の画素値を格納する)出来ない条件下では、高速化が最大になる方法である。
【0028】
高速化が最大になる理由は、左上端から右下端の順番に全画素に連鎖処理を施す途中で、それぞれの画素を移動処理する前に、この移動情報格納部を確認することにより、既に移動処理が施されていれば、移動処理を回避できるためである。即ち、連鎖処理による複数画素(同一連鎖内)の位置確認を行なう必要がないことによる。
【0029】
ところで、連鎖処理と、左上端から右下端の順番に全画素に適用する方法を同時に実施すると、画素位置の重複が出現する。この重複を避けるために、画像データ全体の全画素に個別に対応する90度回転のための変換済みフラグビット(画素数分のビット数を持ち、初期値はOFFとする)を設け、左上端から右下端の順番に全画素を連鎖処理規則の開始画素として適用する過程において、それぞれの開始画素から連鎖処理の経過点のフラグビットをONにする過程で、変換済みフラグビットが既にONの場合は、以前の開始画素からの連鎖処理が既に行われた経過点であるとみなして、現在の開始画素からの連鎖処理を回避する効率のよい回避処理が実現できる。
【0030】
図2に戻り、ステップS9では、連鎖処理を開始する(S9)。ここでは、ステップS2または後述のステップS14でアドレス変数Asに設定された位置の画素を、現注目画素に設定する。現注目画素とは前述したように現に処理対象とする一画素である。具体的には、現注目画素位置Aにアドレス変数Asを設定し(A=As)、さらにここでは、予め用意した現注目画素の画素値を格納するための現注目画素値格納用変数NowDotに、アドレス変数Asに設定された位置の画素の画素値を設定する。
【0031】
ステップS10では、現注目画素の回転後位置を算出する(S10)。ここでは、ステップS9で設定された現注目画素Aの回転後位置A1を式(1)により算出する。
【0032】
続いて、ステップ11では、ステップS10で算出された回転後位置A1にある画素の画素値を更新する(S11)。ここでは、回転後位置A1の画素値を現注目画素の画素値に変換する処理を行う。具体的には、回転後位置A1にあった画素の画素値を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値)に変更する。これにより、回転後位置A1にある画素の画素値を更新する。
【0033】
続いて、ステップS12では、ステップS10で算出された回転後位置A1にあった画素を現注目画素に変換する(S12)。ステップS12は、連鎖処理を行うために現注目画素を置き換える処理である。具体的には、現注目画素位置AにステップS10で算出された回転後位置A1を設定すると共に、ステップS11で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値を現注目画素値格納用変数NowDotに格納する。
【0034】
以上説明したステップS11、S12の処理は、90度単位の回転処理のための画素データの移動における連鎖処理でデータが失われないように、最も少ない量の画素データ(ここでは一画素)を退避させる処理と回復処理を行っている。
【0035】
続いて、ステップS13では、現在処理中の連鎖処理が終了か否かを判定する(S13)。ステップS13では、回転後位置A1とアドレス変数Asのアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定している。これは、回転後位置A1と開始画素のアドレス変数Asとが同一である場合は、回転後位置A1が開始画素のアドレスに戻ってきたと判断するためである。
【0036】
ステップS13でYESの場合(S13、YES)、現在処理中の連鎖処理は終了したので、ステップS14では、次の連鎖処理のための開始画素のアドレスを設定する(S14)。例えばAs=As+1(例えば、前回の連鎖処理の開始画素の右隣りの画素。それが右端の場合は、次の行の左端の画素)によりアドレス変数Asを再設定する。
【0037】
ステップS14は、次に続く連鎖処理空間の処理を行うために、次の連鎖処理空間の処理開始画素を再設定する処理である。ステップS14の処理が終了すると、ステップS3へ戻る。なお、再設定される次の連鎖処理空間の処理開始画素は、画像データ上の未移動画素にすることもできる。未移動の画素の決定は、ステップS5〜S8において説明した、移動情報格納部に格納された移動情報に基づいて行ってもよい。
【0038】
ステップS13でNoの場合(S13、No)、現在処理中の連鎖処理は終了していないので、ステップS10へ戻って、ステップS12で変換された現注目画素についてのステップS10〜S12の処理を繰り返す。
【0039】
以上の処理により、画像データを左回り90度単位に回転する処理が実施される。上記した動作例では、入力された画像データを90度単位(右回りまたは左回り)に回転処理するために、1画素毎の回転後の画素位置を座標変換して求め、その位置の画素値を回転後の画素値として変更している。また、この求めた先の座標位置の変更(回転)前の画素値についても、同様にして回転後の画素位置を算出し、求まった座標位置の画素値を回転後の画素値として変更していく連鎖処理を規則とし(以降、このような規則を「連鎖処理規則」という)、この規則を左上端位置の画素から右下端の順番に全画素に適用して全画素を1回ずつ移動することにより、画像回転のための部分画像領域の一時退避用の作業領域が1画素分の領域ですむ。
【0040】
また、上記した連鎖処理の規則と、左上端から右下端の順番に全画素に適用する方法の両方を同時に行なうと、画素位置の重複が出現するので、この重複を回避するために、全画素位置に漏れなく配置されている1個以上の連鎖処理空間(一つの連鎖処理空間は、スタート点がどこでも連鎖処理により画素を辿るとスタート点に戻る閉じた特徴がある)に注目し、90度回転のための画素値移動済みか(注目する1連鎖処理空間内の画素値ローテーション済み)否かを判断するために、連鎖処理の開始画素を全画素の画素位置として、現注目画素を画像の端から順番に調べることもできる。
【0041】
現在注目している画像座標上の画素に繋がる一つの連鎖処理空間が、これまで調べてきた画像座標(例えば上位位置)に繋がっていない場合は、90度回転用画素移動のための内部データローテーションが行なわれていない連鎖処理空間とみなして、内部データローテーションを、一つの連鎖処理空間内の内部データローテーションを途中で止めて、次の連鎖処理空間を捜索することなく行う。
【0042】
通常、スキャナやカメラで読取る画像は矩形であり、矩形内の画像の特徴として、線形状や帯状(水平・地平線は横、柱は縦、床・天井は横など)のものが矩形の縦線または横線に平行して存在する。本実施例の画像回転処理方法によれば、画質の劣化が発生しない特徴を持つ画像の縦横を変更(画像を90度単位で回転)する機能が、画像回転用の作業領域を不要(または最小化)とし、また回転処理を高速化することができる。
【0043】
次に、上記した連鎖処理の点対称性を説明する。前述したように、現注目画素Aの回転後位置A1は、式(1)により算出される。
【0044】
矩形画像の領域の形は、上下、左右の対称であることから、矩形の中心について、点対称位置に対応する2点の画素同士は、90度回転処理において、90度回転後の位置も点対称の関係にある。
【0045】
それを以下に示す。
Aの90度回転後の位置A1の最終画素点からの距離(L〜A1)は、
L〜A1=W×L−1−A1
=L×(1+A)−Floor(A/W)×(W×L+1)−1 (1)
である。
【0046】
一方、Aの画素中心からの点対称に当たる画素位置reAは、reA=(W×L−1−A)であるので、その90度回転後の位置reA1は、
reA1=(Floor((W×L−1−A)/W)+1)×(W×L+1)−1−L×(1+W×L−1−A)
=L×(1+A)−Floor(A/W)×(W×L+1)−1 (2)
であり、この値は、先頭画素位置からの距離にも該当する。即ち、(1)と(2)が同じ値になる。この特徴は、A1とreA1の対応位置が、画像の中心位置を基に点対称の関係であることを表している。ここで、
Floor((W×L−1−A)/W)=L−Floor(A/W)−1
であることを利用している。
【0047】
上記した連鎖処理の規則を、矩形画像の中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用すると、両者が同一の連鎖処理上の中に存在しない場合(例えば、図4(b):2組の連鎖処理のそれぞれ別々の組に属している)を考える。この場合、左上端から右下端の順番に全画素を連鎖処理規則の開始画素として適用する過程において、点対称の位置関係にある二点を別々の開始画素にする、二系統の連鎖処理を回避すべきかどうかの判断(「以前の開始画素からの連鎖処理が既に行なわれたものであるとみなして現在の開始画素からの連鎖処理を行わない」回避規制に関する判断)を、二系統内の一系統だけを調べるだけで済むため、連鎖処理の重複を効率良く避けることができる。
【0048】
即ち、連鎖処理の規則を、矩形画像の中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用すると、両者が同一の連鎖処理上の中に存在しない場合は、90度回転の重複を回避するための捜索において、約半分の捜索量で済ませられるため、より高速処理が実現できる。
【0049】
また、上記した連鎖処理の規則を、矩形画像の中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用すると、両者が同一の連鎖処理上の中に存在する場合(例えば、図4(a):1組の連鎖処理しかない)を考える。
【0050】
この場合、左上端から右下端の順番に全画素を連鎖処理規則の開始画素として適用する過程において、点対称位置関係にある二点を別々の開始画素にする二系統の連鎖処理を回避すべきかどうか判断するための調査を行なう必要がない(二系統にはならず、一系統だけ)ことにより、連鎖処理の重複を効率良く避けることができる。即ち、連鎖処理の規則を、矩形画像の中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用すると、両者が同一の連鎖処理上の中に存在する場合は、90度回転の重複を回避するための捜索において、約半分の捜索量で済ませられるため、より高速処理が実現できる。また、以上で説明した両方法を適用すれば、全体で約半分の捜索量で済み、より高速処理が実現できる。
【0051】
図3は、本発明の処理フローチャートを示す。以下、図3を用いて、画像の中心点を基に点対称の位置関係にある画素同士を有効に活用した、本発明の処理を説明する。画像回転処理の例として、画像データを左回り90度単位で回転する処理を説明する。
ステップ101では、ステップS1と同様に、各種設定情報を入力する。各種設定情報は、(1)画像回転処理の対象画像データ、(2)処理の種類(左回り90度など90度単位の回転処理)、(3)連鎖処理(ステップ109〜116)の最初の開始画素(例えば画像データの先頭を基準とした相対アドレスで示す:オフセット値a=0)、(4)2回目以降の連鎖処理の開始画素の順番(例えば画像データの先頭を基準とした相対アドレス順)、(5)90度回転のための画素移動状況を把握する移動情報格納領域として、Floor(((全画素数)+1)/2)ビット分確保し、その初期設定(例えば、OFF:0クリア)等である。
【0052】
本実施例では、(4)の2回目以降の連鎖処理の開始画素の順番は、画像データの左上端の画素位置から対象画像データ全体の中央画素位置lcまでの順番とし(図2の処理と異なる点)、(5)移動情報格納領域内のビット位置もこの順番とする。
【0053】
ステップ102では、各種初期設定を行う。例えば、予め用意した連鎖処理の開始画素のアドレスを格納するアドレス変数Asに、上記(3)で入力された最初の開始画素を設定する(As=a=0)。ステップ103では、全画素を開始画素にした連鎖処理が終了したか否かを判定する。ステップ103では、画像回転処理の終了を判定している。ここでは、アドレス変数Asに設定された開始画素が対象画像データ全体の中央画素位置lcに達したか否かにより判定している(図2の処理と異なる点)。すなわち、画像回転処理の終了は、対象画像データ中の上記(4)で入力された順番において、最後の画素に対する処理が済んだときである。このステップ103は、点対称の特徴を用いている。
【0054】
ステップ103でYESの場合、画像回転処理は正常に終了したため、ステップ104に進み、ステップ104では、対象画像データの90度回転処理の実施/未実施の判断結果を報告したり、実施の場合には、処理後の対象画像データを磁気ディスク装置15に格納するなどの後処理を行う。
【0055】
ステップ103でNoの場合、画像回転処理が終了していないので、ステップ105に進み、ステップ102または後述のステップ123で設定された連鎖処理の開始画素を、現注目画素に設定する。ここでは、ステップ102または後述のステップ123でアドレス変数Asに設定された位置の画素を、現注目画素に設定する。現注目画素は、現に処理対象とする一画素であり、具体的には、予め用意した現注目画素のアドレスを格納する現注目画素位置Aにアドレス変数Asを設定することにより行う(A=As)。これにより、現に処理対象とする一画素を特定すると共に、以降のステップ107〜109に示す連鎖処理のチェック処理を行う。
【0056】
また、ステップ106では、図2の処理にはない新たな機能である、点対称の特徴を生かすために、「画像中心点から最後尾までの間に、連鎖処理開始点を、効率良く設けるための状態変数FlagHの初期設定(状態ON)」を行う。
【0057】
続いて、ステップ107では、現注目画素の回転後位置A1を算出する。ここでは、ステップ105で設定された現注目画素の回転後位置A1を式(1)により算出する。
【0058】
ステップ108では、ステップ107で算出された回転後位置A1にある画素は回転済みか否かを判定する。ステップ108では、連鎖処理を二重に行うことを防ぐために、回転後位置A1にある画素が回転済みか否かを判定している。具体的には、ステップ107で算出した回転後位置A1が、アドレス変数Asのアドレス値も上位アドレスになっているか(即ちA1<As)否かにより判定する。これは、アドレス変数Asのアドレス値よりも上位アドレスにある画素については既に連鎖処理されたものであるとみなすことができるからである。
【0059】
ステップ108でYESの場合、回転後位置A1にある画素は既に回転済みであり、当該連鎖処理空間(ステップ105で設定された現注目画素を開始画素として行う一連の連鎖処理)は既に連鎖処理が終了しているものとみなして、当該連鎖処理空間のこれ以上の連鎖処理を回避するために、ステップ123に進む。
【0060】
ステップ108でNoの場合、回転後位置A1にある画素は未回転であり、当該連鎖処理空間は未だ対象画像データの90度回転処理のためのデータ移動がされていないと判断して、ステップ109に進む。ステップ109では、現在処理中の連鎖処理が終了しているか否かを判定する。ここでは、回転後位置A1と開始画素のアドレスAsとが同一か否かにより、現在処理中の連鎖処理が終了しているか否かを判定している。これは、回転後位置A1と開始画素のアドレスAsとが同一である場合は、回転後位置が開始画素のアドレスに戻ってきたと判断するためである。
【0061】
ステップ109でYESの場合、ステップ110に進み、ステップ109でNoの場合、ステップ107に戻る。以上説明したステップ105〜109の処理は、当該連鎖処理空間が90度回転処理に係る画素の移動を終了しているか否かを判定する処理である。なお、予め対象画像データの画素毎に、回転後位置に移動したか否か(移動済か否か)の移動情報を示す、例えば1ビットの指標領域(移動情報格納部)を設けて、回転処理が施された画素の移動情報は未移動(例えばビット値0)から移動済(例えばビット値1)に変更するようにしてもよい。この場合、ステップ107〜109の繰り返し工程の代わりに、ステップ105で設定された現注目画素の移動情報を確認する工程を設けることにより、当該連鎖処理空間が90度回転処理に係る画素の移動を終了しているか否かを更に高速に判定することができる。
【0062】
これは、1ビット/ドットの画像データの90度回転処理でも効果があり、図2の処理を改良している。すなわち、移動情報を格納する領域が、図2の処理(回転後の画像データの格納領域の大きさ)のほぼ半分の大きさ(=((全画素数)+1)/2個(小数以下切捨て)の格納(ビット数))で済む。つまり、1ビット/ドット以上のすべての階調の画像データの90度回転処理において、この領域以外には、回転時の画素値退避用として作業領域を1画素データ分だけしか確保(90度回転して1画素ずつ移動する時の移動先の画素値を格納する)できない条件下では、高速化が最大になる方法である。高速化が最大になる理由は、左上端から右下端の順番に全画素に連鎖処理を施す途中で、それぞれの画素を移動処理する前に、この移動情報格納部を確認することにより、既に移動処理が施されていれば、移動処理を回避できるためであり、連鎖処理による複数画素(同一連鎖内)の位置確認を行なう必要がない。
【0063】
上記した連鎖処理と、左上端から右下端までの順番に全画素に適用する方法の両方を同時に行うと、画素位置の重複が出現するので、この重複を避けるために、画像データ全体の全画素に個別に対応する90度回転のための変換済みフラグビット(画素数分のビット数を持ち、初期値はOFFとする)を設け、左上端から右下端の順番に全画素を連鎖処理規則の開始画素として適用する過程において、それぞれの開始画素から連鎖処理により経過する点のフラグビットをONにし、その過程で、変換済みフラグビットが既にONの場合は、以前の開始画素からの連鎖処理が既に行われた途中の点であるとみなして現在の開始画素からの連鎖処理を行わないよう回避する効率のよい回避処理が実現できる。
【0064】
図3に戻り、ステップ110では、連鎖処理を開始する。ここでは、ステップ102または後述のステップ123でアドレス変数Asに設定された位置の画素を、現注目画素に設定する。現注目画素は、前述したように、現に処理対象とする一画素であり、具体的には、現注目画素位置Aにアドレス変数Asを設定し(A=As)、さらに、予め用意した現注目画素の画素値を格納するための現注目画素値格納用変数NowDotに、アドレス変数Asに設定された位置の画素の画素値を設定する。
【0065】
ステップ111では、現注目画素の回転後位置を算出する。ここでは、ステップ110で設定された現注目画素Aの回転後位置A1を式(1)により算出する。
【0066】
次のステップ112、113は、図2の処理にはない新たな機能で、点対称の位置関係にある画素を、連鎖処理するための準備処理である。ステップ112では、現在の連鎖処理中の現注目画素位置が、この連鎖処理の開始点の点対称位置に一致しているか否かを判定する。ステップ112でYESの場合、ステップ113に進み、ステップ112でNoの場合、ステップ114に進む。 ステップ113では、ステップ106で初期設定した状態変数FlagHを状態OFF(今回の連鎖処理の中に、点対称の位置関係にある画素の連鎖処理も含まれていることを表す)にする。ステップ114では、ステップ111で算出された回転後位置A1にある画素の画素値を更新する。ここでは、回転後位置A1の画素値を現注目画素の画素値に変換する処理を行う。具体的には、回転後位置A1にあった画素の画素値を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値)に変更する。これにより、回転後位置A1にある画素の画素値を更新する。
【0067】
続いて、ステップ115では、ステップ111で算出された回転後位置A1にあった画素を現注目画素に変換する。ステップ115は、連鎖処理を行うために現注目画素を置き換える処理である。具体的には、現注目画素位置Aにステップ111で算出された回転後位置A1を設定すると共に、ステップ114で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値を現注目画素値格納用変数NowDotに格納する。
【0068】
以上説明したステップ114、115の処理は、90度単位の回転処理のための画素データの移動における連鎖処理でデータが失われないよう、最も少ない量の画素データ(ここでは一画素)を退避させる処理と回復処理を行っている。
【0069】
続いて、ステップ116では、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とアドレス変数Asのアドレスが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定している。これは、回転後位置A1と開始画素のアドレス変数Asとが同一である場合は、回転後位置A1が開始画素のアドレスに戻ってきたと判断するためである。
【0070】
ステップ116でYESの場合、現在処理中の連鎖処理が終了したので、ステップ117に進み、点対称の位置の画素の連鎖処理が必要か否かを判定する。ステップ116でNoの場合、現在処理中の連鎖処理が終了していないので、ステップ111に戻り、ステップ115で変換された現注目画素についてステップ111〜115の処理を繰り返す。
【0071】
ステップ117〜122は、図2の処理にはない、点対称な位置関係にある画素の連鎖処理を効率良く行うための新たな処理である。ステップ117では、現在処理中の連鎖処理の中に、画像の点対称の位置関係にある画素の連鎖処理が含まれていて、既に終了しているか否かを判定する。状態変数FlagHがONのとき、今回の連鎖処理の中に、点対称の位置関係にある画素の連鎖処理が含まれていないことを表し、また、FlagHがOFFのとき、今回の連鎖処理の中に、点対称の位置関係にある画素の連鎖処理も含まれていることを表す。
【0072】
ステップ117でYESの場合、現在処理中の連鎖処理は終了していないので、ステップ118に進み、ステップ117でNoの場合、現在処理中の連鎖処理は終了したので、ステップ123に進む。
【0073】
ステップ118では、ステップ110の連鎖処理開始点の、点対称の位置関係(画像中心点lcが基準点)に当たる位置を新たな開始点(現注目画素の初期の位置)とした、連鎖処理を開始する。ステップ119では、現注目画素の回転後位置を算出する。ここでは、ステップ118で設定された現注目画素Aの回転後位置A1を式(1)により算出する。
【0074】
続いて、ステップ120では、ステップ119で算出された回転後位置A1にある画素の画素値を更新する。ここでは、回転後位置A1の画素値を現注目画素の画素値に変換する処理を行う。これにより、回転後位置A1にある画素の画素値を更新する。
【0075】
続いて、ステップ121では、ステップ119で算出された回転後位置A1にあった画素を現注目画素に変換する。ステップ21は、連鎖処理を行うために現注目画素を置き換える処理である。
【0076】
以上説明したステップ120、121の処理は、90度単位の回転処理のための画素データの移動における連鎖処理でデータが失われないよう、最も少ない量の画素データ(ここでは一画素)を退避させる処理と回復処理を行っている。
【0077】
続いて、ステップ122では、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とステップ118で設定されていた“新たな開始点(現注目画素の初期の位置)”のアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定している。これは、回転後位置A1と、この“新たな開始点(現注目画素の初期の位置)”のアドレスとが同一である場合は、回転後位置A1が開始画素のアドレスに戻ってきたと判断するためである。
【0078】
ステップ122でYESの場合、現在処理中の連鎖処理は終了したので、ステップ123に進み、次の連鎖処理のための開始画素のアドレスを設定し、ステップ122でNoの場合、現在処理中の連鎖処理は終了していないので、ステップ119に戻り、ステップ121で変換された現注目画素についてステップ119〜121の処理を繰り返す。
【0079】
ステップ123は、次に続く連鎖処理空間の処理を行うために、次の連鎖処理空間の処理開始画素を再設定する処理である。この次の連鎖処理のための開始画素のアドレスは、例えばAs=As+1(例えば、前回の連鎖処理の開始画素の右隣りの画素。それが右端の場合は、次の行の左端の画素)によりアドレス変数Asを再設定する。ステップ123の処理が終了すると、ステップ103に戻る。なお、再設定される次の連鎖処理空間の処理開始画素は、画像データ上の未移動画素としてもよい。未移動の画素の決定は、ステップ105〜109で説明した移動情報格納部に格納された移動情報に基づいて行ってもよい。
【0080】
以上の処理により、画像データを左回り90度単位に回転する処理が行われる。ところで、連鎖処理の規則と、左上端から右下端の順番に全画素に適用する方法の両方を同時に行うと、画素位置の重複が出現するので、この重複を避けるために連鎖処理を行わない回避規制について、対象画像データが正方形(回転対象矩形の縦横の画素数が同じ)の画像データの場合、原画像のどの位置を開始画素にしても連鎖処理に含まれる画素位置の並びは、常に、正方形の中心点を通る縦横方向のそれぞれの対称軸に関して対称の位置になる2点、および正方形の中心点に関して点対称の位置になる点を加えた4点となる。従って、開始画素を、原画像の縦横それぞれ半分の画素数の大きさで原画像の左上または右上または左下または右下に形成する4つの正方形のいずれかの範囲に限定することができる。
【0081】
すなわち、対象画像データが正方形の場合は、90度回転処理が簡素に実行でき、かつ、連鎖処理の開始画素を画像全体の1/4の面積を占める連続した領域に集中する。これにより、例えば、1ビット/ドット画像データなど、隣り合う複数の画素値が1バイト(=8ビット)や1ワード(=16ビットなど)内に詰め込まれている場合で、隣り合う複数の画素値を連続処理するときに、画像データの取り出しまたは格納に効率(処理速度を向上できる)が良い。
【0082】
また、対象画像データが正方形(回転対象矩形の縦横画素数が同じ)の画像データの場合に、画素移動のために規制となる前述した方法(開始画素を、原画像の縦横それぞれ半分の画素数の大きさで原画像の左上または右上または左下または右下に形成する4つの正方形のいずれかの範囲に限定する方法)では、画素移動の順番を、上記4つの小正方形(原画像の縦横共に1/2の大きさの画像)内をそれぞれの中心点を固定してそれぞれ独立に90度回転移動し、その後で、4つの小正方形単位にまとめて平行移動(ローテーション)する順番に変更することもできる。なお、小正方形の単位は4つの場合に限定されない。
【0083】
すなわち、対象画像データ全体の90度回転を、複数の大きさの領域に分けて多段階に処理し、画像小領域を90度回転する処理を先に実施し、所定の加工を施した後に、画像全体である大領域を形成する場合に有効な処理である。
【0084】
以下、画像データ全体の90度回転を、複数の領域に分けて多段階に処理する原理を説明する。ここでは、一辺の長さ=L*8(画素数、*は掛け算を表す)の正方形を形成する画像データが、正方形の左上端から右上端に、その後、1行下の左端から右端に向かって、以下、同様に右下端まで順番に連続して格納されている場合に、左回りに90度回転する場合を例に説明する。
【0085】
このとき、画像データ上の任意の画素の位置座標(x,y)と、任意の画素の90度回転移動後の位置座標(X、Y)の関係は、 X=y 式(2)、Y=L*8−1−x 式(3)となる(但し、x,y,X,Yは0〜(L*8−1)の範囲の値である)。そこで、x=(x2*8)+x1,y=(y2*8)+y1として、x2=Floor(x/8),x1=xmod8,y3=Floor(y/8),y1=ymod8(但し、w mod 8は、8を法とするwの剰余値)とすると、X1=y1,Y1=L1−1−x1となる。なお、L1=8であり、座標(x1,y1),(X1,Y1)は、それぞれ左回り90度回転する前と後の正方形(一辺の長さ=8)内の画素の座標値を表す。
【0086】
同様にして、X2=y2,Y2=L2−1−x2となる。なお、L2=Lであり、座標(x2,y2),(X2,Y2)はそれぞれ左回り90度回転する前と後の正方形(一辺の長さ=L)内の画素の座標値を表す。
【0087】
X=(X2*8)+X1,Y=(Y2*8)+Y1とすると、X=(y2*8)+y1=y すなわち式(2)と同じになる。Y=((L2−1−x2)*8)+L1−1−x1=L*8−1−((x2*8)+x1)=L*8−1−x すなわち式(3)と同じになる。
【0088】
次に、上述した画像回転処理の具体例で説明する。
(例1)図4(a)は、画像回転処理の第1の例を説明する図である。図4(a)では、2×2ドットの正方形画像データ(画素a,b,c,dにより構成される)を左回りに90度回転する場合の、移動前後の画素状態と移動で連鎖する点の位置関係を示している(画素を表すa,b,c,dは、2×2ドットの2次元配置で示しているが、1次元のメモリアドレス配置で表現すると、隣り合せにa,b,c,dの順に並ぶ。また、90度回転後に、文字も回転させているのは分かり易くするための便宜上の表現である。実際には、a,b,c,dそれぞれが1画素を表すので、1画素の中での回転はない。以下の図4(b)〜(f)も同様)。
【0089】
図4(a)の場合、連鎖処理数は、1組(a→c→d→b→a)である。移動位置の算出は、式(1)により以下の内容になる。すなわち、1次元画素列a,b,c,dにおいて、移動前のaの画素(相対)位置を0とすると、他の画素の移動前の位置は、bは1,cは2,dは3になる。従って、移動後のaの位置=(Floor(0/2)+1)×(2×2+1)−1−2×(1+0)=2、同様に、移動後のbの位置=(Floor(1/2)+1)×(2×2+1)−1−2×(1+1)=0、移動後のcの位置=3、移動後のdの位置=1となり、移動後は、1次元画素列b,d,a,c順に変更になることが導かれる。
【0090】
例えば、aの位置の画素は、90度回転移動後は、移動前のcの位置に移動することを表している。また、図中の矢印が示す位置関係を辿ると、移動前にaから開始した連鎖処理は、全ての画素位置を通って、元のaの位置に戻ってきており、連鎖処理空間の数は1組であることが分かる。
【0091】
図3の処理フローチャートを参照して説明する。ここでは、画像回転処理の例として、画像データを左回り90度単位で回転する処理、特に当該90度回転のための画素移動状況を把握する移動情報格納領域を使用した例を説明する。
【0092】
ステップ101で設定する各種設定情報は、
(1)画像回転処理の対象画像データの画素(abcd)がこの順に位置付けられたアドレスに並んでいるものとし、横W=2、縦L=2の2次元配置のデータとして取り扱う。
(2)処理の種類(ここでは、左回り90度など90度単位の回転処理)
(3)後述する連鎖処理(ステップ110〜116)の最初の開始画素(ここでは画像データの先頭を基準とした相対アドレスで示す:aの位置の初期オフセット値=0)
(4)2回目以降の連鎖処理の開始画素の順番(ここでは画像データの先頭を基準とした相対アドレス順)、
(5)90度回転のための画素移動状況を把握する移動情報格納領域を、Floor(((全画素数=4)+1)/2)=2ビット確保し、初期設定(例えば、OFF=0クリア)する。
【0093】
なお、上記(4)の2回目以降の連鎖処理の開始画素の順番は、画像データの左上端の画素位置から対象画像データ全体の中央画素位置(相対アドレス)lc=1までの順番であるとし、(5)の移動情報格納領域内のビット位置もこの順番とする。
【0094】
「移動情報格納領域の現情報内容(ビット):00」
ステップ102では、予め用意した連鎖処理の開始画素のアドレスを格納するアドレス変数Asに、上記(3)で入力された最初の開始画素aの位置(アドレス)を設定する(As=0)。ステップ103では、全画素を開始画素にした連鎖処理は終了したか否かを判定し、ステップ102からステップ103に最初に制御が移って来たときには、ステップ105に進む。2回目にステップ103に制御が移るステップ123から来たときには、すべての連鎖処理が終了しているので、ステップ104に進む。
【0095】
ステップ105では、ステップ102で設定された連鎖処理の開始(変数Asに設定された位置)画素を、現注目画素Aに設定する(A=As)。これにより、現に処理対象とする一画素を特定すると共に、以降のステップ107〜109に示す連鎖処理のチェック処理を行う。また、ステップ106では、点対称の特徴を生かすために、「画像中心点から最後尾までの間に、連鎖処理開始点を、効率良く設けるための状態変数FlagHの初期設定(状態ON:1)」を行う。続いて、ステップ107では、現注目画素の回転後位置A1を式(1)により算出する。ここでは、A=0、W=2、L=2で示される計算により算出結果=2を得る(A1=2)。
【0096】
次に、ステップ108では、連鎖処理を二重に行うことを防ぐために、回転後位置A1にある画素が回転済みか否かを判定する。具体的には、移動情報格納領域内の現注目画素の回転後位置A1に該当する(A1=2番目の)ビットがONかどうかを判定すべきであるが、移動情報格納領域内に存在しない2番目のビットを指しているので、回転済みではないとみなし、ステップ109に進む。ステップ109では、当該90度回転のための画素移動状況を把握する移動情報格納領域内の現注目画素の回転後位置A1に該当する(先頭ビットを0番として、2番目の)ビットをON=1にすべきであるが、2番目のビットが存在しないので、ビット設定は行わない。
【0097】
「移動情報格納領域の現情報内容(ビット):00」
更に、現在処理中の連鎖処理が終了か否かを判定する。ここでは、回転後位置A1と開始画素のアドレスAsとが同一であるか否かにより、現在処理中の連鎖処理が終わりかどうかを判定する。現時点では、A1=2であり、As=0であるので、A1≠Asで連鎖処理は終了してないと判断し、A1をA(新たなAとして)に代入してから、ステップ107に戻る。制御が戻ったステップ107では、現注目画素の回転後位置A1を算出する。ここでは、A=2、W=2、L=2で示される計算により算出結果=3を得る(A1=3)。
【0098】
次に、ステップ108に進み、ステップ107で算出された回転後位置A1にある画素は回転済みか否かを判定する。具体的には、移動情報格納領域内の現注目画素の回転後位置A1に該当する(A1=3番目の)ビットがONかどうかを判定すべきであるが、現時点では移動情報格納領域内に存在しない3番目のビットを指しているので、回転済みではないとみなし、ステップ109に進む。
【0099】
ステップ109では、移動情報格納領域内の現注目画素の回転後位置A1に該当する(3番目の)ビットをON=1にすべきであるが、3番目のビットが存在しないので、ビット設定は行わない。
【0100】
「移動情報格納領域の現情報内容(ビット):00」
次に、現在処理中の連鎖処理が終了か否かを判定する。ここでは、回転後位置A1と開始画素のアドレスAsとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定している。現時点では、A1=3であり、As=0であるので、A1≠Asで連鎖処理は終了してないと判断し、A1をA(新たなAとして)に代入してから、ステップ107に戻る。再び制御が戻ったステップ107では、現注目画素の回転後位置A1を算出する。ここでは、A=3、W=2、L=2で示される計算により算出結果=1を得る(A1=1)。
【0101】
次に、ステップ108に進み、ステップ107で算出された回転後位置A1にある画素は回転済みか否かを判定する。具体的には、移動情報格納領域内の現注目画素の回転後位置A1に該当する(A1=1番目の)ビットがONかどうかを判定し、現時点では移動情報格納領域内の1番目のビットはOFFを指しているので、回転済みではないとみなし、ステップ109に進む。ステップ109では、移動情報格納領域内の現注目画素の回転後位置A1に該当する(1番目の)ビットが存在するのでON=1にする。
【0102】
「移動情報格納領域の現情報内容(ビット):01」
次に、現在処理中の連鎖処理が終了か否かを判定する。ここでは、回転後位置A1と開始画素のアドレスAsとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定している。現時点では、A1=1であり、As=0であるので、A1≠Asで連鎖処理は終了してないと判断し、A1をA(新たなAとして)に代入してから、ステップ107に戻る。3度制御が戻ったステップ107では、現注目画素の回転後位置A1を算出する。ここでは、A=1、W=2、L=2で示される計算により算出結果=0を得る(A1=0)。次に、ステップ108に進み、ステップ107で算出された回転後位置A1にある画素は回転済みか否かを判定する。具体的には、移動情報格納領域内の現注目画素の回転後位置A1に該当する(A1=0番目の)ビットがONかどうかを判定し、現時点では移動情報格納領域内の0番目のビットはOFFを指しているので、回転済みではないとみなし、ステップ109に進む。ステップ109では、移動情報格納領域内の現注目画素の回転後位置A1に該当する(0番目の)ビットが存在するのでON=1にする。
【0103】
「移動情報格納領域の現情報内容(ビット):11」
更に、現在処理中の連鎖処理が終了か否かを判定する。ここでは、回転後位置A1と開始画素のアドレスAsとが同一であるか否かにより、現在処理中の連鎖処理が終わりかどうかを判定している。現時点では、A1=0であり、As=0であるので、A1=Asで連鎖処理は終了したと判断し、ステップ110に進む。ステップ110では、連鎖処理を開始する。ここでは、ステップ102または後述のステップ123でアドレス変数Asに設定された位置の画素を、現注目画素に設定する。具体的には、現注目画素位置Aにアドレス変数Asを設定し(A=As=0)、さらにここでは、予め用意した現注目画素の画素値を格納するための現注目画素値格納用変数NowDotに、アドレス変数Asに設定された位置の画素の画素値を設定(NowDot=a)する。
【0104】
ステップ111に進み、現注目画素の回転後位置を算出する。ここでは、ステップ110で設定された現注目画素Aの回転後位置A1を算出する。A=0、W=2、L=2で示される計算により算出結果=2を得る(A1=2)。ステップ111の処理は、前述したステップ107の処理と同様である。
【0105】
ステップ112では、現在の連鎖処理中の現注目画素の回転後位置A1=2が、この連鎖処理の開始点As=0の点対称位置Asymに一致しているかどうかを判定する。この連鎖処理の開始点(As=0)の点対称位置Asym(=(W×L−1−As))がAsym=3と算出されるので、A1≠Asymであり、この結果によりステップ114に進む。
【0106】
ステップ114では、ステップ111で算出された回転後位置A1にある画素の画素値を更新する。ここでは、回転後位置A1の画素値を現注目画素の画素値に変換する処理を行う。具体的には、回転後位置A1=2にあった画素の画素値(c)を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1=2の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値a)に変更する。これにより、回転後位置A1にある画素の画素値を更新する。
【0107】
続いて、ステップ115に進み、ステップ111で算出された回転後位置A1にあった画素を現注目画素に変換する。ステップ115は、連鎖処理を行うために現注目画素を置き換える処理である。具体的には、現注目画素位置Aにステップ111で算出された回転後位置A1を設定(A=A1)すると共に、ステップ114で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値(c)を現注目画素値格納用変数NowDotに格納する。
【0108】
続いて、ステップ116に進み、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とアドレス変数Asのアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定する。A1=2,As=0であるので、現在処理中の連鎖処理が終了ではなく、ステップ111に戻る。ステップ111に戻り、現注目画素Aの回転後位置A1を算出する。A=2、W=2、L=2で示される計算により算出結果=3を得る(A1=3)。
【0109】
ステップ112では、現在の連鎖処理中の現注目画素の回転後位置A1=3が、この連鎖処理の開始点As=0の点対称位置Asym=3に一致しているかどうかを判定し、A1=Asymで一致しているので、この結果によりステップ113に進み、ステップ106で初期設定した状態変数FlagHを状態OFF(今回の連鎖処理の中に、点対称の位置関係にある画素の連鎖処理も含まれていることを表す)にし、その後、ステップ114に進む。
【0110】
ステップ114では、ステップ111で算出された回転後位置A1にある画素の画素値を更新する。具体的には、回転後位置A1=3にあった画素の画素値(d)を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1=3の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値c)に変更する。
【0111】
続いて、ステップ115に進み、ステップ111で算出された回転後位置A1にあった画素を現注目画素に変換する。具体的には、現注目画素位置Aにステップ111で算出された回転後位置A1を設定(A=A1)すると共に、ステップ114で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値(d)を現注目画素値格納用変数NowDotに格納する。
【0112】
続いて、ステップ116に進み、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とアドレス変数Asのアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定する。A1=3,As=0であるので、現在処理中の連鎖処理が終了ではなく、ステップ111に戻る。
【0113】
再びステップ111に戻り、現注目画素Aの回転後位置A1を算出する。A=3、W=2、L=2で示される計算により算出結果=1を得る(A1=1)。
【0114】
ステップ112では、現在の連鎖処理中の現注目画素の回転後位置A1=1が、この連鎖処理の開始点As=0の点対称位置Asym=3に一致しているかどうかを判定し、A1≠Asymで一致していないので、この結果によりステップ114に進む。
【0115】
ステップ114では、ステップ111で算出された回転後位置A1にある画素の画素値を更新する。具体的には、回転後位置A1=1にあった画素の画素値(b)を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1=1の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値d)に変更する。
【0116】
続いて、ステップ115に進み、ステップ111で算出された回転後位置A1にあった画素を現注目画素に変換する。具体的には、現注目画素位置Aにステップs10で算出された回転後位置A1を設定(A=A1)すると共に、ステップ114で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値(b)を現注目画素値格納用変数NowDotに格納する。
【0117】
続いて、ステップ116に進み、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とアドレス変数Asのアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定する。A1=1,As=0であるので、現在処理中の連鎖処理が終了ではなく、ステップ111に戻る。
【0118】
3度ステップ111に戻り、現注目画素Aの回転後位置A1を算出する。A=1、W=2、L=2で示される計算により算出結果=0を得る(A1=0)。ステップ112では、現在の連鎖処理中の現注目画素の回転後位置A1=0が、この連鎖処理の開始点As=0の点対称位置Asym=3に一致しているかどうかを判定し、A1≠Asymで一致していないので、この結果によりステップ114に進む。
【0119】
ステップ114では、ステップ111で算出された回転後位置A1にある画素の画素値を更新する。具体的には、回転後位置A1=0にあった画素の画素値(a)を画素値一時格納用変数DotSaveに格納する(退避させる)と共に、回転後位置A1=0の画素の画素値を現注目画素の画素値(現注目画素値格納用変数NowDotに格納された画素値b)に変更する。
【0120】
続いて、ステップ115に進み、ステップ111で算出された回転後位置A1にあった画素を現注目画素に変換する。具体的には、現注目画素位置Aにステップ111で算出された回転後位置A1を設定(A=A1)すると共に、ステップ114で画素値一時格納用変数DotSaveに格納されている回転後位置A1にあった画素の画素値(a)を現注目画素値格納用変数NowDotに格納する。
【0121】
続いて、ステップ1116に進み、現在処理中の連鎖処理が終了か否かを判定する。具体的には、回転後位置A1とアドレス変数Asのアドレスとが同一であるか否かにより、現在処理中の連鎖処理が終了か否かを判定する。A1=0,As=0であるので、現在処理中の連鎖処理が終わりと判断し、ステップ117に進む。
【0122】
ステップ117では、現在処理中の連鎖処理の中に、画像の点対称の位置関係にある画素の連鎖処理が含まれていて、既に終了しているか否かを判定する。状態変数FlagHはOFFになっているので、今回の連鎖処理の中に、点対称の位置関係にある画素の連鎖処理も含まれていることを表す。従って、現在処理中の連鎖処理は終了したので、ステップ123に進み、次の連鎖処理のための開始画素のアドレスを設定する。
【0123】
ステップ123は、次の連鎖処理のための開始画素のアドレスを設定する。例えばAs=As+1(例えば、前回の連鎖処理の開始画素の右隣りの画素。それが右端の場合は、次の行の左端の画素)によりアドレス変数Asを再設定する。現時点で、As=0であるので、新しいAs=1に再設定し、ステップ123を終了し、ステップ103に戻り、全画素を開始画素にした連鎖処理が終了したか否かを判定する。
【0124】
この判定には、「移動情報格納領域の現情報内容(ビット):11」の情報を利用する。現在捜索開始する新しいAs=1であり、そこから後ろに向かっても全ビット(今回のケースでは残り1ビットしかない)がON(=1)であるので、すべての連鎖処理が終了していると判断し、ステップ104に進んで、後処理を行って終了する。
【0125】
(例2)図4(b)は、画像回転処理の第2の例を説明するための図である。図4(b)では、2×3ドットの矩形画像データ(上位アドレスから順にa,b,c,d,e,fの並び)を、左回りに90度回転する場合の、移動前後の画素状態と移動で連鎖する点の位置関係を示している。この場合も矢印によって、移動前の画素の位置が90度回転した移動後に、どこの位置になるかを表している。
【0126】
この90度回転処理は、2×3ドットの矩形画像データ(6ドット分)が格納できる領域の大きさのままで、データの並び替えだけで、3×2ドットの矩形画像表現(上位アドレスから順にb,d,f,a,c,eの並び)に変更する方法である。具体的には図4(a)の場合と同様に、移動位置の算出は、式(1)にW=2、L=3を適用して、A1=(Floor(A/2)+1)×7−1−3×(1+A)から、A=0〜5をそれぞれ代入し、その結果、それぞれA1=3,0,4,1,5,2から導かれるものである。
【0127】
図3の処理フローチャートにより、図4(b)中の矢印が示す位置関係を辿ると、移動前にaから開始した連鎖処理は、a→d→b→aと辿って閉じていることから、a→d→bで一つの連鎖処理空間を形成し、同様に、c→e→fでもう一つの連鎖処理空間を形成して、併せて2組の連鎖処理空間で構成されていることが分かる。図3の処理フローチャートによる処理を辿れば、移動前にaから開始した連鎖処理は、a→d→b→aと繋いだ1組が、ステップ101〜ステップ116において実行され、その途中のステップ113は実行されないので、FlagH=1になることから、もう1組のc→e→f→cの連鎖処理は、ステップ116〜ステップ122において実行される。
【0128】
(例3)図4(c)は、画像回転処理の第3の例を説明するための図である。図4(c)では、2×4ドットの矩形画像データ(上位アドレスから順にa,b,c,d,e,f,g,hの並び)を、左回りに90度回転し、4×2ドットの矩形画像データ(上位アドレスから順にb,d,f,h,a,c,e,gの並び)に変更する場合の、移動前後の画素状態と移動で連鎖する点の位置関係を示している。連鎖処理空間は、a→e→g→h→d→b→aの組と、c→f→cの組の2組であることが分かる。
【0129】
前述した図2の処理フローチャートにおいて、上記した連鎖処理の規則を、矩形画像データの中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用してもよい。このとき、両者が同一の連鎖処理上の中に存在しない場合は、90度回転の重複を回避するための捜索において、約半分の捜索量で済む。
【0130】
(例4)図4(d)は、画像回転処理の第4の例を説明するための図である。ここでは、例4として、4×3ドットの矩形画像データ(上位アドレスから順にa,b,c,d,e,f,g,h,i,j,k,lの並び)を、左回りに90度回転し、3×4ドットの矩形画像データ(上位アドレスから順にd,h,l,c,g,k,b,f,j,a,e,iの並び)に変更する場合の、移動前後の画素状態と移動で連鎖する点の位置関係を示しており、連鎖処理空間は、a→j→i→l→c→d→aの組と、b→g→e→k→f→h→bの組の2組であることが分かる。
【0131】
(例5)図4(e)は、画像回転処理の第5の例を説明するための図である。ここでは、例5として、5×3ドットの矩形画像データ(上位アドレスから順にa,b,c,d,e,f,g,h,i,j,k,l,m,n,oの並び)を、左回りに90度回転し、3×5ドットの矩形画像データ(上位アドレスから順にe,j,o,d,i,n,c,h,m,b,g,l,a,f,kの並び)に変更する場合の、移動前後の画素状態と移動で連鎖する点の位置関係を示しており、連鎖処理空間は、a→m→i→e→aの組と、b→j→bの組と、c→g→k→o→cの組と、f→n→f、および不動点(移動しない)d,h,lの7組であることが分かる。この例のように、全体の画素数が奇数個となる場合は、画素の移動がない不動点(丸で囲んだd、h、lの画素)が存在する。
【0132】
ここでも例3と同様に、前述した図2の処理フローチャートにおいて、上記した連鎖処理の規則を、矩形画像データの中心を基準にして点対称位置関係にある、例えば、左上端画素と右下端画素に適用してもよい。このとき、両者が同一の連鎖処理上の中に存在しない場合は、90度回転の重複を回避するための捜索において、約半分の捜索量で済む。その方法の一例を示したのが、図3の処理フローチャートである。約半分の捜索量で済むことにより、画像データ上の各画素について移動済か否かの移動情報を格納する移動情報格納部において、移動済か否かの移動情報を格納する移動情報を、全画素について格納するのではなく、図3の処理フローチャートにより、((全画素数)+1)/2個(小数以下切捨て)の格納(ビット数)だけで済む。
【0133】
上記した例について、移動情報格納領域のサイズを図2と図3の場合で比較すると、以下の通りとなる。
【0134】
図4(a)の例では、図2の場合、4画素分の移動情報格納領域を必要とするのに対し、図3の場合、2画素分の移動情報格納領域で済む。
【0135】
図4(b)の例では、図2の場合、6画素分の移動情報格納領域を必要とするのに対し、図3の場合、3画素分の移動情報格納領域で済み、図4(c)の例では、図2の場合、8画素分の移動情報格納領域を必要とするのに対し、図3の場合、4画素分の移動情報格納領域で済み、図4(d)の例では、図2の場合、12画素分の移動情報格納領域を必要とするのに対し、図3の場合、6画素分の移動情報格納領域で済み、図4(e)の例では、図2の場合、15画素分の移動情報格納領域を必要とするのに対し、図3の場合、8画素分の移動情報格納領域で済む。
【0136】
本発明は、前述した実施例の機能を実現するソフトウエアのプログラムコードを記録した記憶媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ(CPUやMPU)が記憶媒体に格納されたプログラムコードを読出し実行することによっても達成される。この場合、記憶媒体から読出されたプログラムコード自体が前述した実施例の機能を実現することになる。プログラムコードを供給するための記憶媒体としては、例えば、ハードディスク、光ディスク、光磁気ディスク、不揮発性のメモリカード、ROMなどを用いることができる。また、コンピュータが読出したプログラムコードを実行することにより、前述した実施例の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているOS(オペレーティングシステム)などが実際の処理の一部または全部を行い、その処理によって前述した実施例の機能が実現される場合も含まれる。さらに、記憶媒体から読出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行い、その処理によって前述した実施例の機能が実現される場合も含まれる。また、本発明の実施例の機能等を実現するためのプログラムは、ネットワークを介した通信によってサーバから提供されるものでも良い。
【符号の説明】
【0137】
11 CPU
12 ROM
13 RAM
14 時計回路
15 磁気ディスク装置
16 画像90度回転処理部
17 ソースデータ符号化部
18 画像領域ノイズ除去部
19 画像領域内グラデーション化部
20 画像領域内面積算出部
21 画像領域内変更後の活用部
22 CRT画面表示装置
23 表示制御部
24 キーボード装置
25 画面指示装置
26 入力制御部
27 ネットワークI/F
28 ネットワーク伝送制御部
29 バス
【先行技術文献】
【特許文献】
【0138】
【特許文献1】特開2009−76989号公報

【特許請求の範囲】
【請求項1】
画像上の回転開始画素の回転後位置を算出する算出手段と、前記回転後位置の画素の画素値を格納する格納手段と、前記回転後位置の画素の画素値を、前記回転開始画素の画素値に変更する変更手段と、前記回転開始画素を前記回転後位置の画素に置き換えて、前記算出手段、格納手段、変更手段を繰り返す連鎖処理を実行する連鎖処理手段を備え、前記画像上の全画素が一回の移動により回転後の位置に移動される画像処理装置であって、前記画像上の各画素毎に移動済か否かの移動情報を格納する移動情報格納手段を備え、前記移動済か否かの移動情報として、前記画像の全画素数をNとしたとき、(N+1)/2個(小数以下切捨て)の画素数を格納することを特徴とする画像処理装置。
【請求項2】
前記連鎖処理手段は、前記連鎖処理を実行中に、前記回転開始画素の位置と点対称の位置にある画素位置が含まれていない場合には、前記点対称の位置にある画素位置を、未移動の回転開始画素として設定することを特徴とする請求項1記載の画像処理装置。
【請求項3】
画像上の回転開始画素の回転後位置を算出する算出工程と、前記回転後位置の画素の画素値を格納する格納工程と、前記回転後位置の画素の画素値を、前記回転開始画素の画素値に変更する変更工程と、前記回転開始画素を前記回転後位置の画素に置き換えて、前記算出工程、格納工程、変更工程を繰り返す連鎖処理を実行する連鎖処理工程を備え、前記画像上の全画素が一回の移動により回転後の位置に移動される画像処理方法であって、前記画像上の各画素毎に移動済か否かの移動情報を格納する移動情報格納工程を備え、前記移動済か否かの移動情報として、前記画像の全画素数をNとしたとき、(N+1)/2個(小数以下切捨て)の画素数を格納することを特徴とする画像処理方法。
【請求項4】
請求項3記載の画像処理方法をコンピュータに実現させるためのプログラム。
【請求項5】
請求項3記載の画像処理方法をコンピュータに実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate


【公開番号】特開2012−175164(P2012−175164A)
【公開日】平成24年9月10日(2012.9.10)
【国際特許分類】
【出願番号】特願2011−32194(P2011−32194)
【出願日】平成23年2月17日(2011.2.17)
【出願人】(000006747)株式会社リコー (37,907)
【Fターム(参考)】