• 検索結果がありません。

LabVIEW 画像処理参考プログラム

N/A
N/A
Protected

Academic year: 2024

シェア "LabVIEW 画像処理参考プログラム"

Copied!
17
0
0

読み込み中.... (全文を見る)

全文

(1)

LabVIEW 画像処理参考プログラム

(最終改訂 2019/03/31)

LV_sample2.zipの更新内容

LabVIEWで簡単な画像処理を行う旧課程情報学実験Ⅱ課題⑦「画像情報処理」テキスト(以下「テ

キスト」という。)の参考プログラムを情報学部実習用ノート PCにインストールされたLabVIEWの 版の更新に伴い掲載ソースをLabVIEW2017に変更した。本稿掲載のVIのフロントパネル、ブロック ダイアグラムのキャプチャ画像はp.14図31を除き情報科学研究教育センターのバーチャルカフェテリ アで開いたものである。プロパティノード、ケースストラクチャ等のテキストに記載の無いLabVIEW の機能については「LabVIEW概要」(最終改訂2019/02/18:以下「概要」という。)を参照されたい。

http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_sample.zip

LabVIEWオブジェクトの表示更新のバッファは2048標本で、既定の設定では2Dピクチャで2048

画素を超える画像の更新でフリッカを生じる。フロントパネルで2Dピクチャを右クリックして(ソー ス編集時は「上級」を選び、ソースまたは実行ファイルの実行時はそのまま)「スムーズアップデート」

にチェックを入れることでフリッカを軽減できるが「スムーズアップデート」をプログラム的に制御す ることはできない(プロパティノードの項目に無い)。本稿では、2048画素超の2Dピクチャはすべて

「スムーズアップデート」にチェックを入れた状態でソースVIを保存している。

0. ビットシフト参考プログラムbitshift_FN.vi / bitshift_scale.vi

テキストの作業手順では処理内容をフォーミュラノードで記述することとし、フォーミュラノード内 のビットシフト演算(演算子”<<””>>”)で画素データから各色情報を抽出しているが、この演算は テキストp.3で言及の通り真のビットシフトではない。フォーミュラノード内のビットシフトの仕様は 32ビット符号無し整数(uInt32型)に対して次の通りである。

(0) 実際にシフトで使用されるパラメータは32で割った余りで、以下ではこの値をnとする。

(1) nが0のとき、MSBが1のデータに対して左右シフト共に結果は0x7FFFFFFFとなる(p.3図7 左参照)。

(2) 左シフト(0<n<32)では

MSBが1のデータに対して結果が0となる。

MSBが0のデータに対しても真のシフト結果のMSBが1となるときは結果が0となる。

(3) 右シフト(0<n<32)では

MSBが1のデータに対して、結果は0x7FFFFFFFをnビット右シフトした値となる。

すなわち、

(a) シフト対象データのMSBが1のときはシフト前に0x7FFFFFFFとし、この値をシフトする。

(b) シフトしてMSBが1となるときは結果を0とする。

となっている。

したがって、LabVIEWのフォーミュラノード内のビットシフト演算を元に真のビットシフト結果を 得るには次の様にすればよい。ここでは0<n<32とする。

対象データ(uInt32のaとする)のMSB(intのsとする)が1の場合は0に変更してシフトする。

左シフトでは元のMSBは失われるためシフト後にsの値は不要であるが右シフトではシフト後に必要 となる。フォーミュラノードではMSBが1の定数は書けない(0とみなされる)ので次の様にする。

(2)

左シフト

nビットシフトの結果MSBとなるシフト前データのビット31-n(図1で値d)が1の場合、 ビ ット31-nの値を0に変更してシフト演算を行い、シフト後に MSBを1とする。dを抽出するにはビ ット31-nのみが1であるマスク(uInt32のmとする。図3)と論理積を取ればよい。

if(a>0x7FFFFFFF) a=(a-0x7FFFFFFF)-1; m=0x01<<(31-n);

if(a & m) a=(((a ^ m)<<n) + 0x7FFFFFFF)+1; else a=a<<n;

31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 x x ・・・・・・・・・・・・・・・・ x d [31-n bits]

図1 シフト前のデータ

31 30 ・・・・・・・・・・・ n n-1 n-2 ・・・・・・・・・・・・・・・・・・・ 0 d [31-n bits] 0 0 ・・・・・・・・・・・・・・・・・ 0 0 図2 図1のデータをnビット左シフトした結果

31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 0 0 ・・・・・・・・・・・・・・・・ 0 1 0 0 ・・・・・・・・ 0 0 図3 ビット31-nのみが1であるマスクm

右シフト

MSBが1の場合、これを0に変更してシフト演算を行い、シフト後にMSBのシフト先であるビッ ト31-nに元のMSBをセットする。左シフトで用いたマスクをここでも使用する。

s=(a>0x7FFFFFFF); if(s) a=(a-0x7FFFFFFF)-1; m=0x01<<(31-n); a=(a>>n)+s*m;

