画像のピクセルデータを置き換えるタイミングがおかしいのでしょうか?ご教授お願いします.
方法は田村の細線化を利用しています.
参考URL:画像処理ソリューション http://imagingsolution.blog107.fc2.com/ ... y-138.html
画像データを読み込み,ピクセル(i,j)データが白(255)ならdata[j]に1を,黒(0)なら0を代入しています.
細線化処理のコードを以下に示します.
/*----細線化----*/
void thinning(int xmin, int xmax, int ymin, int ymax)
{
int i, j;
int d_flg1,d_flg2;
int cnt;
for (i = ymin; i < ymax; i++)
{
for (j = xmin; j < xmax; j++)
{
d_flg1 = 0;
d_flg2 = 0;
cnt = 0;
while (true)
{
d_flg1 = 0;
d_flg2 = 0;
//パターン1
//--除去パターン--//
if (data[i][j] == 1 && data[i - 1][j] == 0)
{
d_flg1++;
}
else if (data[i][j] == 1 && data[i][j + 1] == 0)
{
d_flg1++;
}
//--除去パターン--//
else
{//除去パターンにあてはまらない
break;
}
if (d_flg1 != 0)
{
//--除去しないパターン--//
if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i][j - 1] == 1 && data[i][j + 1] == 0)
{
d_flg1 = 0;
break;
}
//--共通パターン--//
else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 0
&& data[i + 1][j] == 1)
{//1
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j - 1] == 1
&& data[i + 1][j] == 0)
{//2
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 1 && data[i][j - 1] == 0
&& data[i][j + 1] == 0)
{//3
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
&& data[i + 1][j] == 0)
{//4
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i + 1][j - 1] == 1
&& data[i + 1][j] == 0)
{//5
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 1 && data[i - 1][j] == 0
&& data[i][j - 1] == 0)
{//6
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i - 1][j + 1] == 1
&& data[i][j + 1] == 0)
{//7
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i][j + 1] == 0 && data[i + 1][j] == 0
&& data[i + 1][j + 1] == 1)
{//8
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i][j + 1] == 1
&& data[i + 1][j - 1] == 0 && data[i + 1][j + 1] == 0)
{//9
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//10
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j + 1] == 0
&& data[i][j - 1] == 1 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//11
d_flg1 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//12
d_flg1 = 0;
break;
}
//--共通パターン--//
if (d_flg1 != 0)
{
data[i][j] = 0;
}
}
//共通パターン
d_flg2 = 0;
if (d_flg1 != 0)
{
//--パターン2
//--除去パターン--//
if (data[i][j] == 1 && data[i + 1][j] == 0)
{
d_flg2++;
}
else if (data[i][j] == 1 && data[i][j - 1] == 0)
{
d_flg2++;
}
//--除去パターン--//
if (d_flg2 != 0)
{//除去したら
//除去しないパターン
if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i][j - 1] == 1 && data[i + 1][j] == 0)
{
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 1
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{
d_flg2 = 0;
break;
}
//共通パターン
else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 0
&& data[i + 1][j] == 1)
{//1
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j - 1] == 1
&& data[i + 1][j] == 0)
{//2
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 1 && data[i][j - 1] == 0
&& data[i][j + 1] == 0)
{//3
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
&& data[i + 1][j] == 0)
{//4
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i + 1][j - 1] == 1
&& data[i + 1][j] == 0)
{//5
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 1 && data[i - 1][j] == 0
&& data[i][j - 1] == 0)
{//6
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i - 1][j + 1] == 1
&& data[i][j + 1] == 0)
{//7
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i][j + 1] == 0 && data[i + 1][j] == 0
&& data[i + 1][j + 1] == 1)
{//8
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i][j + 1] == 1
&& data[i + 1][j - 1] == 0 && data[i + 1][j + 1] == 0)
{//9
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//10
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j + 1] == 0
&& data[i][j - 1] == 1 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//11
d_flg2 = 0;
break;
}
else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
&& data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i + 1][j - 1] == 0
&& data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
{//12
d_flg2 = 0;
break;
}
if (d_flg2 != 0)
{
data[i][j] = 0;
}
}
}
}
}
}
}
/*----細線化----*/