使用imageSegmenter工具进行Matlab图像分割

时间:2017-04-09 19:33:47

标签: matlab image-processing

我有一个相当简单的问题。我试图使用MATLAB分割图像。我试过了imageSegmenter app,一个带GUI的工具箱。该工具似乎工作得很好,尤其是当我使用“Flood Fill”选项时几乎所有公差参数。

洪水填充是否有功能(非工具)形式?如果是,该功能的名称是什么?文档似乎没有包含此信息。

1 个答案:

答案 0 :(得分:1)

函数grayconnected(I,row,column,tolerance)可以执行,imageSegmeter-Toolbox中的Flood-Fill-Tool执行的操作:使用点[x,y]初始化(图像中的列/行索引)并从那里开始在tolerance参数(Flood Fill GUI中左上角)指定的给定灰度值范围内“泛滥”周围的像素。

实际上你只需要那一行(如果你有灰色值img,初始化点rowcolumn并选择一个容差,例如12) :

%>>> this is where the magic happens <<<%
segmentation = grayconnected(img, row, column, 12);

为方便起见,请参阅下面的可视化代码片段,您可以在其中选择初始化。输入是彩色图像(如果它已经是灰色,请跳过rgb2gray)。对应于每个点i的输出(分割掩码)在segmentations(:,:,i)中。您可以将这些单个分段掩码合并为一个或将它们分配给不同的对象。

请注意,这实际上是一种非常基本的分割方法,如果您没有明确的对比度(如果单个阈值操作可能已经在没有初始化的情况下为您提供了良好的结果),则容易产生噪音和坏处理。您可以使用此初始细分进行细化,例如有活泼的轮廓。

[img] = imread('test.jpg');
img = rgb2gray(img);
tolerance = 12; % default setting in imageSegmenter

%% >>>>>>>>>> GET INITIALIZATION POINTS <<<<<<<<<< %%
str = 'Click to select initialization points. Press ENTER to confirm.';
fig_sel = figure(); imshow(img); 
title(str,'Color','b','FontSize',10);
fprintf(['\nNote: ' str '\n'...
    'Pressing ENTER ends the selection without adding a final point.\n' ...
    'Pressing BACKSPACE/DELETE removes the previously selected point.\n'] );
% select points in figure and close afterwards
[x, y] = getpts(fig_sel);
close(fig_sel);

%% >>>>>>>>>> PROCESS INITIALIZATION POINTS <<<<<<<<<< %%
if length(x) == 0
    fprintf('\nError: No points specified. An initialization point is needed!');
else
    segmentations = zeros([size(img) length(x)]);

    fig_result = figure(); hold on;

    for i = 1:length(x)
        % confusing: y corresponds to row, x to column in img
        column = ceil(x(i)); 
        row = ceil(y(i));

        %>>> this is where the magic happens <<<%
        segmentations(:,:,i) = grayconnected(img,row,column,tolerance);

        % show corresponding initialization point
        subplot(1,2,1); imshow(img); hold on; 
        title('Active point (red)');
        plot(x(i),y(i),'r.','MarkerSize',10); % active in red
        plot(x(1:end ~= i),y(1:end ~= i),'b.','MarkerSize',5); % ... others in blue
        hold off;
        % ... with segmentation result
        title('Segmentation result');
        subplot(1,2,2); imshow(segmentations(:,:,i));

        % click through results
        waitforbuttonpress
    end
    close(fig_result);
end