最適な境界ピクセルたたみ込み

このアルゴリズムの最後には、エッジ ピクセルを境界領域に複製します。一定したデータフローおよびデータ再利用を実現するため、ローカル キャッシュが使用されます。次の図に、境界サンプルがどのように画像に組み込まれるかを示します。

  • 各サンプルが垂直たたみ込みからの vconv 出力から読み込まれます。
  • サンプルが 4 つのピクセル タイプのいずれかとしてキャッシュに格納されます。
  • サンプルが出力ストリームに書き出されます。

次に、境界ピクセルの位置を決定するコードを示します。

// Border pixels
pvconv=vconv_buffer; // set/reset pointer to start of buffer
Border:for (int i = 0; i < height; i++) {
  for (int j = 0; j < width; j++) {
    T pix_in, l_edge_pix, r_edge_pix, pix_out;
#pragma HLS PIPELINE
    if (i == 0 || (i > border_width && i < height - border_width)) {
      // read a pixel out of the video stream and cache it for
      // immediate use and later replication purposes
      if (j < width - (K - 1)) {
        pix_in = *pvconv++;
        borderbuf[j] = pix_in;
      }
      if (j == 0) {
        l_edge_pix = pix_in;
      }
      if (j == width - K) {
        r_edge_pix = pix_in;
      }
    }
    // Select output value from the appropriate cache resource
    if (j <= border_width) {
      pix_out = l_edge_pix;
    } else if (j >= width - border_width - 1) {
      pix_out = r_edge_pix;
    } else {
       pix_out = borderbuf[j - border_width];
    }
    *dst++=pix_out;
  }
}

このコードの明らかな違いは、タスク内に条件文が多く使用されている点です。これにより、タスクがパイプライン処理された後、データが継続的に処理されるようになります。条件文の結果はパイプラインの実行には影響しません。結果は出力値に影響しますが、入力サンプルが使用可能である限り、パイプラインは継続的に処理されます。