画像処理関連

img バス仕様

画像処理において、AXI4 Stream バスの信号をさらに簡易に扱う為に、Jellyでは imgバスという独自仕様に変換して処理している。

imgバスの主な信号は以下の通りであり、必要に応じて個別画像処理に付随する信号を追加する。

signal name description
reset リセット信号
clk クロック
cke クロックイネーブル。ピクセル入力が無い時は落とす
line_first 先頭ラインを示す
line_last 最終ラインを示す
pixel_first ライン内で先頭ピクセルを示す
pixel_last ライン内で最終ピクセルを示す
de 有効ピクセルを示す
user ユーザーデータ
data 画像データ
valid valid の立たないデータは他のすべての信号は無効とする

img バスは有効ピクセルが無い場合に cke(クロックイネーブル)をネゲートするのが特徴である。

したがって、cke の有効な期間のみを処理すれば、データはすべて連続であり、パイプラインステージにおいてステージ前後のデータが左右のピクセルに必ず対応することが保証できる。

また、画像処理においてしばし重要になるボーダー処理において、画像ボーダーを示す4辺のフラグを用意することでこの処理を簡易化している。

一方で有効ピクセルを示す de 信号も備えている。基本的には無効ピクセルはimgバスに変換する段で cke が下げられるが、3x3などのブロック処理を行う場合は最終ラインの掃き出しが必要であるため、deの下がった無効ラインの入力をオプションとして備えている。 また、画像処理の出力過程においては、不要ピクセルのdeを下げることで画像縮小などの処理が可能となる。

これらにより多くの制御信号を有しているが、これらをすべて必須とするとリセットの接続先が増える課題がある。そこでvalid信号をオプショナルとして備えており、valid の立たないデータは他のすべての信号は無効とすることで、リセット信号の接続を valid にかかわる信号だけにすることも可能としている。

jelly_axi4s_to_img

AXI4 Stream を img バスに変換し、画像処理後に再び AXI4 Stream に戻すコア。

jelly_img_blk_buffer

画像を N×M のブロックに変換して画像処理をアシストするコア。 ラインバッファとピクセルバッファを備え、ブロック処理に必要な単位で出力する。 M-1 ライン分の遅延が発生する。

その際、ボーダー処理として NONE, CONSTANT, REPLICATE, REFLECT, REFLECT_101 などの処理が選択可能であり、OpenCV のそれとほぼ一致する。

jelly_img_demosaic_acpi

ACPI法によるデモザイク

jelly_img_color_matrix

カラーマトリックス処理

jelly_img_gaussian_3x3

3x3 限定のガウシアンフィルタ

jelly_img_sobel_core

Sobel フィルタコア 固定値での演算なのでホストから設定するレジスタはない。

jelly_img_binarizer

2値化コア

jelly_img_selector

画像セレクタ。 主にデバッグ時に中間データを切り替えて出力するなどで利用可能

jelly_img_previous_frame

1つ前のフレームを外部メモリに保存して利用するためのDMAモジュール

jelly_img_dnn_maxpol

DNN用の MaxPooling 層。

縮小を行い de の立たないデータを出力するため、この後にさらに画像処理を行うには一度 AXI4 Stream に戻す必要がある。