-
Notifications
You must be signed in to change notification settings - Fork 0
/
regiongrow.m
48 lines (43 loc) · 1.85 KB
/
regiongrow.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function [g, NR, SI, TI] = regiongrow(f, S, T)
%REGIONGROW Perform segmentation by region growing.
% [G, NR, SI, TI] = REGIONGROW(F, S, T). S can be an array (the
% same size as F) with a 1 at the coordinates of every seed point
% and 0s elsewhere. S can also be a single seed value. Similarly,
% T can be an array (the same size as F) containing a threshold
% value for each pixel in F. T can also be a scalar, in which case
% it becomes a global threshold. All values in S and T must be in
% the range [0, 1]
%
% G is the result of region growing, with each region labeled by a
% different integer, NR is the number of regions, SI is the final
% seed image used by the algorithm, and TI is the image consisting
% of the pixels in F that satisfied the threshold test, but before
% they were processed for connectivity.
% Copyright 2002-2009 R. C. Gonzalez, R. E. Woods, and S. L. Eddins
% From the book Digital Image Processing Using MATLAB, 2nd ed.,
% Gatesmark Publishing, 2009.
%
% Book web site: http://www.imageprocessingplace.com
% Publisher web site: http://www.gatesmark.com/DIPUM2e.htm
f = tofloat(f);
% If S is a scalar, obtain the seed image.
if numel(S) == 1
SI = f == S;
S1 = S;
else
% S is an array. Eliminate duplicate, connected seed locations
% to reduce the number of loop executions in the following
% sections of code.
SI = bwmorph(S, 'shrink', Inf);
S1 = f(SI); % Array of seed values.
end
TI = false(size(f));
for K = 1:length(S1)
seedvalue = S1(K);
S = abs(f - seedvalue) <= T; % Re-use variable S.
TI = TI | S;
end
% Use function imreconstruct with SI as the marker image to
% obtain the regions corresponding to each seed in S. Function
% bwlabel assigns a different integer to each connected region.
[g, NR] = bwlabel(imreconstruct(SI, TI));