我是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)
然而,结果并非我想要的结果。这不是我想要的投资回报率。谁能帮我这个?非常感谢你。
答案 0 :(得分:4)
查看您的代码,您只为您单独测试的图像选择了一次ROI。
但是,当您调用 BatchProcessFiles 函数时,您不会选择感兴趣的区域,并且 DetectLines 函数将应用于原始图像...因此您需要将您使用 roipoly 创建的掩码传递到 BatchProcessFiles 函数,以便在所有图像上执行相同操作。
作为旁注,如果您尝试 Hough转换来检测线条,可能会获得更好的结果。
如果图像不是灰度图像,您的代码也会中断(您可以添加对 rgb2gray()的调用以保证安全)
样本解决方案:
I = imread(fileNames{1});
BW = not( roipoly(I) );
SegoutSequence = BatchProcessFiles(fileNames, BW, @DetectLines);
implay(SegoutSequence)
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)