teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2020/06/28 07:20

投稿

www.
www.

スコア1

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]=i;
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 <w; i++){
183
+ for (i = 0; i <h; i++){
162
- for (j = 0; j <h; 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
  ### 試したこと