Theory:
To refine the algorithm, perform the following steps:
Iteration of each pixel from left to right from top to down is an iteration cycle. In each iteration cycle, if each pixel P meets six conditions at the same time, it is marked. At the end of the current iteration cycle, the values of all marked pixels are set as background values. If a tag does not exist in an iteration cycle (that is, pixels that meet six conditions), the algorithm ends. If the background value is 0 and the foreground value is 1, then:
The six conditions are as follows:
(I): p is 1, that is, P is not the background;
(2): The numbers X1, X3, X5, and X7 are not all 1 (otherwise, the p Mark is deleted and the image is hollow );
(3): X1 ~ In X8, at least two of them are 1 (if only one is 1, it is the endpoint of the line segment. If no value is 1, it is an isolated point );
(4): the 8-connected concatenation of P is 1;
Concatenation refers to the number of graphical components connected to P in the 3*3 neighborhood of P:
(5) Assuming X3 has been marked and deleted, when X3 is 0, the 8 CCN Number of P is 1;
(6) If X5 has been marked to be deleted, when X5 is 0, the 8 Unicom connection count of P is 1.
The above theoretical choice network blog: http://www.cnblogs.com/xiaotie/archive/2010/08/12/1797760.html (this blog has C # version of hilditch refinement algorithm, but the use of unsafe code is not very easy to understand.
The code I wrote last time
/// <Summary> /// Hilditch refined algorithm /// </summary> /// <param name = "input"> </param> // <returns> </returns> private int [,] thinnerHilditch (int [,] input) {int lWidth = input. getLength (0); int lHeight = input. getLength (1); bool IsModified = true; int Counter = 1; int [] nnb = new int [9]; // remove the border pixel for (int I = 0; I <lWidth; I ++) {input [I, 0] = 0; input [I, lHeight-1] = 0 ;}for (int j = 0; j <lHeight; J ++) {input [0, j] = 0; input [lWidth-1, j] = 0;} do {Counter ++; IsModified = false; int [,] nb = new int [3, 3]; for (int I = 1; I <lWidth; I ++) {for (int j = 1; j <lHeight; j ++) {// condition 1 must be a black spot if (input [I, j]! = 1) {continue;} // take 3*3 fields for (int m = 0; m <3; m ++) {for (int n = 0; n <3; n ++) {nb [m, n] = input [I-1 + m, j-1 + n] ;}} // copy nnb [0] = nb [2, 1] = 1?; Nnb [1] = nb [2, 0] = 1?; Nnb [2] = nb [1, 0] = 1?; Nnb [3] = nb [0, 0] = 1?; Nnb [4] = nb [0, 1] = 1?; Nnb [5] = nb [0, 2] = 1?; Nnb [6] = nb [1, 2] = 1?; Nnb [7] = nb [2, 2] = 1? 0: 1; // condition 2: p0, p2, p4, p6 is not all foreground vertex if (nnb [0] = 0 & nnb [2] = 0 & nnb [4] = 0 & nnb [6] = = 0) {continue;} // Condition 3: p0 ~ P7 has at least two foreground vertices: int iCount = 0; for (int ii = 0; ii <8; ii ++) {iCount + = nnb [ii];} if (iCount> 6) continue; // Condition 4: the number of links equals 1 if (DetectConnectivity (nnb )! = 1) {continue;} // condition 5: if p2 is marked to be deleted, p2 is set as the background without changing the concatenation Number of p. if (input [I, j-1] =-1) {nnb [2] = 1; if (DetectConnectivity (nnb )! = 1) continue; nnb [2] = 0;} // Condition 6: If p4 is marked as deleted, the p4 is set as the background, do not change the concatenation Number of p if (input [I, j + 1] =-1) {nnb [6] = 1; if (DetectConnectivity (nnb )! = 1) continue; nnb [6] = 0;} input [I, j] =-1; IsModified = true ;}} for (int I = 0; I <lWidth; I ++) {for (int j = 0; j <lHeight; j ++) {if (input [I, j] =-1) {input [I, j] = 0 ;}}}while (IsModified); return input ;}
I hope it will be useful to you.