Пакетная обработка файлов изображений в MATLAB - PullRequest
2 голосов
/ 18 декабря 2009

Я новичок в 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);

После выбора области интереса я создал функцию в редакторе:

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)

Однако результат оказался не таким, как я хотел. Я хотел не окупаемость инвестиций. Кто-нибудь может мне с этим помочь? Большое спасибо.

Picture1:

alt text

Picture1 после выбора ROI:

alt text

1 Ответ

4 голосов
/ 18 декабря 2009

Посмотрите на свой код, вы только один раз выбрали ROI для изображения, которое вы тестировали индивидуально.

Однако, когда вы вызываете функцию BatchProcessFiles , вы не выбираете интересующую область, а функция DetectLines применяется к необработанным изображениям ... Поэтому вам нужно пройти маска, которую вы создали с помощью roipoly для функции BatchProcessFiles , чтобы сделать то же самое для всех изображений.

В качестве примечания вы можете получить лучшие результаты, если попытаетесь Преобразование Хафа обнаружить линии.
Также ваш код не работает, если изображения не в оттенках серого (вы можете добавить вызов rgb2gray () , чтобы быть в безопасности)

Пример решения:

1021 * 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), если вам не нужно применять маску

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...