(57)【要約】【課題】より効率的なフィルタ処理を可能とする。【解決手段】処理対象データに対してフィルタカーネルを用いてフィルタ処理を行うフィルタ処理装置は、所定の演算処理を並列に実行するＫ個の演算手段と、処理対象データに含まれる複数のデータ値を保持するデータ保持手段と、フィルタカーネルに含まれる複数のフィルタ係数を保持する係数保持手段と、Ｋ個の演算手段に入力するＫ個のデータ値を複数のデータ値から選択する第１のパターンを保持する第１のパターン保持手段と、Ｋ個の演算手段に入力する１つのフィルタ係数を複数のフィルタ係数から選択する第２のパターンを保持する第２のパターン保持手段と、第１のパターンを参照してＫ個の演算手段にＫ個のデータ値を入力し、第２のパターンを参照してＫ個の演算手段に共通の１つのフィルタ係数を入力する制御手段と、を有する。所定の演算処理は、Ｋ個のデータ値に対して１つのフィルタ係数を並列に乗算する処理を含む。【選択図】図３
2019074967.tif 000002
【特許請求の範囲】
【請求項１】
処理対象データに対してフィルタカーネルを用いてフィルタ処理を行うフィルタ処理装置であって、
所定の演算処理を並列に実行するＫ個の演算手段と、
前記処理対象データに含まれる複数のデータ値をＬ次元に直交配列して保持するデータ保持手段と、
前記フィルタカーネルに含まれる複数のフィルタ係数をＬ次元に直交配列して保持する係数保持手段と、
前記Ｋ個の演算手段に入力するＫ個のデータ値を前記複数のデータ値から選択する第１のパターンを保持する第１のパターン保持手段と、
前記Ｋ個の演算手段に入力する１つのフィルタ係数を前記複数のフィルタ係数から選択する第２のパターンを保持する第２のパターン保持手段と、
前記第１のパターンを参照して前記Ｋ個の演算手段にＫ個のデータ値を入力し、前記第２のパターンを参照して前記Ｋ個の演算手段に共通の１つのフィルタ係数を入力する制御手段と、
を有し、
前記所定の演算処理は、前記Ｋ個のデータ値に対して前記１つのフィルタ係数を並列に乗算する処理を含む
ことを特徴とするフィルタ処理装置。
【請求項２】
前記データ保持手段は、Ｌ次元に直交配列された複数のデータ値のうち所定範囲に配列されたＫ個のデータ値を前記Ｋ個の演算手段に提供するよう構成されており、
前記係数保持手段は、Ｌ次元に直交配列された複数のフィルタ係数のうち所定位置に配列された１つのフィルタ係数を前記Ｋ個の演算手段に提供するよう構成されており、
前記制御手段は、前記第１のパターンを参照して前記データ保持手段におけるデータの格納位置をシフトし、前記第２のパターンを参照して前記係数保持手段におけるフィルタ係数の格納位置をシフトすることにより、前記Ｋ個の演算手段にＫ個のデータ値及び１つのフィルタ係数を入力する
ことを特徴とする請求項１に記載のフィルタ処理装置。
【請求項３】
前記第１のパターンは、前記複数のデータ値に含まれる有意なデータ値が全て前記Ｋ個の演算手段に入力されかつ各データ値が入力された回数が１回となるように設定され、
前記第２のパターンは、前記複数のフィルタ係数に含まれる有意なフィルタ係数が全て前記Ｋ個の演算手段に入力されかつ各フィルタ係数が入力された回数が１回となるように設定される
ことを特徴とする請求項１又は２に記載のフィルタ処理装置。
【請求項４】
前記処理対象データは画像データであり、
前記画像データの向きに応じて前記第２のパターンを変更する変更手段を更に有する
ことを特徴とする請求項１乃至３の何れか１項に記載のフィルタ処理装置。
【請求項５】
前記処理対象データは２次元データであり、
Ｌ＝２であり、
前記制御手段は、前記データ保持手段におけるデータの格納位置及び前記係数保持手段におけるフィルタ係数の格納位置を、前記直交配列に沿った４方向の何れかにシフトする
ことを特徴とする請求項２に記載のフィルタ処理装置。
【請求項６】
前記制御手段は、前記データ保持手段におけるデータの格納位置及び前記係数保持手段におけるフィルタ係数の格納位置を、略ジグザグ形状で順次シフトする
ことを特徴とする請求項５に記載のフィルタ処理装置。
【請求項７】
前記制御手段は、前記データ保持手段におけるデータの格納位置及び前記係数保持手段におけるフィルタ係数の格納位置を、略スパイラル形状で順次シフトする
ことを特徴とする請求項５に記載のフィルタ処理装置。
【請求項８】
前記処理対象データは３次元データであり、
Ｌ＝３であり、
前記制御手段は、前記データ保持手段におけるデータの格納位置及び前記係数保持手段におけるフィルタ係数の格納位置を、前記直交配列に沿った６方向の何れかにシフトする
ことを特徴とする請求項２に記載のフィルタ処理装置。
【請求項９】
処理対象データに対してフィルタカーネルを用いてフィルタ処理を行うフィルタ処理装置の制御方法であって、
前記フィルタ処理装置は、
所定の演算処理を並列に実行するＫ個の演算手段と、
前記処理対象データに含まれる複数のデータ値をＬ次元に直交配列して保持するデータ保持手段と、
前記フィルタカーネルに含まれる複数のフィルタ係数をＬ次元に直交配列して保持する係数保持手段と、
前記Ｋ個の演算手段に入力するＫ個のデータ値を前記複数のデータ値から選択する第１のパターンを保持する第１のパターン保持手段と、
前記Ｋ個の演算手段に入力する１つのフィルタ係数を前記複数のフィルタ係数から選択する第２のパターンを保持する第２のパターン保持手段と、
を有し、
前記制御方法は、
前記第１のパターンを参照して前記Ｋ個の演算手段にＫ個のデータ値を入力し、前記第２のパターンを参照して前記Ｋ個の演算手段に共通の１つのフィルタ係数を入力する工程と、
前記Ｋ個の演算手段を用いて前記Ｋ個のデータ値に対して前記１つのフィルタ係数を並列に乗算する工程と、
を含む
ことを特徴とするフィルタ処理装置の制御方法。
【請求項１０】
コンピュータを、請求項１乃至８の何れか一項に記載のフィルタ処理装置の各手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フィルタ処理の技術に関するものである。
【背景技術】
【０００２】
フィルタ処理は画像処理や画像認識の分野における重要な技術である。一般に、フィルタ処理は複数の乗算と累積加算を含んでおり、演算量はフィルタのカーネルサイズ（フィルタのカーネルにあるフィルタ係数の個数）に比例する。一方、近年、携帯端末や車載機器等の組み込みシステム向けの画像処理の手法が注目されている。画像の解像度（画素の個数）の増大に伴い、フィルタ処理による演算量が増加するため、効率的にフィルタ処理を並列化することが求められている。また、ユースケースやアプリケーションにより、入力画像とフィルタのカーネルが異なる。そのため、同一のシステムで複数種類のカーネルサイズに対応する機能を備える重要性も高まっており、フィルタのカーネルサイズに対する自由度の高い並列処理方法が提案されている。
【０００３】
特許文献１では、１次元のシフトレジスタを用いて効率的に画素とフィルタ係数を読み出し、複数の乗算器と累積加算器にデータを供給し、並列にフィルタ処理結果を計算する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第５３７６９２０号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１に記載の手法では、処理対象データのサイズ（幅または高さ）がシフトレジスタのサイズより小さい場合に演算効率が低下するという問題がある。また、格納された係数の出力順序が決まっているため、フィルタのカーネルを回転する場合にはフィルタ係数を並び替えてからシフトレジスタに格納する必要があり、処理速度が遅くなるという問題がある。
【０００６】
本発明はこのような課題を鑑みてなされたものであり、より効率的なフィルタ処理を可能とする技術を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述の課題を解決するため、本発明に係るフィルタ処理装置は以下の構成を備える。すなわち、処理対象データに対してフィルタカーネルを用いてフィルタ処理を行うフィルタ処理装置は、
所定の演算処理を並列に実行するＫ個の演算手段と、
前記処理対象データに含まれる複数のデータ値をＬ次元に直交配列して保持するデータ保持手段と、
前記フィルタカーネルに含まれる複数のフィルタ係数をＬ次元に直交配列して保持する係数保持手段と、
前記Ｋ個の演算手段に入力するＫ個のデータ値を前記複数のデータ値から選択する第１のパターンを保持する第１のパターン保持手段と、
前記Ｋ個の演算手段に入力する１つのフィルタ係数を前記複数のフィルタ係数から選択する第２のパターンを保持する第２のパターン保持手段と、
前記第１のパターンを参照して前記Ｋ個の演算手段にＫ個のデータ値を入力し、前記第２のパターンを参照して前記Ｋ個の演算手段に共通の１つのフィルタ係数を入力する制御手段と、
を有し、
前記所定の演算処理は、前記Ｋ個のデータ値に対して前記１つのフィルタ係数を並列に乗算する処理を含む。
【発明の効果】
【０００８】
本発明によれば、より効率的なフィルタ処理を可能とする技術を提供することができる。
【図面の簡単な説明】
【０００９】
【図１】第１実施形態におけるフィルタ処理のフローチャートである。
【図２】第１実施形態に係るフィルタ処理装置のブロック図である。
【図３】フィルタ処理部の詳細構成を示すブロック図である。
【図４】画素、フィルタ係数、出力結果の配列を説明する図である。
【図５】積和演算処理部の詳細構成を示すブロック図である。
【図６】画素格納部の詳細構成を示すブロック図である。
【図７】フィルタ係数格納部の詳細構成を示すブロック図である。
【図８】画素の格納位置の変化を説明する図である。
【図９】フィルタ係数の格納位置の変化を説明する図である。
【図１０】第１実施形態における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。
【図１１】出力結果の計算例を示す図である（ｍ＝１〜５）。
【図１２】出力結果の計算例を示す図である（ｍ＝５〜９）。
【図１３】変形例における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。
【図１４】変形例におけるフィルタ係数格納部の詳細構成を示すブロック図である。
【図１５】変形例における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。
【図１６】変形例における画素、フィルタ係数、出力結果の配列を説明する図である。
【発明を実施するための形態】
【００１０】
以下に、図面を参照して、この発明の実施の形態の一例を詳しく説明する。なお、以下の実施の形態はあくまで例示であり、本発明の範囲を限定する趣旨のものではない。
【００１１】
（第１実施形態）
本発明に係るフィルタ処理装置の第１実施形態として、画像データを処理するフィルタ処理装置を例に挙げて以下に説明する。
【００１２】
＜フィルタ処理装置の構成＞
図２は、第１実施形態に係るフィルタ処理装置のブロック図である。
【００１３】
入力部２０１は、ユーザーからの指示やデータの入力を受け付ける機能部であり、キーボードやポインティング装置やボタン等を含む。通信部２０３は、機器間の通信を行うためのＩ／Ｆである。
【００１４】
データ保存部２０２は、画像データを保存する機能部であり、通常はハードディスク、フレキシブルディスク、光ディスク（ＣＤ、ＤＶＤなど）、半導体メモリ等で構成される。データ保存部２０２には画像データの他にも、プログラムやその他のデータを保存することも可能である。あるいは、後述するＲＡＭ２０８の一部をデータ保存部２０２として用いるのであっても良い。またあるいは、通信部２０３を介して通信接続した不図示の外部記憶装置を利用するよう構成しても良い。
【００１５】
表示部２０４は、処理対象の画像を表示、あるいはＧＵＩ等の画像を表示する機能部で、一般的にはＣＲＴや液晶ディスプレイなどが用いられる。あるいは、ケーブル等で接続された外部ディスプレイ装置であっても構わない。また、あるいは公知のタッチスクリーン装置のように、表示部２０４と入力部２０１が同一装置であっても良い。その場合に、タッチスクリーンによる入力を入力部２０１の入力として扱う。
【００１６】
フィルタ処理部２０５は、後述するフローチャート（図１）に従ったフィルタ処理を行う機能部である。ＲＡＭ２０８に保存された画像に対してフィルタ処理を行い、フィルタ処理された結果をデータ保存部２０２（またはＲＡＭ２０８）に出力する。
【００１７】
ＣＰＵ２０６は、ソフトウェアプログラムを実行することにより本装置全体の動作を制御する。ＲＯＭ２０７とＲＡＭ２０８は、その制御動作に必要なプログラム、データ、作業領域などを記憶しＣＰＵ２０６に提供する。なお、必要なプログラムがデータ保存部２０２に格納されている場合や、ＲＯＭ２０７に格納されている場合には、一旦ＲＡＭ２０８に読み込まれてから実行される。あるいは、通信部２０３を経由してプログラムを受信するよう構成してもよい。
【００１８】
画像処理部２０９は、ＣＰＵ２０６からの制御に基づき、データ保存部２０２に記憶された画像データを読み出して画像処理を行う。例えば、画素値のレンジ調整を行い、その結果をＲＡＭ２０８に書き込む。
【００１９】
なお、図２においては、ＣＰＵが１つのみ（ＣＰＵ２０６）である構成を示しているが、複数のＣＰＵを設ける構成にしても良い。また、フィルタ処理部２０５をＣＰＵで構成しても良い。また、図２に示す各機能部を１つの装置内に含むよう構成してもよいし、１以上の機能部を別体の装置として構成し通信路で接続した構成としてもよい。フィルタ処理装置は上記以外の様々な構成要素を備え得るが、本発明の主眼ではないのでその説明については省略する。
【００２０】
なお、フィルタ処理された結果は、例えば、ＣＰＵ２０６により、動画像（複数フレーム）での画像処理または画像認識に用いられる。ＣＰＵ２０６により処理された画像処理または画像認識の結果は、ＲＡＭ２０８に保存される。
【００２１】
＜フィルタ処理装置の動作＞
図３は、フィルタ処理部２０５の詳細構成を示すブロック図である。また、図１は、第１実施形態におけるフィルタ処理のフローチャートである。
【００２２】
ステップＳ１０１では、フィルタ処理制御部３１１は、ＲＡＭ２０８に保存した画像データ（画素セット）とフィルタ係数（フィルタ係数セット）を読み出し、フィルタ係数メモリ３０２と画素メモリ３０３に保存する。
【００２３】
図４は、画素、フィルタ係数、出力結果の配列を説明する図である。ここでは、画素セット４０１には画素（データ値）が１６個（Ｄ１，１〜Ｄ４，４）格納される状況を想定する。また、フィルタ係数セット４０２にはフィルタ係数が９個（Ｃ１，１〜Ｃ３，３）格納される状況を想定する。また、積和演算処理部３０９は４つの演算器を備え、それぞれの演算器は所定の演算処理を並列に実行するよう構成されている。ここでは、共通のフィルタ係数に異なる画素を並列に乗算し、４つのフィルタ処理結果（Ｏ１，１〜Ｏ２，２）を並列に計算する。具体的には、数式（１）に従って、画素Ｄに対してフィルタ係数Ｃを適用することにより処理結果Ｏが得られる。
【００２４】
【数１】
2019074967.tif 000003
【００２５】
ステップＳ１０２では、フィルタ処理制御部３１１は、画素セットのループを開始する。保存された画素セットを一つずつ処理する。
【００２６】
ステップＳ１０３では、フィルタ処理制御部３１１は、パターン保持のための転送パターン設定部３０１に対して転送パターンを設定する。具体的には、転送パターン設定部３０１に、第１のパターンである画素の転送パターン（Ｄｘ（．）とＤｙ（．））と、第２のパターンであるフィルタ係数の転送パターン（Ｃｘ（．）とＣｙ（．））を保持する。ここで、Ｄｘ（．）とＤｙ（．）は画素の番号を指定するための関数である。また、Ｃｘ（．）とＣｙ（．）はフィルタ係数の番号を指定するための関数である。
【００２７】
ステップＳ１０４では、フィルタ処理制御部３１１は、画素メモリ３０３から画素セットを１つ読み出し、データ保持のための画素格納部３０６に格納する。また、フィルタ係数メモリ３０２からフィルタ係数セットを１つ読み出し、係数保持のためのフィルタ係数格納部３０５に格納する。
【００２８】
ステップＳ１０５では、フィルタ処理制御部３１１は、フィルタ処理部２０５の初期化をする。ここでは、フィルタ処理の処理結果の初期値（”０”）を設定し、フィルタ係数の処理順序を示す変数ｍを”１”に設定する。ここでは、図４に示すように、処理結果セット４０３には処理結果が４個（Ｏ１，１〜Ｏ２，２）ある。フィルタ処理の結果は、上述の数式（１）と後述する数式（２）〜（６）を用いて計算する。
【００２９】
ステップＳ１０６では、フィルタ処理制御部３１１は、フィルタのカーネルを走査させ、画素とフィルタ係数の値を用い、積和演算を実行する。積和演算の詳細については、Ｓ１０７〜Ｓ１１１を参照して後述する。また、積和演算制御部３０８は、画素とフィルタ係数の個数を計数する。
【００３０】
フィルタ処理結果を数式（１）と数式（２）に示す。Ｏｉ，ｊは第ｉのｊ番の処理結果であり、Ｐｉ，ｊ，ｍは第ｉのｊのｍ番の積である。水平方向の番号はｉであり、垂直方向の番号はｊである。変数ｍの値を変えることにより、積和演算処理部３０９を制御する。処理順序を示す変数ｍの値は累積加算の回数の意味も有する。
【００３１】
【数２】
2019074967.tif 000004
【００３２】
積は画素とフィルタ係数の積であり、数式（３）で計算する。
【００３３】
【数３】
2019074967.tif 000005
【００３４】
ＤＤｘ（ｍ），Ｄｙ（ｍ）は画素であり、Ｄｘ（．）とＤｙ（．）は画素の番号を指定するための関数である。ＣＣｘ（ｍ），Ｃｙ（ｍ）はフィルタ係数であり、Ｃｘ（．）とＣｙ（．）はフィルタ係数の番号を指定するための関数である。ｍの値によって画素の水平番号と垂直番号が異なる。Ｄｘ（．）、Ｄｙ（．）、Ｃｘ（．）、Ｃｙ（．）の計算についてはＳ１０７〜Ｓ１１１を参照して後述する。
【００３５】
ステップＳ１１２では、フィルタ処理制御部３１１は、フィルタ処理結果（Ｏ１，１〜Ｏ２，２）を処理結果メモリ３１０に保存する。
【００３６】
ステップＳ１１３では、フィルタ処理制御部３１１は、画素セットのループを終了させるかどうかを判定する。全ての画素セットを処理した場合、積和演算処理のループを終了させる。そうでない場合、Ｓ１０３に戻り、残りの画素セットを処理する。
【００３７】
＜積和演算（Ｓ１０６）の詳細＞
以下では、積和演算（Ｓ１０６）をより詳細に説明する。積和演算（Ｓ１０６）には、ステップＳ１０７〜Ｓ１１１に示されるループ処理として構成される。
【００３８】
ステップＳ１０７では、フィルタ処理制御部３１１は、積和演算のループを開始する。変数ｍの値を”１”に設定する。
【００３９】
ステップＳ１０８では、画素転送制御部３０７は、転送パターン設定部３０１に保持された画素転送パターンを取得し画素格納部３０６に転送し、画素（ＤＤｘ（ｍ），Ｄｙ（ｍ））を読み出す。また、フィルタ係数転送制御部３０４は、転送パターン設定部３０１に保持されたフィルタ係数転送パターンをフィルタ係数格納部３０５に転送し、フィルタ係数（ＣＣｘ（ｍ），Ｃｙ（ｍ））を読み出し、順番に処理する。これらの操作により、フィルタのカーネルを走査させる。
【００４０】
図６は、画素格納部の詳細構成を示すブロック図である。ここでは、画素格納部３０６には画素格納ユニットが１６個ある。それぞれの画素格納ユニットは上下左右方向に隣接する画素格納ユニットと接続されており、直交配列された２次元の構成になっている。画素格納ユニットには２種類（画素格納ユニットＡ及びＢ）ある。所定範囲を示す破線６０１内に示す４つの画素格納ユニットが画素格納ユニットＡとして構成され、残りの１２個の画素格納ユニットが画素格納ユニットＢとして構成されている。画素格納ユニットＡは積和演算処理部３０９と接続されており、画素格納ユニットＢは積和演算処理部３０９と接続されていない。第１実施形態においては演算器は４並列であり、並列に処理する４つの画素が異なるため、画素格納ユニットＡは４つとなっている。
【００４１】
画素格納ユニットＢの構成を破線６０３内に示す。１つの画素格納ユニットＢは１つの画素を格納することができる。画素格納ユニットＢは、転送パターン設定部３０１に保持された画素転送パターンに基づき、隣接する４つ（上下左右）の画素格納ユニットからの画素を選択し、画素格納メモリに格納する。また、画素格納ユニットＢは、隣接する４つの画素格納ユニットに画素を供給することが可能である。
【００４２】
画素格納ユニットＡの構成を破線６０２内に示す。画素格納ユニットＢと同様に、１つの画素格納ユニットＡは１つの画素を格納することができる。画素格納ユニットＡは、転送パターン設定部３０１に保持された画素転送パターンに基づき、隣接する４つ（上下左右）の画素格納ユニットからの画素を選択し、画素格納メモリに格納する。また、画素格納ユニットＢは、隣接する４つの画素格納ユニットおよび画素格納部３０６の出力先に画素を供給することが可能である。
【００４３】
図７は、フィルタ係数格納部の詳細構成を示すブロック図である。ここでは、フィルタ係数格納部３０５にはフィルタ係数格納ユニットが９個ある。それぞれのフィルタ係数格納ユニットは上下左右方向に隣接するフィルタ係数格納ユニットと接続されており、直交配列された２次元の構成になっている。フィルタ係数格納ユニットには２種類（フィルタ係数格納ユニットＡ及びＢ）ある。所定位置を示す破線７０１内に示す１つのフィルタ係数格納ユニットがフィルタ係数格納ユニットＡとして構成され、残りの８個のフィルタ係数格納ユニットがフィルタ係数格納ユニットＢとして構成されている。フィルタ係数格納ユニットＡは積和演算処理部３０９と接続されており、フィルタ係数格納ユニットＢは積和演算処理部３０９と接続されていない。第１実施形態においては演算器は４並列であるが、並列に処理するフィルタ係数は同一であるため、フィルタ係数格納ユニットＡは１つとなっている。
【００４４】
フィルタ係数格納ユニットＢの構成を破線７０３内に示す。１つのフィルタ係数格納ユニットＢは１つのフィルタ係数を格納することができる。フィルタ係数格納ユニットＢは、転送パターン設定部３０１に保持されたフィルタ係数転送パターンに基づき、隣接する４つ（上下左右）のフィルタ係数格納ユニットからのフィルタ係数を選択し、フィルタ係数格納メモリに格納する。また、フィルタ係数格納ユニットＢは、隣接する４つのフィルタ係数格納ユニットにフィルタ係数を供給することが可能である。
【００４５】
フィルタ係数格納ユニットＡの構成を破線７０２内に示す。フィルタ係数格納ユニットＢと同様に、１つのフィルタ係数格納ユニットＡは１つのフィルタ係数を格納することができる。フィルタ係数格納ユニットＡは、転送パターン設定部３０１に保持されたフィルタ係数転送パターンに基づき、隣接する４つ（上下左右）のフィルタ係数格納ユニットからのフィルタ係数を選択し、フィルタ係数格納メモリに格納する。また、フィルタ係数格納ユニットＡは、隣接する４つのフィルタ係数格納ユニットおよびフィルタ係数格納部３０５の出力先にフィルタ係数を供給することが可能である。
【００４６】
変数ｍが１の場合（１回目のループの場合）、画素とフィルタ係数の番号を指定するための関数（（Ｄｘ（１）、Ｄｙ（１）、Ｃｘ（１）、Ｃｙ（１））の初期値を設定する。変数ｍが１以外の場合（２回目以降のループの場合）、（Ｄｘ（．）、Ｄｙ（．）、Ｃｘ（．）、Ｃｙ（．））は数式（４）と（５）で計算する。変数ｍは常に正の整数である。
【００４７】
【数４】
2019074967.tif 000006
【００４８】
【数５】
2019074967.tif 000007
【００４９】
関数（Ｄｘ（．）、Ｄｙ（．）、Ｃｘ（．）、Ｃｙ（．））の入力値がｍの場合の出力値は、関数の入力値が（ｍ−１）の場合の出力値と関係がある。ここでは、関数Ｄｘ（ｍ）に着目して説明する。番号Ｄｘ（ｍ）は、番号Ｄｘ（ｍ−１）とシフト値Ｉｘ（ＰＤ（ｍ））の和である。Ｉｘ（．）はシフト関数であり、ＰＤ（．）は画素転送パターンを示す関数である。Ｉｘ（．）とＩｙ（．）はシフト方向（４方向）も意味し、数式（６）で計算する。
【００５０】
【数６】
2019074967.tif 000008
【００５１】
関数Ｄｙ（ｍ）、Ｃｘ（ｍ）、Ｃｙ（ｍ）はＤｘ（ｍ）と同様なため、説明を省略する。
【００５２】
ステップＳ１０９では、画素転送制御部３０７は、Ｓ１０８で読み出された４つの画素を積和演算処理部３０９に転送し、フィルタ係数転送制御部３０４は、Ｓ１０８で読み出された１つのフィルタ係数を積和演算処理部３０９に転送する。
【００５３】
図５は、積和演算処理部の詳細構成を示すブロック図である。乗算器５０１、加算器５０２、処理結果格納ユニット５０３は、それぞれＭ×Ｎ個ずつあり、Ｍ×Ｎ個の画素と１個のフィルタ係数による積和演算を並列に処理することが可能である。ここでは、演算器は４並列であり、Ｍ×Ｎは”４”である。Ｓ１０５で処理結果の初期値を”０”に設定したので、変数ｍが”１”の場合、処理結果格納ユニット５０３に格納されたデータは”０”である。
【００５４】
ステップＳ１１０では、積和演算処理部３０９は、数式（１）と数式（２）に基づき、乗算器５０１と加算器５０２を用い、乗算と累積演算を実行する。そして、処理結果を処理結果格納ユニット５０３に格納する。ここでは、演算器は４並列なので、数式（２）に示した画素とフィルタ係数の積（Ｐｉ，ｊ，ｍ，ｉ＝１，２，ｊ＝１，２）を並列に計算する。そして、計算された積を処理結果（Ｏｉ，ｊ，ｉ＝１，２，ｊ＝１，２）に並列に加算する。
【００５５】
ステップＳ１１１では、フィルタ処理制御部３１１は、積和演算処理のループを終了させるかどうかを判定する。変数ｍの値がフィルタ係数の総数（Ｘ×Ｙ＝９）と同じ場合、積和演算処理のループを終了させＳ１１２に進む。そうでない場合、変数ｍの値をインクリメント（１増やす）してＳ１０７に戻る。
【００５６】
＜積和演算の処理例＞
積和演算（Ｓ１０６）の処理例について、１つの画素セットと１つのフィルタ係数セットを例に説明する。ここでは、画素セット４０１は、１６個の画素（Ｄ１，１〜Ｄ４，４）を含む。また、フィルタ係数セット４０２は、９個のフィルタ係数（Ｃ１，１〜Ｃ３，３）を含む。更に、出力結果セット４０３は、４個の出力結果（Ｏ１，１〜Ｏ２，２）を含む。
【００５７】
積和演算が始まる前に、Ｓ１０５でフィルタ処理部２０５を初期化しているため、出力結果（Ｏ１，１〜Ｏ２，２）の値は”０”になっている。
【００５８】
Ｓ１０７では、変数ｍの値を”１”に設定し、Ｓ１０８に進む。ＰＣ（ｍ）とＰＤ（ｍ）は画素転送パターンを示す関数である。変数ｍが”１”の場合、ＰＣ（．）とＰＤ（．）とＩｘ（．）とＩｘ（．）を計算しない。その代わりに、画素の番号（Ｄｘ（１）、Ｄｙ（１））の値を（１，１）に設定し、フィルタ係数の番号（Ｃｘ（１）、Ｃｙ（１））の値を（１，１）に設定する。
【００５９】
Ｓ１０８では、画素転送制御部３０７は、画素の番号に対応する画素Ｄ１，１とフィルタ係数の番号に対応するフィルタ係数Ｃ１，１を読み出す。
【００６０】
図８は、画素の格納位置の変化を説明する図である。具体的にはｍ＝１の場合とｍ＝２の場合の画素の格納位置を示している。
【００６１】
変数ｍが”１”の場合、画素セット８０１の中の灰色で示した画素（Ｄ１，１〜Ｄ２，２）が出力画素になる。破線８０２内は、図６に示す画素格納部３０６に格納された画素データの例を示している。１６個の画素格納ユニットは１６個の画素（Ｄ１，１〜Ｄ４，４）を格納している。
【００６２】
図９は、フィルタ係数の格納位置の変化を説明する図である。具体的にはｍ＝１の場合とｍ＝２の場合のフィルタ係数の格納位置を示している。
【００６３】
変数ｍが”１”の場合、フィルタ係数セット９０１の中の灰色で示したフィルタ係数（Ｃ１，１）が出力フィルタ係数になる。破線９０２内は、図６に示すフィルタ係数格納部３０５に格納された係数データの例を示している。９個のフィルタ係数格納ユニットは９個のフィルタ係数（Ｃ１，１〜Ｃ３，３）を格納している。
【００６４】
図１０は、第１実施形態における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。パターン１００１は画素の転送パターンを示しており、パターン１００３はフィルタ係数の転送パターンを示している。画素の転送方向１００２及びフィルタの転送方向１００４に示すようにジグザグに走査するように転送する（ｍ＝１〜９）。このような転送を行うことにより、２次元に直交配列された画素データに対して２次元のフィルタカーネルを適用する。
【００６５】
図６に示したように、出力に繋がっている画素格納ユニットは４個あるが、ここでは左上の１つの画素格納ユニット１−１に着目して説明する。画素格納ユニット１−１は出力結果（Ｏ１，１）に対応しており、画素転送の開始位置は”左上”である。また、図７に示したように、出力に繋がっているフィルタ係数格納ユニットはフィルタ係数格納ユニット１−１である。フィルタ係数転送の開始位置は”左上”である。
【００６６】
図１１及び図１２は、出力結果の計算例を示す図である。特に、処理順序（変数ｍ）毎の、対象となる画素、使用するフィルタ係数、及び、出力結果の計算を詳細に示している。
【００６７】
変数ｍが”１”の場合、Ｓ１０９で読み出された画素Ｄ１，１とフィルタ係数Ｃ１，１の積を初期値”０”に加算することにより出力結果Ｏ１，１を得る。図１１に示した出力結果Ｏ１，２、Ｏ２，１、Ｏ２，２の計算は出力結果Ｏ１，１の計算と同様なので、説明を省略する。すなわち、４つの出力結果を並列に計算することが可能である。
【００６８】
Ｓ１１１では、変数ｍの値を”２”に変更し、Ｓ１０８に進む。変数ｍが”１”より大きい場合、ＰＣ（．）とＰＤ（．）とＩｘ（．）とＩｙ（．）を数式（３）〜（６）に従って計算する。
【００６９】
画素の転送パターンＰＤ（２）は”０”であり、シフト値（Ｉｘ（ＰＤ（２）），Ｉｙ（ＰＤ（２）））は（１，０）である。シフト値を用いて画素の番号を計算し、画素の番号（Ｄｘ（２）、Ｄｙ（２））の値を（２，１）に設定する。数式（６）に示したように、シフトの値は４種類ある。ただし、画素格納ユニットの構成（破線６０２内または破線６０３内）では、入力画素を直接的に選択することができるので、処理速度が速い。
【００７０】
フィルタ係数の転送パターンＰＣ（２）は”０”であり、シフト値（Ｉｘ（ＰＣ（２）），Ｉｙ（ＰＣ（２）））は（１，０）である。シフト値を用いてフィルタ係数の番号を計算し、フィルタ係数の番号（Ｃｘ（２）、Ｃｙ（２））の値を（２，１）に設定する。数式（６）に示したように、シフトの値は４種類ある。ただし、フィルタ係数格納ユニットの構成（破線７０２内または破線７０３内）では、入力画素を直接的に選択することができるので、処理速度が速い。
【００７１】
Ｓ１０８では、画素転送制御部３０７は、画素の番号に対応する画素Ｄ２，１とフィルタ係数の番号に対応するフィルタ係数Ｃ２，１を読み出す。
【００７２】
変数ｍが”２”の場合、画素セット８０３の中の灰色で示した画素（Ｄ２，１〜Ｄ３，２）が出力画素になる。破線８０４内は、図６に示す画素格納部３０６に格納された画素データの例を示している。出力画素のシフト方向は”右”であるため、画素格納部３０６の中の画素格納ユニット１−１は、画素格納ユニット２−１から画素を選択し、画素格納メモリに保持する。画素格納ユニット１−１にある画素は画素格納ユニット２−１にある画素に置き換えられ、破線８０２の状態が破線８０４の状態に変化する。
【００７３】
変数ｍが”２”の場合、フィルタ係数セット９０３の中の灰色で示したフィルタ係数（Ｃ２，１）が出力フィルタ係数になる。破線９０２内は、図７に示すフィルタ係数格納部３０５に格納された係数データの例を示している。出力フィルタ係数のシフト方向は”右”であるため、フィルタ係数格納部３０５の中のフィルタ係数格納ユニット１−１は、係数格納ユニット２−１からのフィルタ係数を選択し、フィルタ係数格納メモリに保持する。フィルタ係数格納ユニット１−１にあるフィルタ係数はフィルタ係数格納ユニット２−１にあるフィルタ係数に置き換えられ、破線９０２の状態が破線９０４の状態に変化する。
【００７４】
図６に示したように、出力に繋がっている画素格納ユニットは４個あるが、ここでは左上の１つの画素格納ユニット１−１に着目して説明する。画素格納ユニット１−１は出力結果（Ｏ１，１）に対応しており、画素のシフト方向は”右”である。また、図７に示したように、出力に繋がっているフィルタ係数格納ユニットはフィルタ係数格納ユニット１−１である。フィルタ係数のシフト方向は”右”である。
【００７５】
変数ｍが”２”の場合、Ｓ１０９で読み出された画素Ｄ２，１とフィルタ係数Ｃ２，１の積を計算する。そして、得られた積を、画素Ｄ１，１とフィルタ係数Ｃ１，１の積に加算することにより出力結果Ｏ１，１を得る。
【００７６】
ここでは、出力結果Ｏ１，１についての積和演算の過程を説明したが、出力結果Ｏ１，２、Ｏ２，１、Ｏ２，２についても同様であるため説明を省略する。
【００７７】
Ｓ１１１では、変数ｍの値を”３”に変更し、Ｓ１０８に進む。図１０〜図１２に示したように、転送パターンに基づき、数式（１）〜数式（６）で出力結果Ｏ１，１〜Ｏ２，２を計算する。積和演算ループが終了すると判定するまで、転送パターンに基づき、画素とフィルタ係数を順番に読み出し、乗算と累積加算を繰り返す。変数ｍが９の場合、出力結果（Ｏ１，１、Ｏ１，２、Ｏ２，１、Ｏ２，２）はフィルタ処理の結果であり、数式（１）における（Ｘ＝３，Ｙ＝３）と等価である。
【００７８】
以上説明したとおり第１実施形態によれば、転送パターンに基づきシフトの値（方向）を選択することにより、効率よく画素とフィルタ係数を転送することができる。また、１つの画素格納ユニット及びフィルタ係数格納ユニットがそれぞれ隣接する４つのユニットからデータを受け取り可能なように構成することにより、積和演算に必要な画素とフィルタ係数を一括して出力することが可能となる。すなわち、離れているユニット間の結線は必要でなく格納部の構成を簡略化することができるため、製造コストを低減することも可能となる。
【００７９】
また、画素格納ユニットが直交配列された２次元の構成になっているため、アプリケーションに応じて、水平方向及び垂直方向それぞれのユニットの個数を任意に決定することが可能である。
【００８０】
（変形例）
＜フィルタカーネルの回転／反転＞
携帯端末や車載機器は持ち方と置き方によって向きや角度が変わり、入力画像（処理対象データ）の回転角度が異なる。正しい処理結果を算出するためには、処理対象データに対して適正な方向（回転角度）でフィルタ処理をする必要がある。
【００８１】
上述の第１実施形態では、画素の転送方向１００２とフィルタ係数の転送方向１００４は同じになるパターンについて説明したが、異なる任意のパターンを利用することが出来る。そこで、フィルタのカーネルを回転しフィルタ処理をする形態について説明する。
【００８２】
図１３は、変形例における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。また、図１４は、変形例におけるフィルタ係数格納部の詳細構成を示すブロック図である。
【００８３】
第１実施形態における構成（図７）と異なり、破線１４０１内に示す１つのフィルタ係数格納ユニット３−１がフィルタ係数格納ユニットＡであり、フィルタ係数格納部３０５の出力先と繋がっている。フィルタ係数転送の開始位置は”右上”である。
【００８４】
図１３に示した転送パターンに基づいて積和演算をする場合、出力結果は数式（７）における（Ｘ＝３，Ｙ＝３）と等価である。
【００８５】
【数７】
2019074967.tif 000009
【００８６】
このように入力画像の向き（角度）に合わせてフィルタのカーネルを回転した場合、システム内部のデータ転送順序に変更は生じない。一方、入力画像を回転してからフィルタのカーネルで処理する際と同じ結果が得られる。すなわち、システム内部のデータ転送順序に変更はないため、処理速度に影響せずに効率的にフィルタ処理をすることができる。
【００８７】
また、図１３ではフィルタのカーネルを回転する例について説明したが、フィルタの回転に限定されるわけではなく、フィルタの反転（水平反転や垂直反転）を行うことも可能である。このように、アプリケーションに応じて、適切な転送パターンを決定し、様々な回転や向きに対応することが可能である。
【００８８】
＜フィルタのカーネルサイズ＞
第１実施形態では、フィルタのカーネルサイズ（係数の個数）が９個（Ｘ×Ｙ＝３×３＝９）の例について説明した。ただし、特定のカーネルサイズに限定する訳でなく、数式（８）を満足する任意のカーネルサイズ（Ｘ'×Ｙ'）を用いることができる。
【００８９】
【数８】
2019074967.tif 000010
【００９０】
また、第１実施形態で説明したフィルタ処理装置の構成（図６、図７）は３×３だけでなく、３×３以下のフィルタのカーネルサイズも処理できる。例えば、フィルタのカーネルサイズが４個（Ｘ'×Ｙ'＝２×２＝４）であっても処理可能である。
【００９１】
図１５は、変形例における画素及びフィルタ係数それぞれの転送パターンの一例を示す図である。第１実施形態の場合（図１０）と同様に、積和演算ループが終了すると判定するまで、転送パターンに基づき、画素とフィルタ係数を順番に読み出し、乗算と累積加算を繰り返す。変数ｍが”４”の場合、出力結果（Ｏ１，１、Ｏ１，２、Ｏ２，１、Ｏ２，２）はフィルタ処理の結果であり、数式（１）における（Ｘ＝２，Ｙ＝２）と等価である。カーネルサイズが９個の場合より早くフィルタ処理の結果を出力することができる。
【００９２】
上述のように、同一の構成により複数種類のフィルタのカーネルサイズに対応することが可能であるため、カーネルサイズ毎にフィルタ処理装置を用意する必要がなく、コストの低減が可能である。
【００９３】
＜画像とフィルタ係数の転送パターン＞
上述の実施形態（図１０、図１３）では、画素及びフィルタ係数それぞれに対して設定された転送パターンに基づき、フィルタ係数格納部３０５と画素格納部３０６の中に保持された画素とフィルタ係数を略ジグザグ形状で順次シフトさせる例について説明した。
【００９４】
ただし、移動方向はジグザグ形状に限るわけでなく、一筆書きの形状であれば、略スパイラル形状などのような任意のパターンでも良い。一筆書きの形状とは、保持された画素とフィルタ係数が全て読み出され、かつ、各画素と各フィルタ係数が読み出された回数が１回である形状ことである。
【００９５】
また、ジグザグ形状で画素とフィルタ係数を転送する場合、数式（６）で計算するシフト方向は４方向（上下左右）に限定される訳ではない。例えば、３方向（下左右）だけでも良い。シフト方向が３方向の場合、１つの画素格納ユニット（又はフィルタ係数格納ユニット）を隣接する３つのユニットからデータを受け取り可能に構成すれば、積和演算に必要な画素とフィルタ係数を全部出力することが可能である。
【００９６】
＜有意な画素とフィルタ係数＞
フィルタ係数または画素の値が”０”の場合、フィルタの係数と画素の積が０になるため、畳み込み演算の結果に影響しない。そのため、値が”０”以外の画素とフィルタ係数のみが有意であるとみなすことが出来る。そこで、有意でない画素やフィルタ係数が読み出されないように転送パターンを設定することにより処理時間を更に低減することが可能である。
【００９７】
＜並列度＞
第１実施形態においては、図５に示すように積和演算処理部３０９は４並列（Ｍ＝２，Ｎ＝２）である形態について説明したが、演算器の個数は”４”に限定される訳ではない。要求仕様に応じて任意のＫ個に決定し得る。
【００９８】
＜画素とフィルタ係数の個数＞
第１実施形態においては、図４に示すように画素セット４０１は１６個の画素、フィルタ係数セット４０２は９個のフィルタ係数、処理結果セット４０３は４個の処理結果である例について説明したが、様々な構成とすることが可能である。
【００９９】
図１６は、変形例における画素、フィルタ係数、出力結果の配列を説明する図である。画素セット１６０１は、２次元に直交配列されたＰ×Ｑ個の画素（Ｄ１，１〜ＤＰ，Ｑ）で構成されている。フィルタ係数セット１６０２は、フィルタのカーネルを意味し、Ｘ×Ｙ個のフィルタ係数（Ｃ１，１〜ＣＸ，Ｙ）で構成されている。処理結果セット１６０３は、Ｍ×Ｎ個の処理結果（Ｏ１，１〜ＯＭ，Ｎ）で構成されている。Ｍ、Ｎ、Ｐ、Ｑ、Ｘ、Ｙは、数式（９）と数式（１０）を満たしている。
【０１００】
【数９】
2019074967.tif 000011
【０１０１】
【数１０】
2019074967.tif 000012
【０１０２】
Ｘ、Ｙの値を増大させる場合、フィルタのカーネルサイズが増大する。Ｍ、Ｎの値を増大させる場合、演算器の並列度が上がるため、並列に処理できる画素数が増大する。
【０１０３】
第１実施形態では、フィルタのカーネルは正方形（Ｘ＝Ｙ＝３）である。ＸとＹの値が異なる場合、処理対象のフィルタのカーネルが長方形になる。また、ＸとＹはフィルタの最大カーネルサイズを指定するためのパラメータである。つまり、フィルタの係数がＸ×Ｙ個未満の場合であっても処理可能である。
【０１０４】
＜ビデオ処理＞
第１実施形態では、２次元データに対するフィルタ処理の例について説明したが、２次元に限るわけでなく、任意のＬ次元のデータでも良い。例えば、入力データが時系列情報を含んでいる３次元データのビデオの場合には以下のような構成になる。
【０１０５】
データセットは、Ｐ×Ｑ×Ｒ個のデータ（Ｄ１，１，１〜ＤＰ，Ｑ，Ｒ）から構成される。フィルタ係数セットは、Ｘ×Ｙ×Ｚ個のフィルタ係数（Ｃ１，１，１〜ＣＸ，Ｙ，Ｚ）から構成される。処理結果セットは、Ｍ×Ｎ×Ｏ個の処理結果（Ｒ１，１，１〜ＲＭ，Ｎ，Ｏ）から構成される。処理結果は、数式（１１）により計算される。
【０１０６】
【数１１】
2019074967.tif 000013
【０１０７】
また、数式（６）では、２次元の直交配列であったためＩｘ（．）とＩｙ（．）は４方向（上下左右）であった。３次元の直交配列である場合、データとフィルタ係数の番号も３次元となるため、６方向（上下左右前後）としてもよい。もちろん、５方向（下左右前後）としてもよい。
【０１０８】
＜処理対象データ＞
上述の説明においては、フィルタ処理の対象となる入力データとして画像から抽出された画素を想定して説明した。ただし、処理対象のデータは画像に限定されず、任意のデータを対象とし得る。
【０１０９】
＜フィルタ係数＞
フィルタ係数は画像処理のパラメータによって決定するとは限らない。例えば、機械学習によって装置が自動的に生成するよう構成しても良い。また、上述のフィルタ処理の構成は、様々な畳み込み演算に適用することが可能である。
【０１１０】
（その他の実施例）
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【符号の説明】
【０１１１】
３０１  転送パターン設定部；  ３０２  フィルタ係数メモリ；  ３０３  画素メモリ；  ３０４  フィルタ係数転送制御部；  ３０５  フィルタ係数格納部；  ３０６  画素格納部；  ３０７  画素転送制御部；  ３０８  積和演算制御部；  ３０９  積和演算処理部；  ３１０  処理結果メモリ；  ３１１  フィルタ処理制御部
【図１】
2019074967.tif 000014
【図２】
2019074967.tif 000015
【図３】
2019074967.tif 000016
【図４】
2019074967.tif 000017
【図５】
2019074967.tif 000018
【図６】
2019074967.tif 000019
【図７】
2019074967.tif 000020
【図８】
2019074967.tif 000021
【図９】
2019074967.tif 000022
【図１０】
2019074967.tif 000023
【図１１】
2019074967.tif 000024
【図１２】
2019074967.tif 000025
【図１３】
2019074967.tif 000026
【図１４】
2019074967.tif 000027
【図１５】
2019074967.tif 000028
【図１６】
2019074967.tif 000029