質問編集履歴

1

ご指摘をいただいた、再度、pgmファイルをオープンするときのヘッダの読み飛ばしの実装、分岐条件の変更を行いました。

2020/06/28 07:20

投稿

www.
www.

スコア1

test CHANGED
File without changes
test CHANGED
@@ -150,6 +150,16 @@
150
150
 
151
151
  fp = fopen("test.pgm", "rb");
152
152
 
153
+ fgets(type,10,fp); //画像形式の読み込み
154
+
155
+ fscanf(fp, "%d", &w); //画像の幅
156
+
157
+ fscanf(fp, "%d", &h); //画像の高さ
158
+
159
+ fscanf(fp, "%d", &m); //画像の輝度の階調
160
+
161
+
162
+
153
163
  fprintf(output, "P1\n%d %d\n", w, h);//マジックナンバーはP1、アスキー形式
154
164
 
155
165
 
@@ -158,6 +168,16 @@
158
168
 
159
169
 
160
170
 
171
+ for (i = 0; i <h; i++){//imageの初期化
172
+
173
+ for (j = 0; j <w; j++){
174
+
175
+ image[w][h]=0;
176
+
177
+ }
178
+
179
+ }
180
+
161
181
 
162
182
 
163
183
  for (i = 0; i <h; i++){
@@ -200,9 +220,15 @@
200
220
 
201
221
  int image_4[w][h];//4連結用配列
202
222
 
223
+ int image_8[w][h];//8連結用配列
224
+
203
225
  int count_4[(w*h)/2][2];//4連結用ラベリング配列
204
226
 
227
+ int count_8[(w*h)/2][2];//8連結用ラベリング配列
228
+
205
- int l4=1;//4連結の連結成分カウント変数
229
+ int l4=1,l8=1;//4連結、8連結用の連結成分カウント変数
230
+
231
+ int min=0;//検査時の最小値を保存
206
232
 
207
233
 
208
234
 
@@ -210,9 +236,27 @@
210
236
 
211
237
  count_4[i][0]=i;
212
238
 
213
- count_4[i][1]=i;
239
+ count_4[i][1]=0;
240
+
214
-
241
+ count_8[i][0]=i;
242
+
243
+ count_8[i][1]=i;
244
+
215
- }
245
+ }
246
+
247
+
248
+
249
+ for (i = 0; i <h; i++){//image_4の初期化
250
+
251
+ for (j = 0; j <w; j++){
252
+
253
+ image_4[w][h]=0;
254
+
255
+ }
256
+
257
+ }
258
+
259
+
216
260
 
217
261
 
218
262
 
@@ -276,7 +320,7 @@
276
320
 
277
321
 
278
322
 
279
- }else if((image_4[j-1][i]!=0)&&(image_4[j-1][i]<image_4[j][i-1])){
323
+ }else if((image_4[j-1][i]!=0)&&((image_4[j][i-1]==0)||(image_4[j-1][i]<image_4[j][i-1]))){
280
324
 
281
325
  //左のラベル番号が0ではなくかつ、左のラベル番号の方が小さい
282
326
 
@@ -288,7 +332,7 @@
288
332
 
289
333
  }else{//上のラベル番号が0ではなくかつ、上のラベル番号の方が小さい
290
334
 
291
- if(image_4[j][i-1]!=0){
335
+ if((image_4[j][i-1]!=0)&&((image_4[j-1][i]==0)||(image_4[j][i-1]<image_4[j-1][i]))){
292
336
 
293
337
  image_4[j][i]=image_4[j][i-1];
294
338
 
@@ -318,9 +362,9 @@
318
362
 
319
363
 
320
364
 
321
- for (i = 0; i <w; i++){
365
+ for (i = 0; i <h; i++){
322
-
366
+
323
- for (j = 0; j <h; j++){
367
+ for (j = 0; j <w; j++){
324
368
 
325
369
  printf("%d ", image_4[j][i]);
326
370
 
@@ -330,6 +374,18 @@
330
374
 
331
375
  }
332
376
 
377
+ for(i=1;i<(w*h)/2;i++){
378
+
379
+ if(count_4[i][1]!=0)
380
+
381
+ printf("%d %d\n",count_4[i][0],count_4[i][1] );
382
+
383
+
384
+
385
+ }
386
+
387
+
388
+
333
389
 
334
390
 
335
391
  //printf("4連結の連結成分の個数=%d\n",max4);
@@ -340,6 +396,8 @@
340
396
 
341
397
  }
342
398
 
399
+
400
+
343
401
  ```
344
402
 
345
403