~ラベリング~
ラベルをとりあえず貼る
srtはルックアップテーブル
label[][]は対応する地点のラベル番号
(*s).heightは画像の縦幅
(*s).widthは画像の横幅
(*s).pixel[][]は取り込んだ画像の輝度
aは次のラベル番号
/*ラベルの初期化*/
for (i = 0; i < (*s).height; i++) {
for (j = 0; j < (*s).width; j++) {
label[i][j] = 0;
}
}
for (i = 0; i < (*s).height; i++) {
for (j = 0; j < (*s).width; j++) {
if ((*s).pixel[i][j] == 1) { //白のところの時
if (i == 0) { //上端の時
if (j == 0) { //左端の時
label[i][j] = srt[a];
a++;
}
else {//その他上端
if (label[i][j-1] != 0) { //左のピクセルが0でない時
label[i][j] = label[i][j-1];
}
else { //左のピクセルが0の時
label[i][j] = srt[a];
a++;
}
}
}//ここまでおk
else if (j == 0) { //左端で上端でない時
label[i][j] = srt[a]; //一度次のラベルを入れる
for (l = j; l <= j+1; l++) { //上と左上をみる
if (label[i-1][l] != 0) { //みているピクセル0でない時
if (label[i-1][l] < label[i][j]) { //現在のピクセルがみているピクセルより小さい値のとき
label[i][j] = label[i-1][l];
}
}
if (label[i][j] == srt[a]) { //もし最初に入れたラベルのままの時
a++; //ルックアップテーブルをひとつ進める
}
}
} //ここまでおk
else if (j == (*s).width-1) { //右端の時
label[i][j] = srt[a]; //一度次のラベルを入れる
for (k = i-1; k <= i+1; k++) { //現在地の周りを見る
for (l = j-1; l <= j; l++) {
if (label[k][l] != 0) { //みている地点にラベルが張ってある場合
if (label[k][l] < label[i][j]) { //みている地点のラベルが現在地のラベルより小さい時
label[i][j] = label[k][l]; //ラベルの張替え
}
}
if (k == i && l == j) {
if (label[i][j] == srt[a]) {
a++;
}
goto OUT; //ループを抜ける
}
}
}
}
else { //その他中央の時
label[i][j] = srt[a]; //一度次のラベルを入れる
for (k = i-1; k <= i+1; k++) { //現在地の周りを見る
for (l = j-1; l <= j+1; l++) {
if (label[k][l] != 0) { //みている地点が0でない時
if (label[k][l] < label[i][j]) { //みている地点のラベルが現在地のラベルより小さいとき
label[i][j] = label[k][l];
}
}
if (k == i && l == j) { //みている地点が現在地になった時
if (label[i][j] == srt[a]) { //現在地のラベルが次のラベルのままの時
a++;
}
goto OUT; //ループを抜ける
}
}
}
}
OUT:; //この位置にループを抜ける
}
}
}
小さい値がある場合ルックアップテーブルの対応する番号の配列の番号を更新
ルックアップテーブル
srt 入っている数字
0 0
1 1
2 1
3 1
4 4
5 4
6 6
・ ・
・ ・
・ ・
ってな感じ
番号がとんているのを無くす
こんな感じ
0 0
1 1
2 1
3 1
4 2
5 2
6 3
・ ・
・ ・
・ ・
これのプログラム
注:(*s).heightは画像の縦幅
(*s).widthは画像の横幅
srtはルックアップテーブルの配列
/*ルックアップテーブルを調整*/
for (i = 1; i < (*s).height*(*s).width; i++) {
if (srt[i] != i) { //ルックアップテーブルの番号と入っている数字が違う場合
srt[i] = srt[i-1]; //ひとつ前のルックアップテーブルに入っている整数を代入
}
else if (srt[i] == i) { //ルックアップテーブルの番号と同じ整数が格納されている場合
srt[i] = srt[i-1]+1; //ひとつ前のルックアップテーブルに格納されている整数+1を代入
}
}
基本はこれでいいのだが、ルックアップテーブルが
srt
0 0
1 1
2 2
3 2
4 4
5 4
6 2
というルックアップテーブルの場合この処理をすると
srt
0 0
1 1
2 2
3 2
4 3
5 3
6 3
となってうまくいかないので式を書き換える
/*ルックアップテーブルを調整*/
num = 0;
for (i = 0; i < (*s).height*(*s).width; i++) {
if (srt[i] != i) { //srtの番号と入っている数字が違う場合
srt[i] = srt[srt[i]]; //srtに入っている整数の番号のsrtに格納されている整数を代入
}
else if (srt[i] == i) { //srtの番号と同じ整数が格納されている場合
srt[i] = num; //srtに次の整数を代入
num++;
}
}
これでルックアップテーブルの変更はうまくいくのでラベルを張り替える
for (i = 0; i < (*s).height; i++) {
for (j = 0; j < (*s).width; j++) {
label[i][j] = srt[label[i][j]];
}
}
これでラベリングは完成