2

私は MATLAB と画像処理の初心者です。

バッチ処理を使用しようとしているときに問題が発生しました。誰かが私を啓発できることを願っています。ありがとう。

MATLAB の例に従って、次のことを行いました。

p = which('Picture1.tif');
filelist = dir([fileparts(p) filesep 'Picture*.tif']);
fileNames = {filelist.name}'

I = imread(fileNames{1});
imshow(I)

関心領域を選択したかったので、

BW = roipoly(I);
BW1 = not(BW);
N = roifill(I,BW1);

ROI を選択した後、エディターで関数を作成しました。

function Segout = DetectLines(N)
    [junk threshold] = edge(N, 'sobel');
    fudgeFactor = .5;
    BWs = edge(N, 'sobel', threshold*fudgeFactor);
    se90 = strel('line', 3, 90);
    se0 = strel('line', 3, 0);
    BWsdil = imdilate(BWs, [se90 se0]);
    BWdfill = imfill(BWsdil, 'holes');
    BWnobord = imclearborder(BWdfill, 4);
    seD = strel('diamond', 1);
    BWfinal = imerode(BWnobord, seD);
    BWfinal = imerode(BWfinal, seD);
    BWoutline = bwperim(BWfinal);
    Segout = N;
    Segout(BWoutline) = 255;
end

コマンド ウィンドウに戻り、次のように入力しました。

Segout = DetectLines(N);
figure, imshow(Segout)

出てきた数字は私が期待したものでした。

画像をループしようとすると、問題が発生します。正しくやったかどうかはわかりません。

例に従って、エディターで別の関数を作成しました。

function SegoutSequence = BatchProcessFiles(fileNames, fcn)
    N = imread(fileNames{1});
    [mrows, ncols] = size(N);
    nImages = length(fileNames);
    SegoutSequence = zeros(mrows, ncols, nImages, class(N));
    parfor (k = 1:nImages)
        N = imread(fileNames{k});
        SegoutSequence(:,:,k) = fcn(N);
    end
end

コマンド ウィンドウで、次のように入力しました。

SegoutSequence = BatchProcessFiles(fileNames, @DetectLines);
implay(SegoutSequence)

しかし、結果は私が望んでいたものではありませんでした。私が望んでいたのは ROI ではありませんでした。誰でもこれで私を助けることができますか?どうもありがとうございました。

写真1:

代替テキスト

ROI を選択した後の画像 1:

代替テキスト

4

1 に答える 1

4

コードを見ると、個別にテストした画像に対して ROI を 1 回だけ選択しました。

ただし、BatchProcessFiles関数を呼び出すときは、関心領域を選択せず​​、DetectLines関数が生の画像に適用されます。したがって、roipolyで作成したマスクをBatchProcessFiles関数に渡して同じことを行う必要があります。すべての画像。

補足として、ハフ変換を試して線を検出すると、より良い結果が得られる場合があります。
また、画像がグレースケールでない場合、コードが壊れます(安全のためにrgb2gray()への呼び出しを追加できます)。

サンプル ソリューション:

MATLAB

I = imread(fileNames{1});
BW = not( roipoly(I) );

SegoutSequence = BatchProcessFiles(fileNames, BW, @DetectLines);
implay(SegoutSequence)

BatchProcessFiles.m

function SegoutSequence = BatchProcessFiles(fileNames, Mask, fcn)
    % ...
    parfor (k = 1:nImages)
        N = imread(fileNames{k});
        if ndims(N)==3, N=rgb2gray(N); end
        if ~isempty(Mask), N = roifill(N, Mask); end
        SegoutSequence(:,:,k) = fcn(N);
    end
end

またはそれを次のように呼び出します:BatchProcessFiles(fileNames, [], @DetectLines)マスクを適用する必要がない場合

于 2009-12-18T18:55:18.753 に答える