質問編集履歴
1
ご指摘をいただいた、再度、pgmファイルをオープンするときのヘッダの読み飛ばしの実装、分岐条件の変更を行いました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -74,10 +74,20 @@
|
|
74
74
|
//4連結、8連結のラベリング処理を行う
|
75
75
|
output = fopen("test.pbm", "w");//白黒画像であるPBMファイルに出力
|
76
76
|
fp = fopen("test.pgm", "rb");
|
77
|
+
fgets(type,10,fp); //画像形式の読み込み
|
78
|
+
fscanf(fp, "%d", &w); //画像の幅
|
79
|
+
fscanf(fp, "%d", &h); //画像の高さ
|
80
|
+
fscanf(fp, "%d", &m); //画像の輝度の階調
|
81
|
+
|
77
82
|
fprintf(output, "P1\n%d %d\n", w, h);//マジックナンバーはP1、アスキー形式
|
78
83
|
|
79
84
|
int image[w][h];//2値化画像を2次元配列として格納
|
80
85
|
|
86
|
+
for (i = 0; i <h; i++){//imageの初期化
|
87
|
+
for (j = 0; j <w; j++){
|
88
|
+
image[w][h]=0;
|
89
|
+
}
|
90
|
+
}
|
81
91
|
|
82
92
|
for (i = 0; i <h; i++){
|
83
93
|
for (j = 0; j <w; j++){
|
@@ -99,14 +109,26 @@
|
|
99
109
|
fclose(output);
|
100
110
|
|
101
111
|
int image_4[w][h];//4連結用配列
|
112
|
+
int image_8[w][h];//8連結用配列
|
102
113
|
int count_4[(w*h)/2][2];//4連結用ラベリング配列
|
114
|
+
int count_8[(w*h)/2][2];//8連結用ラベリング配列
|
103
|
-
int l4=1;//4連結の連結成分カウント変数
|
115
|
+
int l4=1,l8=1;//4連結、8連結用の連結成分カウント変数
|
116
|
+
int min=0;//検査時の最小値を保存
|
104
117
|
|
105
118
|
for (i=1;i<(w*h)/2;i++){
|
106
119
|
count_4[i][0]=i;
|
107
|
-
count_4[i][1]=
|
120
|
+
count_4[i][1]=0;
|
121
|
+
count_8[i][0]=i;
|
122
|
+
count_8[i][1]=i;
|
108
123
|
}
|
109
124
|
|
125
|
+
for (i = 0; i <h; i++){//image_4の初期化
|
126
|
+
for (j = 0; j <w; j++){
|
127
|
+
image_4[w][h]=0;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
|
110
132
|
for (i = 0; i <h; i++){//4連結用
|
111
133
|
for (j = 0; j <w; j++){
|
112
134
|
if(image[j][i]==1){//対象画素が1,以下は4連結用
|
@@ -137,13 +159,13 @@
|
|
137
159
|
if(image_4[j-1][i]==image_4[j][i-1]){//左と上のマスが同じラベル番号
|
138
160
|
image_4[j][i]=image_4[j-1][i];
|
139
161
|
|
140
|
-
}else if((image_4[j-1][i]!=0)&&(image_4[j-1][i]<image_4[j][i-1])){
|
162
|
+
}else if((image_4[j-1][i]!=0)&&((image_4[j][i-1]==0)||(image_4[j-1][i]<image_4[j][i-1]))){
|
141
163
|
//左のラベル番号が0ではなくかつ、左のラベル番号の方が小さい
|
142
164
|
image_4[j][i]=image_4[j-1][i];
|
143
165
|
count_4[image_4[j][i-1]][1]=image_4[j-1][i];
|
144
166
|
|
145
167
|
}else{//上のラベル番号が0ではなくかつ、上のラベル番号の方が小さい
|
146
|
-
if(image_4[j][i-1]!=0){
|
168
|
+
if((image_4[j][i-1]!=0)&&((image_4[j-1][i]==0)||(image_4[j][i-1]<image_4[j-1][i]))){
|
147
169
|
image_4[j][i]=image_4[j][i-1];
|
148
170
|
count_4[image_4[j-1][i]][1]=image_4[j][i-1];
|
149
171
|
}
|
@@ -158,17 +180,24 @@
|
|
158
180
|
}
|
159
181
|
}
|
160
182
|
|
161
|
-
for (i = 0; i <
|
183
|
+
for (i = 0; i <h; i++){
|
162
|
-
for (j = 0; j <
|
184
|
+
for (j = 0; j <w; j++){
|
163
185
|
printf("%d ", image_4[j][i]);
|
164
186
|
}
|
165
187
|
printf("\n");
|
166
188
|
}
|
189
|
+
for(i=1;i<(w*h)/2;i++){
|
190
|
+
if(count_4[i][1]!=0)
|
191
|
+
printf("%d %d\n",count_4[i][0],count_4[i][1] );
|
167
192
|
|
193
|
+
}
|
194
|
+
|
195
|
+
|
168
196
|
//printf("4連結の連結成分の個数=%d\n",max4);
|
169
197
|
return 0;
|
170
198
|
|
171
199
|
}
|
200
|
+
|
172
201
|
```
|
173
202
|
|
174
203
|
### 試したこと
|