31 30 ・・・・・・・・・・・ n n-1 n-2 ・・・・・・・・・・・・・・・・・・・ 0 s [31-n bits] x x ・・・・・・・・・・・・・・・・・ x x 図4 シフト前のデータ

31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 0 0 ・・・・・・・・・・・・・・・・ 0 s [31-n bits]

図5 図4のデータをnビット右シフトした結果

bitshift_FN.viは、上記の仕様を踏まえて真のビットシフト結果を求めるデモVIでp.3図6にブロッ クダイアグラム(概要p.3図2以降と同様、スペース節約のためプロパティでアイコン表示のチェック を外している)、図7に実行例のフロントパネルを示す。シフト対象の32b整数は、①数値スライド(ラ ベル”unsigned”:プロパティの「外観」で「デジタル表示器を表示」、「基数を表示」にチェックを入れ、

「デジタル表示 0」の「表示形式」で「16進数」を選択し、「最小フィールド幅を使用」にチェックを 入れ、幅8で「左を0でパディング」を選択)、②数値制御器(ラベル”signed”、キャプション”decimal (signed)”)、③16進数メニューリング配列(ラベル”hex_ring”、キャプション”hexadecimal (ring array)”)

の何れか1つで設定した値が他の制御器に反映される(概要p.15のDP_property.viのブールボタンク ラスタとメニューリング配列の連動と同様であるが、スライドを含むため発振しない様に論理を少し変 えている)。OK ボタン(ラベル・ボタン表記ともに”true shift”:既定の動作「放されたらラッチ」を トグルSWと同じ「押されたらスイッチ」に変更)OFF(VI 保存既定値)のときは非補正のシフト結 果を表示し、シフト量が0のとき0bシフトのOKボタン(ラベル・ボタン表記ともに「”<< 0”」、「”>>

0”」)を表示する。”true shift”がONのときは補正された真のシフト結果を表示する。

(3)

図6 bitshift_FN.viのブロックダイアグラム

図7 bitshift_FN.viの実行例 演算子”>>”による0b右シフト(左) 真の右シフトの例(右)

符号無し整数は関数部品「2の累乗でスケール」(パレットは「関数」→「プログラミング」→「数値」

→「2の累乗でスケール」)により正しいビットシフト結果(MATLABの関数bitshiftと同様にパラ メータが正で左シフト、負で右シフト)が得られる。「2の累乗でスケール」を用いて”true shift”をON にしたbitshift_FN.viと同じ真のビットシフト結果を得るbitshift_scale.viのブロックダイアグラムを 図8に示す(実行例は割愛)。

図8 bitshift_scale.viのブロックダイアグラム

(4)

1. 2値化参考プログラムthreshold.vi / threshold_RGB.vi

フォーミュラノードは C 類似の構文でアルゴリズムを分り易く書けるが前項に示す様な仕様の問題 に加え関数を定義できない等制限も多い。たとえばフォーミュラノード関数sizeOfDimで入力された 配列サイズの取得はできるが、これと等しいサイズで出力用の配列を宣言することはできない(配列宣 言のサイズは整数定数でなければならない)。LabVIEWでは多くの関数にスカラー以外のデータを入力 可能で(例えばスカラーと配列を入力した場合、スカラーを配列各要素に対応させた演算結果を出力)、

画像の回転等を含まない単純な処理であれば関数部品のみで容易に構成できる。

threshold.viは、テキストで例題として取り上げた閾値指定による2値化処理にガンマ値を指定した

グレー画像の表示と閾値の包含選択を追加して関数部品で構成したもので図9にブロックダイアグラム を示す。スペース節約のためファイルダイアログボックスは「アイコンとして表示」にチェックを入れ ている。

図9 threshold.viのブロックダイアグラム

テキスト例題では説明を簡単にするため各色の単純平均をグレーレベルとして閾値と比較したが、

threshold.vi では垂直スライド(対数スケール:ラベル gamma)で設定したガンマ値により各色を正

しい重みでグレーレベルを求めている。2値化された画像の2D整数配列は、閾値(スカラー)と画素 データの色平均値(2D整数配列)の比較結果(2Dブール配列)を整数に変換し白画素の値(ブロック ダイアグラム中の数値定数xFFFFFF は、数値定数を右クリックして表記法でU32、表示形式で16 進 数を選択し、外観で「基数を表示」にチェックを入れている)を乗じることで容易に得られる。

フロントパネル左側の 2D ピクチャ(ラベル”o_image”)には読込まれた画像がそのまま表示され実 行時に変更されることはないが、実行中に編集メニューで「値をデフォルトに再初期化(Z)」したときに VI保存時の既定画像ではなく読込まれた画像を表示させるためWhileループの内側に入れている。

