LabelCount =0 ; //Initialize Label counter. |
EquivalenceTable = [] ; //Initialize equivalence table of labels |
For u =1:U ; //Raster scan the window (iteratively scan one row at a time) |
For v =1:V ; //iteratively scan pixels in each column of the selected row) |
If Ip(u,v)! =0 ; //If the pixel is NOT background (i.e., 0) |
Neighbors = [Label(u,v-1), Label(u-1,v)]; //Get neighbor labels (one pixel above, and one on left/prior) |
; //Note: neighbors for 8-connected mask include pixels to the |
; //top-right, top, top-left and left of the pixel(u,v) |
If Neighbors = [ ] ; //If no neighbor pixel is labeled |
Label(u,v) = LabelCount+1 ; //uniquely label the pixel |
LabelCount = LabelCount+1 ; //increment label counter |
End If |
Else Label(u,v) = min (Neighbors) ; label the current pixel as the neighbor with the smallest label |
If [length(Neighbors) = = 2] && [Neighbors(1) != Neighbors(2)] |
EquivalenceTable = [EquivalenceTable, ((min(Neighbors), max(Neighbors))] |
; //Record equivalencies of neighbor labels (Mx2 matrix) |
End If |
End If |
Neighbors = [ ] ; //Reset neighbor pointer. |
End For |
End For |
; Second Pass: Relabeling equivalencies |
Sort (EquivalenceTable, 1) ; //Sort the Equivalence Table based on first column |
EqualityCount = rows(EquivalenceTable) ; //Total equivalencies = number of rows in Table |
Do |
L1 = EquivalenceTable (EqualityCount,1) ; //Smaller label in selected Equivalence Table entry |
L2 = EquivalenceTable (EqualityCount,2) ; //Larger label in selected Equivalence Table entry |
Labels(find(Labels = = L2)) = L1 ; //Relabel all instances of larger label with smaller label |
EqualityCount = EqualityCount – 1 ; //Decrement to target next equivalency |
While EqualityCount > =1 |