4

私は MATLAB の初心者です。このアルゴリズムを使用して matlab でフラッド フィリングを実装しようとしています。再帰関数を正しく使用していない可能性がありますが、何が間違っているのかわかりません。このコードにより、matlab が閉じます。次のコードを使用しています朝からデバッグしようとしていますが、問題を見つけることができませんでした

function [ colored_Image ] = floodFill( image, target_Loc_x, target_Loc_y, targetColor, replacementColor )
colored_Image = image;

if (target_Loc_x >= 1) && (target_Loc_x <= size(image,1)) && (target_Loc_y >= 1) && (target_Loc_y <= size(image,2))
    if image(target_Loc_x,target_Loc_y) == targetColor
        colored_Image(target_Loc_x,target_Loc_y) = replacementColor;
        colored_Image = floodFill(colored_Image,target_Loc_x ,target_Loc_y + 1, targetColor, replacementColor); 
        colored_Image = floodFill(colored_Image,target_Loc_x + 1,target_Loc_y, targetColor, replacementColor);
        colored_Image = floodFill(colored_Image,target_Loc_x,target_Loc_y - 1, targetColor, replacementColor);
        colored_Image = floodFill(colored_Image,target_Loc_x - 1,target_Loc_y, targetColor, replacementColor);
    end

end


end

を使用してこの関数を呼び出す

image = floodFill(im,1,1,0,127);
imshow(image);

im は 200 x 200 のマトリックス イメージです。黒 (0) を灰色 (127) にしたいのですが、助けていただければ幸いです。

4

4 に答える 4

5

おそらく、Matlab の再帰制限に達しています。コンピューターはクラッシュしませんが、次のエラーが発生します。

500 の最大再帰制限に達しました。制限を変更するには、set(0,'RecursionLimit',N) を使用します。利用可能なスタック スペースを超えると、MATLAB やコンピューターがクラッシュする可能性があることに注意してください。

これを回避するには、再帰を使用しないように floodFill を書き直します。Wikipedia には、いくつかの代替アルゴリズムがあります。

また、aardvarkk の回答は、Matlab の優先のインデックス作成について重要な点を指摘しています。すべての x 変数と y 変数を交換することで、関数を修正できます。

于 2013-01-09T15:35:05.103 に答える
2
    %(画像が img に読み込まれ、「値」で満たされていると仮定します)

関数フラッド(x,y,img,値)

    %MATLAB にはフレンドリ キューがありませんか? Java を使用する   
    import java.util.LinkedList
    q = LinkedList();

    %塗りつぶし画像
    初期 = img(y,x);

    q.add([y, x]);

    q.size() > 0 の間

        pt = q.removeLast();
        y = pt(1);
        x = ポイント (2);

        if (img(y+1, x) == 初期)
            img(y+1,x) = 値;
            q.add([y+1, x]);
        終わり
        if (img(y-1, x) == 初期)
            img(y-1,x) = 値;
            q.add([y-1, x]);
        終わり
        if (img(y, x+1) == 初期)
            img(y,x+1) = 値;
            q.add([y, x+1]);
        終わり
        if (img(y, x-1) == 初期)
            img(y,x-1) = 値;
            q.add([y, x-1]);
        終わり
    終わり
終わり

matlab の再帰制限は非常に低いため、再帰呼び出しを使用してフラッド フィルを行うことはできませんでした。また、適切なキューがないように見えるため (間違っている場合は修正してください)、Java からキューをインポートする方が簡単です。

これは境界チェックを行っていません(フラッドが端にぶつかると失敗します...簡単な修正は、画像の周りに境界線を置くか、画像のインデックスを作成する前にxとyの範囲をチェックすることです.

于 2014-05-02T23:30:58.630 に答える