グレーレベル表示には関係しない閾値指定の垂直数値スライド(ラベル”threshold”)と閾値包含指定 のOKボタン(ラベル”inclusive”、表示”threshold inclusive”:既定の動作「放されたらラッチ」をト グルSWと同じ「押されたらスイッチ」に変更)は右クリック「作成」でプロパティノードを項目「表 示」で作成し、水平トグルSW(ラベル”binary”、キャプション”grey binary”)がOFFのときは非表 示としている。

ファイル入力のプロンプトをキャンセルしたとき(註参照)にエラーとならない様に VI プロパティ の「実行」カテゴリで「自動エラー処理を有効」のチェックを外している。

註:キャンセルしたとき2Dピクチャの描画領域が白くなることで分る様に2Dピクチャの既定の表示

色は白(0xFFFFFF)で、幅または高さが描画領域よりも小さな画像を開くと文字通りの「余白」を生

ずる。一方、フォーミュラノード内で宣言する変数、配列の初期値は0であるためテキストの処理例で は、宣言した配列サイズ(描画領域と同じ 256×256)の幅または高さよりも小さな画像を開いたとき の「余白」は黒くなる。

(5)

図10にthreshold.viのVI保存時既定の閾値(127)、閾値包含指定(OFF)、ガンマ値(2.2)での 実行例を示す。

図10 threshold.viを実行中のフロントパネルウィンドウ 閾値による2値化(左)グレーレベル(右)

各色の平均値に対して2値化を行うthreshold.viに対し、threshold_RGB.viは色毎に閾値を設定し て各色を2値化(平均ではなく単独のためガンマ値は無関係)する例でブロックダイアグラムと実行中 のフロントパネルウィンドウを図11、12にそれぞれ示す。閾値包含指定により各色の閾値超(OFF)

または以上(ON)の画素の色レベルは255、閾値以下(OFF)または未満(ON)の画素の色レベルは 0で表示される。例えば閾値包含指定ONで閾値を255に設定するとレベル255の画素のみが表示され、

デジタルカメラでおなじみの色飛び、白飛びの簡易表示(正確な色飛びの判定にはヒストグラムでの評 価が必要。p.12 統計参考プログラム histogram.vi参照)ができる(図12右)。

図11 threshold_RGB.viのブロックダイアグラム

図12 threshold_RGB.viの保存時既定画面(左)と閾値255包含指定ONでの実行例(右)

(6)

図13は、LV_sample2.zipに同梱のtest.jpgをthreshold_RGB.viで開き、閾値包含指定をOFFで 緑と青の閾値を255(これを超える値は無いのでGとBのレベルは全て 0で表示)とした実行例であ る。赤の閾値を0(レベル0以外は全て255で表示)とした図左では本来赤の成分を含まない(例えば 青と黒の)境界部分の赤レベルが0ではないこと、赤の閾値を254(レベル255以外は全て0で表示)

とした図右ではレベルが255であるべき(例えば白と黄の)境界部分のみならず赤そのものの領域で赤 レベルが 255 ではないことをそれぞれ示している。可逆圧縮のtest.bmp、test.pngではこの様なこと は起らない。

図13 閾値包含指定OFFで緑と青の閾値を255として赤の閾値を変えたtest.jpgの結果

2. 指定画素値表示参考プログラム pixel_data.vi

pixel_data.viはテキストp.4図4およびp.5図6に掲載のPixel_dataの機能を関数部品で構成した もので、カーソル色は元画像、拡大画像共にカラーボックス(パレットは「制御器」→「数値」→「フ レーム付きカラーボックス」)で指定する。図14に示すブロックダイアグラムでは、スペース節約のた め配列サイズの行と列の数は「配列サイズ」の出力を「指標配列」に入力して得るのではなく「配列か らクラスタに変換」(右クリックしてクラスタサイズを既定の9から2に変更)に入力して「バンドル 解除」で取得している。

図14 pixel_data.viのブロックダイアグラム

LV_sample2.zipに同梱のtest.bmpには、テキストp.4図4左の赤の矩形が黒とマゼンタの矩形と隣 接し青の矩形と対向するパタンが4箇所あるが、セルの向きが異なるため空間周波数分析により圧縮し

たtest.jpgでは赤の矩形の頂点の画素値は同じにはならない(黒とマゼンタの頂点の画素値は等しいが

青の頂点の画素値も異なる)。4箇所のうち、test.jpgのテキストp.4図4右の箇所(画素値0xCA0C4A) 以外の2箇所で赤の画素値を比較したpixel_data.viの実行例をp.7図15に示す。

テキストの図の配置を90度左に回転した関係の図左では値が 0xCA0C4C(ここには図を掲載してい ないが図左と上下を交換した配置の63行96列の画素もこれと同じ)と異なり、テキストの配置の上下 を交換した配置の図右では同じ値0xCA0C4Aとなる。

(7)

図15 pixel_data.viを実行中のフロントパネル

3. 画像色シフト参考プログラム color_shift.vi

