VIOSでの並列画像処理プログラミング
- 画像処理モジュールの宣言
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以降は画像のみに適用されます。
分割方法にはワーキングセットごとに画像を分割する際の分割方法を指定します。指定できる分割方法は
- pixel
: 画素ごとに分割
- row
: 行ごとに分割
- column
: 列ごとに分割
- box[w][h]
: 小領域ごとに分割
- all
: 分割しない
の5通りの方法があります。この後ろに続くcache以降は、画像を分割した際に、その周辺情報が必要な場合に用いる画像データキャッシュの指定であり、大きさの部分に周辺領域の半径を指定します。必要がない場合は省略可能です。
VIOS固有の命令
VIOSでは、画像処理を効率良く行うため、いくつかの固有の命令を持ちます。以下に、それらの命令について示します。
- 並列処理命令
画像処理モジュール内に記述された処理は逐次命令となり、並列処理は行われません。VIOSでは並列処理を行うにはparallel文を使用します。以下にその使用例を示します。
/* 逐次処理部分を記述します */
‥‥
parallel{
/* 並列処理部分を記述します */
‥‥
}
VIOSでは、parallel文内部においては、画像はワーキングセットごとに分割されるため、画像の画素値へのアクセス方法が通常のC言語などのプログラムとは多少異なりますparallel文内部でのアクセス方法は以下の通りです。
- Image1[x][y]
: 相対座標指定
それぞれのワーキングセットが保持している画像の左上を(0, 0)とする相対座標(x, y)の位置にある画素へアクセスします。座標の指定を省き[]と記述した場合は、座標値0が指定されたものとします。
- Image1[[x]][[y]];
: 絶対座標指定
画像全体における絶対座標(x, y)の位置にある画素へアクセスします。
分割方法にallが適用されている画像については、相対座標指定、絶対座標指定ともに同一の処理となります。どちらの指定を用いた場合も、アクセスされる画素が同一ワーキングセット外にある場合は次に示すboundary命令で指定された方法で画素値を取得します。
- boundaryによる画素値取得法の指定
画素値の取得の際、ワーキングセットが持っていない画素へのアクセスを行うと、ネットワークを介したホスト上にあるワーキングセットから画素値を取得する状況が生じます。これは処理時間に非常に大きな影響を与えるため、VIOSでは次に示すboundary命令により、ネットワークを介したアクセスを避けることが可能です。
- プログラム中での記述方法
#vios boundary 画像変数名 アクセス方法
- 画像変数名 : アクセス方法を指定する画像変数名を記述します。
- アクセス方法 : ワーキングセット外の画素へのアクセス方法を次の中から選びます。
- nocheck : ワーキングセット外かどうかチェックしません。
- get : ネットワークを介してワーキングセット外の画素値を取得します。
- complete : ワーキングセットの持つ情報から画素値を補完します。
- const 数値 : 数値で指定した値で代用します。
なお、デフォルトの(boundary指定を行わない)場合は、nocheckが適用されます。
- 内部関数
- hotx, hoty
: 分割画像の注目画素の絶対位置を取得します。parallel文内において使用します。
x = hotx(Image1); // 画像Image1の絶対座標におけるx座標を変数xに代入します。
y = hoty(Image1); // 画像Image1の絶対座標におけるy座標を変数yに代入します。
width, height : 指定の画像の分割前の横方向、縦方向の大きさを取得します。
w = width(Image1); // 画像Image1の横方向(x方向)の大きさを変数wに代入します。
h = height(Image1); // 画像Image1の縦方向(y方向)の大きさを変数hに代入します。
その他の命令
画像処理モジュール内では以下のものを用いることができます。
- 変数
: C言語で用いることのできる変数のうち、ポインタ変数、構造体、文字以外の変数を用いることができます。宣言はC言語と同様に{}ブロックの最初に行います。また、モジュール内すべてでアクセス可能な大域変数は、モジュール内の先頭の位置に記述します。モジュール引数の数値パラメータも大域変数として扱われます。
- 演算子
: C言語で用いることのできる演算子のうち、ポインタ、構造体に関するもの以外の演算子が使用可能です。
- 文
: C言語と同様の文が使用可能です。
- 数学関数
: sin, cos, tan, asin, acos, atan, logの数学関数が使用可能です。
メインフロー記述部
VIOSでは、ユーザが定義した画像処理モジュールをメインフロー記述部から呼び出すことにより画像処理を行います。メインフロー記述部は、以下のように記述します。
main()
{
image Image1, Image2; // 画像データを保持する変数を宣言します。
Image1 = load("画像ファイル名1"); // 変数Image1に画像ファイルを読み込みます。
usermodule(Image1, Image2); // ユーザが定義したモジュールを呼び出します。
disp(Image2); // Image2を画面に表示します。
save(Image2, "画像ファイル名2"); // Image2を「画像ファイル名2」の名前で保存します。
}
VIOSトップページへ戻る
VIOS FAQ