2016-10-04 5 views
0

私はモルフォロジーのオープニングをプログラミングしており、入力画像と同じ結果を返しています。私はそれの説明を誤解していますか?私のコードは次のとおりです。モルフォロジーのオープニングを返す入力

Var x, y; 
Func limit, erosion, dilation; 

ImageParam input(type_of<uint8_t>(), 2); 
Param<int> dimension; 

RDom r(-1 * dimension/2, dimension, -1 * dimension/2, dimension); 
limit = BoundaryConditions::repeat_edge(input); 

erosion(x, y) = argmin(r, limit(x + r.x, y + r.y), "erosion")[2]; 
dilation(x, y) = argmax(r, erosion(x + r.x, y + r.y), "dilation")[2]; 

erosion.compute_root(); 
dilation.vectorize(x, 4).parallel(y); 

Target target = get_host_target(); 

target.set_feature(Target::NoRuntime, true); 

dilation.compile_to_static_library(path, { input,dimension }, target); 
+0

モルフォロジーのオープニングはノーオペレーションにすることができます。テストとして画像に塩騒音を加えましたか?それは開封後に残っていますか? –

+0

私はOpenCVのドキュメントの例として使われている絵を使ってみましたので、結果はどうなるか考えていますが、私の関数は同じ結果を生みません。 私が使用している画像はこの[画像]の左側の部分です(http://docs.opencv.org/2.4/_images/Morphology_2_Tutorial_Theory_Opening.png) – Rok

+0

また、最初に確認するのは、ハライド生成コードの呼び出しからエラーが戻ってくる... –

答えて

2

次は私のためのOpenCVのチュートリアルの画像に類似した結果を生成するようだ:

#include "Halide.h" 
#include "../../tools/halide_image_io.h" 

using namespace Halide; 

int main(int argc, char **argv) { 
    Var x, y; 
    Func limit, erosion, dilation; 

    ImageParam input(type_of<uint8_t>(), 2); 
    Param<int> dimension; 

    RDom r(-1 * dimension/2, dimension, -1 * dimension/2, dimension); 
    limit = BoundaryConditions::repeat_edge(input); 

#if 0 
    erosion(x, y) = minimum(limit(x + r.x, y + r.y), "erosion"); 
    dilation(x, y) = maximum(erosion(x + r.x, y + r.y), "dilation"); 
#else 
    erosion(x, y) = argmin(r, limit(x + r.x, y + r.y), "erosion")[2]; 
    dilation(x, y) = argmax(r, erosion(x + r.x, y + r.y), "dilation")[2]; 
#endif 

    erosion.compute_root(); 
    dilation.vectorize(x, 4).parallel(y); 

    Image<uint8_t> in = Halide::Tools::load_image("/some/path/morphology.png"); 
    input.set(in); 
    dimension.set(10); 

    Image<uint8_t> result = dilation.realize(in.width(), in.height()); 

    Halide::Tools::save_image(result, "/some/path/morphology_out.png"); 

    return 0; 
} 

の#if 0ブロックがだけではなく、最小値と最大演算子を使用して示すことを意図していますargmin/argmaxのまた、argmin/argmaxのr引数はオプションです。

イメージがHalide AOTコンパイルされた関数にどのように渡されているか、または返された出力をどのように扱っているのかがわかります。また、debug_to_fileを使用するか、Halideコードで印刷して、パイプラインの中間段階をデバッグすることもできます。

+0

あなたのコードは正常に動作するはずですが、AOTコンパイルで(AOT用の修正されたオブジェクトとともに)使用しようとしたときに、動作させることができませんでした... AOT関数を呼び出すための引数としてraw_bufferを使用して画像を渡します。 – Rok

+1

バグは、生成されたフィルタを呼び出すコードでほぼ確実です。どのように失敗しているのかをデバッグする必要があります。最初に行うべきことは、アサーションの失敗が起こっていないことを確認することです。これらの結果、フィルタからエラーが返されます。次のステップは、Halide生成コードが期待する領域を処理するような境界とストライドがあることを確認することです。印刷ステートメントを追加するか、またはトレースをオンにすると役立ちます。 JITとAOTのコンパイルにはいくつかの違いがあることは遠隔で可能ですが、それは非常に起こりそうもありません。 –

関連する問題