color_shift.vi(2016/10/26版ではcolor_shift_rev.vi)は元画像を色シフトした結果とシフト後に逆方 向に同じ量シフトした結果を併せて表示する VI である。シフト対象を画素データ全体とするか(シフ ト量-24~24 は水平スライドで指定:左シフトを左側に目盛るためスケールを反転)RGB 各色の独立 な3個の8bデータとするか(シフト量-8~7は各色に対応するクラスタ化された3本の垂直スライド で指定)を水平トグルSW(ラベル”color”、キャプション”pixel data / color”)で切替える。切替により 必要な制御器のみが表示され、前者の場合は水平スライドと画素データ長選択の OK ボタン(ラベ ル”32b”、キャプション”keep 8MSBs”:ONのとき最上位バイトを含めて扱う)が表示される。

color_shift.viのブロックダイアグラムと実行中のフロントパネルウィンドウを図16、図17に示す。

図17左が画素データ24bのシフト、図17右が色毎の独立なシフトの例である。

図16 color_shift.viのブロックダイアグラム

図17 color_shift.viを実行中のフロントパネル 画素シフト(左)、色毎にシフト(右)

画素データ全体のシフトでシフト対象が24bデータの場合、左16bシフトでは赤と緑が失われ右16b シフトで復元されるのは青のみである。これに対し、最上位に8bのバッファがある32bデータがシフ ト対象であれば緑の情報も復元される。p.8図18は、LV_sample2.zipに同梱のtest.pngを開いてこれ を比較した例である。

(8)

図18 color_shift.viを実行中のフロントパネル 24bデータ(左)、32bデータ(右)

4. 隣接画素処理参考プログラム pixel_mixture.vi

pixel_mixture.viは、テキストp.19処理例7の隣接画素処理を関数部品で構成したもので、仕様を次 の様に変更している。配線量削減のため3個のサブVI(Pf2RGBc.vi、RGBcf2P.vi、noise_generator.vi)

を使用しており、これらのサブVIをメインVIのpixel_mixture.viと同じ場所に置いて開くこと。

2D ピクチャに水平垂直両スクロールバーを表示し(このとき256×256 の画像を余白も欠損も無く 表示するサイズは280×280となる)、対象画像のサイズを256×256に限定しない。

係数を掛ける各色の値はU8の画素値ではなくガンマ補正(ガンマ値は2.2に固定)した値を使う。

全体にかかる係数(処理例7の水平スライド ”factor”)を9個の重み係数の和の逆数(和が0となる ときは1)とすることで入力を省く。

OKボタン のクリックで処理結果をJPEG圧縮またはBMP非圧縮の画像ファイルとして保存す る(省略時のファイル名は”_temp”)。

メニューリング(ラベル”noise”、キャプション”noise type”)で元画像に付加する雑音の種類(なし、

ドット、水平、垂直、クロス)、カラーボックス(ラベル”c_box”、キャプション”noise color”)で雑音 の色、垂直スライド(ラベル”space”)でドットまたはラインの間隔を指定できる。

図19にpixel_mixture.viのブロックダイアグラムを示す。画素データを画像の上下左右と斜め4方

向計8個の隣接画素に当該画素を含めた9個の画素から得る演算は、フォーミュラノードでは容易に記 述できるが、関数部品では少し煩雑になる。画像の配列を mn 列とするとき、上下左右に拡張した

(m+2)×(n+2) の配列を「配列初期化」で作成し、「部分配列置換」でm×n部分を対象画像で置換し(図

の Whileループ左下赤枠)、これを「部分配列」で切り出して使う。重み付きの和を取った配列の有効 な部分のサイズは (m-2)×(n-2) であり、最後に外枠の要素をクリアする(本 VI ではクリア部分は 0 の黒画素:図の右上紫枠)。

図19 pixel_mixture.viのブロックダイアグラム

(9)

図20にpixel_mixture.viが参照するサブVIのブロックダイアグラムを示す。U32のm×n画像デー タに係数を掛けた結果はU8のm×n配列で色毎に扱うのではなく後続の処理の便宜のためR、G、Bの 順に行方向に連結したサイズ3m×nのDBL配列として扱う。Pf2RGBc.vi(ブロックダイアグラムは図 左上)では画素配列に係数を掛け連結したDBL配列を出力し、RGBcf2P.vi(ブロックダイアグラムは 図左下)ではDBL配列に係数を掛けて通常のU32のm×n画素配列に出力する。

図20 pixel_mixture.viが参照するサブVIのブロックダイアグラム

図21にpixel_mixture.viのフロントパネルの例を示す。係数は保存時既定(輪郭抽出)で、図左は

保存時既定画面、図右はLV_sample2.zip に同梱の test2.png に既定色(0xFFFFFF)のクロスノイズ を間隔がセルのサイズと等しい”space”32 で付加した実行例で各セル内にはセルの補色の十字が現れる。

図21 pixel_mixture.viの保存時既定画面(左)と色セルにクロス雑音を付加した輪郭画面(右)

