目 次
VIOSにおけるプログラミングは、C言語に非常に良く似たVPEーpと言う言語を使用して行います。
VPEーpはインタープリタ言語であり、必要最低限の命令しか持っていません。
しかし、ユーザが追加命令を作成するにより並列画像処理を行うことが出来るようになります。
追加命令は、VPEーpで記述します。それはVIOSにより一端C++のソースに変換、
そしてコンパイルされ、VPEーpの1命令として組み込まれます。
VIOSでは、ユーザが定義した画像処理モジュールをメインフロー記述部から呼び出すことにより
画像処理を行います。メインフロー記述部は、以下のように記述 します。
main() { // 画像データを保持する変数を宣言します。 image Image1, Image2; // 変数Image1に画像ファイルを読み込みます。 Image1 = load("画像ファイル名1"); // ユーザが定義したモジュール"usermodule"を呼び出します。 usermodule(Image1, Image2); // Image2を画面に表示します。 disp(Image2); // Image2を「画像ファイル名2」の名前で保存します。 save(Image2, "画像ファイル名2"); }
VIOSでは単一の画像処理をモジュールとして扱います。モジュールの宣言は以下 の通りです。
module module_name(...)
module_nameには、その画像処理モジュールの名前を記述します。その後ろに続く括弧の中には、
そのモジュールが受け取る引数を指定します。引数には、入力画像、出力画像、数値パラメータの
3種類があります。括弧内にお いてそれぞれ次のように記述します。
module module_name (
入力画像1, …, 入力画像l : input,
出力画像1, …, 出力画像m : output,
パラメータ1, …, パラメータn : parameter )
モジュール宣言の次に、モジュールの引数の定義を行います。書式は以下の通り です。
型名 変数名 [on 分割方法 [cache 大きさ]];
型名の部分は変数名で示される引数の型を指定します。このとき、変数が画像である場合、型名は
その画像の画素の型となります。パラメータの場合はその変数 そのものの型となります。
使用できる型はint, floatの2種類です。また、パラメータは多
次元配列も使用可能です。
変数名の以下に続くon以降は画像のみに適用されます。 分割方法にはワーキングセットごとに
画像を分割する際の分割方法を指定します。指定できる分割方法は
の5通りの方法があります。この後ろに続くcache以降は、画像を分割し
た際に、その周辺情報が
必要な場合に用いる画像データキャッシュの指定であり、 大きさの部分に周辺領域の半径を指定
します。必要がない場合は省略可能です。
画像処理モジュール内では以下のものを用いることができます。
VIOSでは、画像処理を効率良く行うため、いくつかの固有の命令を持ちます。以下に、
それらの命令について示します。
/* 逐次処理部分を記述します */ ‥‥ parallel{ /* 並列処理部分を記述します */ ‥‥ }VIOSでは、parallel文内部においては、画像は ワーキングセットごとに分割されるため、
分割方法にallが適用されている画像については、相対座標指定、絶対座 標指定ともに同一の処理Image1[x][y]
: 相対座標指定
それぞれのワーキングセットが保持している画像の左上を(0, 0)とする相対座標 (x, y)の位置にある画素へアクセスします。座標の指定を省き[]と記述 した場合は、座標値0が指定されたものとします。
Image1[[x]][[y]];
: 絶対座標指定
画像全体における絶対座標(x, y)の位置にある画素へアクセスします。
プログラム中での記述方法
#vios boundary 画像変数名 アクセス方法
hotx, hoty
: 分割画像の注目画素の絶対位置を取得します。 parallel文内において使用します。// 画像Image1の絶対座標におけるx座標を変数xに代入します。 x = hotx(Image1); // 画像Image1の絶対座標におけるy座標を変数yに代入します。 y = hoty(Image1);width, height
: 指定の画像の分割前の横方向、縦方向の大き さを取得します。// 画像Image1の横方向(x方向)の大きさを変数wに代入します。 w = width(Image1); // 画像Image1の縦方向(y方向)の大きさを変数hに代入します。 h = height(Image1);