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)

然而,结果并不是我想要的。这不是我想要的投资回报率。谁能帮我这个?非常感谢。

图片1:

替代文字

选择ROI后的图1:

替代文字

4

1 回答 1

4

查看您的代码,您只为单独测试的图像选择了一次 ROI。

但是,当您调用BatchProcessFiles函数时,您不会选择感兴趣的区域,而是将DetectLines函数应用于原始图像......因此,您需要将使用roipoly创建的掩码传递给BatchProcessFiles函数以在所有的图像。

附带说明一下,如果您尝试Hough 变换来检测线条,您可能会得到更好的结果。
如果图像不是灰度图像,您的代码也会中断(您可以添加对rgb2gray()的调用以确保安全)

示例解决方案:

MATLAB

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

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

批处理文件.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 回答