5. 形状補正参考プログラム perspective_control.vi

ここまでの参考プログラムでは、必要な処理を配列全体の演算により一度に行い配列サイズに対応し た反復部分は無いが(pixel_mixture.viでは雑音付加のnoise_generator.viでForループを使用してい るが隣接画素の混合自体は反復不要)、テキストp.18処理例6の様に表示画素の指標を幾何学的な計算 で求める処理では、Forループによる反復を要する。フォーミュラノードを使用せず関数部品で同等な 処理を構成するperspective_control.viでは仕様を次の様に変更している。

水平垂直両スクロールバーを表示し、対象画像のサイズを256×256に限定しない。

アスペクト比の保存された整形しない画像を対象とし、原画像のアスペクト比の入力を省く。

撮影時の仰角(または俯角)を度単位とする。

処理結果をOKボタン のクリックで画像ファイル(拡張子はメニューリングで選択)として保存 できる。

(10)

図22にperspective_control.viのブロックダイアグラムを示す。赤枠内の指標計算部分で関数部品と フォーミュラノードの処理はそのまま対応(例えば図上緑枠内の文と内側の For ループ)しているが、

関数部品「指標配列」では範囲外の指標に対する要素は既定値(数値配列では0)を取るため範囲外チ ェックを省略している(現在の版ではフォーミュラノードでも範囲チェックは不要であるがテキスト処 理例で図中赤字部分のif文は文法仕様が変更された場合への対応)。処理例6で定数127.5で与えられ る値はサイズをm×nとするとき、外側のFor ループでは(m-1)/2、内側のForループでは(n-1)/2 となる。

図22 perspective_control.viのブロックダイアグラム

図23はテキストp.19図27右の画像をアスペクト比3:2のまま読み込み、 をクリックして処理 結果をファイルに保存した例である。

図23 perspective_control.viを実行中のフロントパネルウィンドウ(左) 保存した画像(右)

6. 統計参考プログラム histogram.vi

画像の各色レベルのヒストグラムを表示するテキストp.20 処理例 8も、配列に対する一度の演算で は処理できない。histogram.viは処理例8と同様の処理をフォーミュラノードを使用せずに関数部品で 構成するもので画像のサイズは処理例と同じ256×256に限定しているが(サイズがこれを超える画像 では左上の256×256画素が対象となる)仕様を次の様に変更している。

ラインの指定に列選択の水平スライドを追加し、行と列とは水平トグルSW(ラベル”column”、キャ プション”row column”)で切替える。

画像全体および指定したラインの画素レベルの頻度配列を表示し、各要素の内容を確認できる。行は

(11)

色(0, 1, 2がそれぞれR, G, B)、列は色レベル(0~255)を示す。 のクリックでトグルSWとカ ーソルで選択された頻度配列を(テキストエディタ、スプレッドシートでの表示を考慮し行をレベル、

列を色と転置して)テキストファイルに保存する(列の区切りは水平タブ 0x09、行の区切りは復帰改

行 0x0D0A)。ファイル名は画像ファイルのファイル名(ピリオドはアンダーバーで置き換える)に対

象範囲を連結したもの(例:test_png_whole.txt、test_jpg_column127.txt)となる。

各色でレベル255の画素が254の画素よりも多い場合に色飽和と判定して円LEDを点灯する。

ヒストグラムの縦軸最大値を直接指定する処理例8の垂直スライドrangeに代え、最大値を画像全体

