C#画像微細化:Hilditch微細化アルゴリズム
4794 ワード
http://blog.csdn.net/aofengdaxia/article/details/7439992
上の理論:
Hilditch細分化アルゴリズムの手順は、次のとおりです.
画像を左から右へ各ピクセルを上下に反復するのは、反復サイクルです.各反復期間において、各画素pについて、6つの条件を同時に満たす場合にマークされる.現在の反復期間が終了すると、すべてのタグの画素の値をバックグラウンド値に設定します.ある反復期間にマーカーポイント(すなわち6条件を満たす画素)が存在しない場合、アルゴリズムは終了する.バックグラウンド値が0、前景値が1の場合:
6つの条件は次のとおりです.
(I):pは1であり、すなわちpは背景ではない.
(2):x 1,x 3,x 5,x 7はすべて1ではありません(そうでなければpマークを削除し、画像が空になります).
(3):x 1~x 8のうち、少なくとも2つが1(1つだけが1であれば線分の端点である.1でなければ孤立点である).
(4):pの8連通結数は1である.
連結数とは、画素pの3*3近傍において、pに接続された図形成分の個数を指す.
(5)x 3が削除されたと仮定すると、x 3が0の場合、pの8連通連結数は1である.
(6)x 5が削除されたと仮定すると,x 5が0の場合,pの8連通結合数は1である.
以上の理論はネットブログを選択します.http://www.cnblogs.com/xiaotie/archive/2010/08/12/1797760.html (このブログにはC#バージョンのHilditch細分化アルゴリズムがありますが、unsafeのコードを使うのはよくわかりません.
前回自分で書いたコード
上の理論:
Hilditch細分化アルゴリズムの手順は、次のとおりです.
画像を左から右へ各ピクセルを上下に反復するのは、反復サイクルです.各反復期間において、各画素pについて、6つの条件を同時に満たす場合にマークされる.現在の反復期間が終了すると、すべてのタグの画素の値をバックグラウンド値に設定します.ある反復期間にマーカーポイント(すなわち6条件を満たす画素)が存在しない場合、アルゴリズムは終了する.バックグラウンド値が0、前景値が1の場合:
6つの条件は次のとおりです.
(I):pは1であり、すなわちpは背景ではない.
(2):x 1,x 3,x 5,x 7はすべて1ではありません(そうでなければpマークを削除し、画像が空になります).
(3):x 1~x 8のうち、少なくとも2つが1(1つだけが1であれば線分の端点である.1でなければ孤立点である).
(4):pの8連通結数は1である.
連結数とは、画素pの3*3近傍において、pに接続された図形成分の個数を指す.
(5)x 3が削除されたと仮定すると、x 3が0の場合、pの8連通連結数は1である.
(6)x 5が削除されたと仮定すると,x 5が0の場合,pの8連通結合数は1である.
以上の理論はネットブログを選択します.http://www.cnblogs.com/xiaotie/archive/2010/08/12/1797760.html (このブログにはC#バージョンのHilditch細分化アルゴリズムがありますが、unsafeのコードを使うのはよくわかりません.
前回自分で書いたコード
/// <summary>
/// Hilditch
/// </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];
//
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++)
{
// 1
if (input[i, j] != 1)
{
continue;
}
// 3*3
for (int m = 0; m < 3; m++)
{
for (int n = 0; n < 3; n++)
{
nb[m, n] = input[i - 1 + m, j - 1 + n];
}
}
//
nnb[0] = nb[2, 1]==1?0:1;
nnb[1] = nb[2, 0]==1?0:1;
nnb[2] = nb[1, 0]==1?0:1;
nnb[3] = nb[0, 0]==1?0:1;
nnb[4] = nb[0, 1]==1?0:1;
nnb[5] = nb[0, 2]==1?0:1;
nnb[6] = nb[1, 2]==1?0:1;
nnb[7] = nb[2, 2]==1?0:1;
// 2:p0,p2,p4,p6
if (nnb[0] == 0 && nnb[2] == 0 && nnb[4] == 0 && nnb[6] == 0)
{
continue;
}
// 3: p0~p7
int iCount = 0;
for (int ii = 0; ii < 8; ii++)
{
iCount += nnb[ii];
}
if (iCount > 6) continue;
// 4: 1
if (DetectConnectivity(nnb) != 1)
{
continue;
}
// 5: p2 , p2 , p
if (input[i, j - 1] == -1)
{
nnb[2] = 1;
if (DetectConnectivity(nnb) != 1)
continue;
nnb[2] = 0;
}
// 6: p4 , p4 , 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;
}