では65536、ライン指定では256をそれぞれ基準とし、縦軸の拡大率を垂直スライド(ラベル”magnifier”

の値(1~256:保存時既定は65.536)で指定する。

図24はhistogram.viのブロックダイアグラムで、3箇所でForループを使用している。図の左下赤

枠は画像全体の頻度配列生成の2重Forループ(Whileループの外側で一度だけ実行される)、中央緑 枠は指定ラインの頻度配列生成のFor ループ(ケースストラクチャのTRUE で実行され、画像サイズ が小さく指定したラインの指標が範囲外となるときはFALSEとなり図左下で初期化した全要素0の配 列が渡される)、図右上の紫枠はヒストグラム画像生成のForループ(サイズ256の1D配列で1行ず つ生成するので2重Forループではない)をそれぞれ示す。

図24 histogram.viのブロックダイアグラム

図25 画像全体のヒストグラム 色飛びの無い画像(左)、緑と青で色飛びのある画像(右)

図 25 は色飛びの無い画像(左)と緑と青で色飛びのある画像(右)の画像全体のヒストグラムの表 示例である。p.6図13ではR, G, B, C, M, Y, W, Kの矩形に対するJPEG圧縮画像では0、255以外の レベルの画素が存在する(PNG圧縮ではこの様なことはない)ことを見たが、test.jpg、test.pngを開

(12)

いた画素レベルのヒストグラム表示例と保存した頻度配列のテキストファイルをExcelで開いた例(レ ベル0~7、240~255の部分を表示)を図26に示す。

図左のJPEG圧縮では0と255の近傍だけでなく中間レベルまで広く分布するが図右のPNG圧縮で は、各色とも0と255がそれぞれ画像全体では32768画素、水平ライン(行)ではどの行も128画素 となっている(test2.pngでは水平垂直の全ラインで各色0と255が128画素ずつとなる様にセル色を 配置し、辺を共有するどの色の組合せも4回ずつ現れる様に構成している)。

図26 JPEG圧縮画像(左)ではPNG圧縮(右)と異なり0、255以外のレベルの画素が存在する

図27はライン指定のヒストグラムの例で、カーソルの色はVI保存時既定の緑としている。

図27 ライン指定のヒストグラム 行指定(左) 列指定(右)

7. パタン移動参考プログラム alias.vi / barber_pole.vi

前3項の参考例とは逆に配列の処理をフォーミュラノードで記述するよりも関数部品による操作の方 が簡単な例として周期パタンの移動表示が挙げられる。alias.vi は、標本化周波数と信号周波数との関 係を視覚化した折り返し雑音参考プログラムLV_alias(LabVIEW2013版実行ファイルのみ)のパタン を正弦波波形に限定し関数部品で構成したものである。

http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_alias.zip

周期パタンでは初期値だけ生成すれば、配列の切り貼り(画面上で右方向に進むパタンでは右端の列 をフレーム間のシフト量(註参照)だけ左端に移す回転シフト)で以降のパタンを生成できる。実際に は「入力を連結」を指定した「配列連結追加」では連結が行方向で行われるため、転置して表示する。

註:パタン変化の周波数(ラベル”p_freq.”、キャプション”pattern frequency (Hz)”)÷フレームレート

(ラベル”f_rate”、キャプション”frame rate (fps)”)×1周期の列数(転置されるため実際には行数でこ

こでは256)を1周期の列数で割った余りとなる。

(13)

図28 alias.viのブロックダイアグラム

図28にalias.viのブロックダイアグラムを示す。LV_aliasではみかけのパタン周波数が負のときLED

(点灯色赤:ラベル”negative”)を点灯させたが、alias.viでは折り返し雑音を生じる場合のLED表示

(点灯色マゼンタ:ラベル”alias”)を追加している。図 29 にみかけのパタン周波数がそれぞれ折り返

し雑音で-1Hz(図左)、+1Hz(図右)となる実行例のフロントパネルを示す。絶対値が等しく符号が

異なる周波数を映像の場合は区別できるが音声では両者を区別することはできない。

図29 折り返し雑音を生じる実行例のフロントパネル

理髪店の回転ポールは円筒上の螺旋状縞模様が回転運動により下から現れ上昇して上に消える様に 見えるものでこの無限上昇運動に喩えられるものに無限音階シェパードトーン(Shepard tone:註参照)

がある。LabVIEWは画像だけでなく音声の処理も容易に行え(概要例3)、barber_pole.viは回転ポー ルの表示に連続無限音階の再生を加えたもの(2016/10/26版ではbarber_pole_rev.vi)である。

註:部分音を可聴域にわたりオクターブ間隔で配し(標準ピッチのAの音であれば、27.5, 55, … 440, 880

… 7040, 14080。単位はHz)、部分音の振幅に高域と低域で減衰するエンベロープを掛けて合成し各部

分音の周波数を同比率で増加させると(部分音が低域から現れ高域で消えてゆく)周波数が無限に増加 するかの様に聴こえる(逆にすればどこまでも減少するかの様に聴こえる。聴こえ方は個人により異な りエンベロープと機器の周波数特性にも依存する)。半音程ずつステップで変化するものを discrete Shepard scale、連続的に変化させるものをcontinuous Risset scale または Shepard-Risset glissando と呼ぶ。discrete Shepard scaleの音声ファイル(左チャンネルは上昇、右チャンネルは下降。0.5秒で 半音程ステップしオクターブ変化を5回繰返す)を生成するMATLABスクリプトShepard_tone.mが 旧課程情報学実験Ⅱ課題②「オシロスコープと信号処理」のMATLAB_sample.zip にある。

(14)

図30にbarber_pole.viのブロックダイアグラムを示す。回転ポール初期パタンの生成(図左上赤枠)

ではalias.viとは異なり塗り潰しパタンであるため2 重の For ループとなっている。円筒上の模様ら

しく見せるため色レベルを視線と法線との成す角の余弦で落としている(実際にはガンマがかかり更に 減衰)。パタンの見かけの移動方向が配列の行方向であるため表示(図左下青枠)では転置を要しない。

フレーム間シフト量は24fpsで90rpm(街の理髪店の標準速度)相当となる16行に固定している。

連続無限音階の生成(図右下濃緑枠)では部分音の正弦の引数を指数関数(MATLAB_sample.zip中

のsignal_gene.m 50行以降の高速スイープ信号と同様)として結果にエンベロープを掛けている。図

右上紫枠の Whileループは排他動作をする任意個数の自照式押しボタン SW の動作を模倣するもので 動作を「押されたらスイッチ」に変更したOKボタンをクラスタ化している。2個のケースストラクチ ャ(何れもFALSEケースは空)の左側ではクリックしたOFFのボタンをONで無効化(トグル動作 によりON状態のボタンはクリックで OFFとなるため、ON状態のボタンの操作を許すと論理が複雑 になる)、それ以外のボタンをOFFで有効とし、右側では「値をデフォルトに再初期化(Z)」した場合に 以降のループで全てのボタンがOFFとなることを防いでいる。

図30 barber_pole.viのブロックダイアグラム

図31にbarber_pole.vi実行中のフロントパネルウィンドウと再生音声をループバック可能なオーデ

ィオインタフェースで入力した WaveSpectra の画面を示す。バーチャルカフェテリアでは音声が電話 帯域程度に制限されるため、この図のみソースVIではなく実行ファイルをPCのOSで実行している。

WaveSpectraのPeak表示の赤の曲線が部分音減衰のエンベロープを示す。

図31 barber_pole.vi実行中のブロックダイアグラムとWaveSpectraの画面

(15)

表示パタンと同様に音声データもオクターブ分(本VIでは6秒)を生成して使い回すことはできる

(周期データでは両端で位相を揃える必要があり、瞬時周波数の両端の比が2であるオクターブ周期の 場合は最低部分音の周波数の初期値がloge2を周期で割った値の整数倍でなければならない)が実行時 にエンベロープ等のパラメータを変更する場合には再生部分のWhileループ内で生成する必要がある。

離散的な無限音階(半音程のステップでクリックを防ぐためフェードイン・フェードアウトを伴う1 音分の係数配列を生成している)を加えパラメータを設定可能、波形、スペクトラム、スペクトログラ ムの表示を追加したLV_Shepard2017.viが「LabVIEWによる信号関連参考プログラム」にある。

http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_signal.zip

以下の2本の参考例はLV_sample2_update.zip(2017/11/12版「LabVIEW画像情報処理サンプルプ ログラム_update(解説)」)収録のRGB_setting.viおよびpixel_color.viのLabVIEW2017改訂版で、そ れぞれのサブフォルダにソース以外に LabVIEW2017 版の実行ファイル(スタンドアロンアプリケー ション:このうちpixel_color.exeは停止状態で開く)および設定ファイルを含めている。

この2本はツールとしての使用を目的としており、掲載図ではブロックダイアグラムを割愛しフロン トパネルの実行例に注釈を入れている。LV_sample2_update.zip に収録されたこの 2 本以外の VI の

LabVIEW2017版については次の通りである。

auditory_illusion.vi:上記LV_Shepard2017.viを参照

pixel_color2.vi:概要例7 screen_pixel.viを参照

8. RGB_setting.vi

色設定参考プログラムRGB_setting.vi(テキストp.5図5、p.6 図7)は旧課程課題Ⅱ⑥の「3-3 色 設定された液晶ディスプレイの観察」の画面設定を目的に作成されたものである。図32にxyY指定時 の実行例のフロントパネルを示す。

図32 RGB_setting.viの実行例 (xyYを指定して0x568576の色画面を表示)

(16)

テキスト掲載版との仕様の違いは次の通りである。

数値スライドのプロパティで「デジタル表示器を表示」を指定した。

色画面の2Dピクチャを小さくして色設定部分をフロントパネル右側にまとめ、xyY設定部分もスク ロール不要で表示されるレイアウトとした。

ファイルに保存される画像のサイズを旧課程当時のデスクトップサイズ1680×1050(WSXGA+)以 外に一般的なデスクトップサイズをメニューリングで選択可能とし、ファイル名を rrggbb.xxx から rrggbb_s.xxxに変更した。ここでrrggbbは各色の16進数値を連結したもの、xxxは拡張子(pngまた はbmp)、sは選択可能なサイズ識別16進数字(0:XGA、1:WXGA 、2:FWXGA 、3:WXGA+、

4:SXGA、5:SXGA+、6:WSXGA+、7:FHD、8:WUXGA、9:QXGA、A:WQHD)である。

xyYの可能な入力値を条件x+y≦1およびX+Y+Z≦300で制限し、”x+y over”のLEDを削除した。

プロパティノードにより色域表示2Dピクチャとxy入力スライドの相対位置をドット単位で合せた

(註参照)。

註:プロパティで参照されるオブジェクト左上の座標ではオブジェクト本体占有部分以外に表示される ラベルまたはキャプション、数値スライドではデジタル表示器も含まれる。このため、色域表示の 2D ピクチャではラベル・キャプションを非表示とし、水平スライドではスライド左端の左、垂直スライド ではスライド上端の上にこれらが位置しない様にしている。

9. pixel_color.vi

テキストp.3に説明(図は4、6)のPixel_data(本稿2のpixel_data.viではない)にスクロールと 閾値処理を含めpixel_color.viに名称変更したもので、図33はLV_sample2.zip同梱のRGB_setting.png

(p.15図32のRGB_setting.vi実行時フロントパネルのキャプチャ)を開いた実行例である。

図では、画面色0x568576を設定したxyスライドにカーソルを合せ、対応する色域表示画面の画素 を取得している。画面サイズが小さい色域表示画面には生成色と等しい画素が含まれるとは限らず、こ の例では3色全てが一致する距離0の画素は無く(距離1,2,3,4の画素は色域画面内にそれぞれ3,5,5,10 個ある)0x568577となっている。閾値包含、2値化、色別閾値を指定し閾値を0x568576の各色に設 定するとき、右下の合成2値画像で各色の閾値に対応する3本の直線(色域三角形の辺に平行)の交点 の画素が(色域表示部分に十分なサイズがあれば)設定色に相当する。

図33 pixel_color.viでRGB_setting.pngを開き色域画面で対応する画素を表示した例

(17)

テキスト掲載のPixel_dataとの仕様の違いは次の通りである。

画像サイズを256×256に限定せずスクロール可能とし、等倍表示部分(キャプション”dot by dot”:

2Dピクチャの描画領域は最大256×256で元画像の幅または高さが256未満の場合、元画像のサイズ に制限される)が全体画像(ラベル”scaled”:註参照)に占める範囲が分る様に、またカーソル指定画 素中心の拡大表示画像(ラベル”magnified”:描画領域256×256)で元画像1画素の境界を示した。

註:2Dピクチャの描画領域の長辺を256画素としている。拡大縮小画像の表示は2Dピクチャのプロ パティ項目「ズーム係数」(ZoomFactor)を指定する方が容易(LabVIEW2017版では表示も改善され た)であるが、カーソルと境界ラインを正規の幅で重畳するには結局Forループ処理が必要となるため、

ここでは画像全体をForループでスケールしている。

2Dピクチャ”dot by dot”の原点(左上端画素の座標)は水平・垂直スクロールバー以外にクラスタ(ラ ベル”origin”)中の数値制御器(表示器を兼ねる)で、またカーソル指定座標は水平・垂直スライドで 等倍表示部分内の「相対」座標を指定する他、クラスタ(キャプション”cursor position”)中の数値制 御器(表示器を兼ねる)で画像中の絶対座標を指定できる。

カーソルと境界(”scaled”では”dot by dot”の表示部分、”magnified”では指定画素)の色はスライド、

数値ボックスではなくカラーボックスをクリックして指定する。

2Dピクチャ”dot by dot”にはカーソルを常時表示するが、”scaled”、”magnified”ではカーソルと境界 の表示をそれぞれOKボタン(表示”cursor”、”boundary”:VI保存時既定はON)で選択できる。

等倍表示部分の閾値処理結果を4個の2Dピクチャ(ラベル”red”、”green”、”blue”、”composite”)

に表示する。

閾値処理は、3個のOKボタンでそれぞれ閾値包含(ボタン表示”threshold inclusive”)、2値化(ボ タン表示”binary”)、色別閾値(ボタン表示”individual”:ONのときクラスタ化された3本の垂直スラ イド、OFFのときスライド1本がそれぞれ「デジタル表示器を表示」で表示される)を指定する。

図34は、LabVIEWの各データ型の配線サンプルを並べたVIのブロックダイアグラムをキャプチャ

した画像(LV_sample2.zip に同梱のwire_sample.png)を開いて文字列データの2D 配列の配線パタ ンの色と形を確認する例である。

図34 pixel_color.viでwire_sample.pngを開き配線パタンを表示した例

参照

関連したドキュメント

LabVIEW による手回し計算機参考プログラム (最終改訂 2019/11/28) 書庫ファイル内容 LV_pinwheel.zipには本稿(拡張子.pdf)、本稿掲載図およびVIブロックダイアグラムキャプチャ画 像(フォルダFigures:拡張子.png)、LabVIEWによる手回し計算機参考プログラムLV_pinwheelの

ル画像情報が得られる。四つの圧縮スペクトル画像情報 に逆ハール・ウェーブレット行列を積演算する。四つの 入力画像情報が得られる。四コマアニメ画像情報ファイ ルを図 3

(テンプレート画像) 入力画像

多値画像 2値画像. こちらの画像の白い部分についてのみ

その後,特徴量形の画像処理を高速,汎用化する手法とし

エラーメッセージ件数報告 書(週報) システム別KBP,CRTに よる登録照会件数報告書(月 報) 給食情報報告書(日報) EXEC コンソールタイプライタ 監視装置 ラインプログラム

内容(1-3):基礎 1:画像処理の様々な応用 2:Linuxの基礎、画像クラス 3:画像化・色相・装置・表示..

[email protected], 非常勤講師 大妻女子大学