質問編集履歴

1

一連の流れを記載

2020/05/07 01:51

投稿

YProg
YProg

スコア67

test CHANGED
File without changes
test CHANGED
@@ -138,11 +138,7 @@
138
138
 
139
139
 
140
140
 
141
-
142
-
143
- #全体コード
141
+ #一連流れ
144
-
145
- ###インクルード
146
142
 
147
143
  ```C
148
144
 
@@ -156,449 +152,405 @@
156
152
 
157
153
  #include <iostream>
158
154
 
155
+
156
+
157
+ //画像サイズを決める
158
+
159
+ #define X_SIZE 640
160
+
161
+ #define Y_SIZE 480
162
+
163
+
164
+
165
+ //閾値の最小値
166
+
167
+ #define LOW 0
168
+
169
+ //閾値の最大値
170
+
171
+ #define HIGH 255
172
+
173
+
174
+
175
+ //rgb値の配列を宣言する
176
+
177
+ unsigned char r[Y_SIZE][X_SIZE], g[Y_SIZE][X_SIZE], b[Y_SIZE][X_SIZE];
178
+
179
+
180
+
181
+ //抽出した後のrgb値の配列を宣言する
182
+
183
+ unsigned char r_out[Y_SIZE][X_SIZE], g_out[Y_SIZE][X_SIZE], b_out[Y_SIZE][X_SIZE];
184
+
185
+
186
+
187
+ //カラー画像の配列を宣言する
188
+
189
+ unsigned char get_color[Y_SIZE][X_SIZE];
190
+
191
+
192
+
193
+ //モノクロ画像の配列を宣言する
194
+
195
+ unsigned char get_img[Y_SIZE][X_SIZE];
196
+
197
+
198
+
199
+
200
+
201
+ void main(void)
202
+
203
+ {
204
+
205
+ //画像を読み込む
206
+
207
+ printf("読み込む画像ファイル=");
208
+
209
+ scanf("%s", filepath);
210
+
211
+
212
+
213
+ //rgb画像を読み込むための関数を呼び出す
214
+
215
+ Read_rgbimage(filepath, r, g, b);
216
+
217
+
218
+
219
+ //色を抽出するための関数
220
+
221
+ Color(r, g, b, r_out, g_out, b_out, 167, 230, 167, 230, 167, 230);
222
+
223
+
224
+
225
+ //グレイ画像に変換するための関数を呼び出す
226
+
227
+ Gray(get_img, r_out, g_out, b_out);
228
+
229
+
230
+
231
+ //画像を保存する
232
+
233
+ printf("保存する画像ファイル=");
234
+
235
+ scanf("%s", save_filepath);
236
+
237
+
238
+
239
+ //画像を保存するための関数を呼び出す
240
+
241
+ Save_img(save_filepath, get_img);
242
+
243
+
244
+
245
+ break;
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+ //RGBカラー画像を読み込むための関数
254
+
255
+ void Read_rgbimage(char *Read_filepath, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
256
+
257
+ {
258
+
259
+ //変数を定義
260
+
261
+ int i, j;
262
+
263
+
264
+
265
+
266
+
267
+ //画像を読み込むための準備
268
+
269
+ FILE *r_filepath;
270
+
271
+
272
+
273
+ r_filepath = fopen(Read_filepath, "rb");
274
+
275
+
276
+
277
+ //もし,r_filepathが無かったら,「存在しません」と表示する
278
+
279
+ if (r_filepath == NULL)
280
+
281
+ {
282
+
283
+ printf("%sは存在しません!", Read_filepath);
284
+
285
+ exit(-1);
286
+
287
+ }
288
+
289
+
290
+
291
+
292
+
293
+ //rgb値を読み込む
294
+
295
+ for (j = 0; j < Y_SIZE; j++)
296
+
297
+ {
298
+
299
+ for (i = 0; i < X_SIZE; i++)
300
+
301
+ {
302
+
303
+ //画像のRGB値を取得
304
+
305
+ r[j][i] = fgetc(r_filepath);
306
+
307
+ g[j][i] = fgetc(r_filepath);
308
+
309
+ b[j][i] = fgetc(r_filepath);
310
+
311
+ }
312
+
313
+ }
314
+
315
+
316
+
317
+ //画像ファイルを閉じる
318
+
319
+ fclose(r_filepath);
320
+
321
+
322
+
323
+ }
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+ //RGB画像から特定の色のみを抽出するための関数
332
+
333
+ int Color(unsigned char r_in[Y_SIZE][X_SIZE], unsigned char g_in[Y_SIZE][X_SIZE], unsigned char b_in[Y_SIZE][X_SIZE], unsigned char r_out[Y_SIZE][X_SIZE], unsigned char g_out[Y_SIZE][X_SIZE], unsigned char b_out[Y_SIZE][X_SIZE], int rth_min, int rth_max, int gth_min, int gth_max, int bth_min, int bth_max)
334
+
335
+ {
336
+
337
+ int i, j;
338
+
339
+
340
+
341
+ for (j = 0; j < Y_SIZE; j++)
342
+
343
+ {
344
+
345
+ for (i = 0; i < X_SIZE; i++)
346
+
347
+ {
348
+
349
+ //出力用のrgb値を用意
350
+
351
+ r_out[j][i] = r_in[j][i];
352
+
353
+ g_out[j][i] = g_in[j][i];
354
+
355
+ b_out[j][i] = b_in[j][i];
356
+
357
+ }
358
+
359
+ }
360
+
361
+
362
+
363
+ //色抽出処理
364
+
365
+ for (j = 0; i < Y_SIZE; j++)
366
+
367
+ {
368
+
369
+ for (i = 0; i < X_SIZE; i++)
370
+
371
+ {
372
+
373
+ //R値が最小閾値以下の時
374
+
375
+ if (r_out[j][i] < rth_min)
376
+
377
+ {
378
+
379
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
380
+
381
+ }
382
+
383
+ //R値が最大閾値以上の時
384
+
385
+ if (r_out[j][i] > rth_max)
386
+
387
+ {
388
+
389
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
390
+
391
+ }
392
+
393
+ //G値が最小閾値以下の時
394
+
395
+ if (g_out[j][i] < gth_min)
396
+
397
+ {
398
+
399
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
400
+
401
+ }
402
+
403
+ //G値が最大しきい値以上の時
404
+
405
+ if (g_out[j][i] > gth_max)
406
+
407
+ {
408
+
409
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
410
+
411
+ }
412
+
413
+ //B値が最小閾値以下の時
414
+
415
+ if (b_out[j][i] < bth_min)
416
+
417
+ {
418
+
419
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
420
+
421
+ }
422
+
423
+ //B値が最大閾値値以上の時
424
+
425
+ if (b_out[j][i] > bth_max)
426
+
427
+ {
428
+
429
+ r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
430
+
431
+ }
432
+
433
+ }
434
+
435
+ }
436
+
437
+
438
+
439
+ return r_out[j][i], g_out[j][i], b_out[j][i];
440
+
441
+ }
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+ //グレイ画像に変換するための関数
450
+
451
+ void Gray(unsigned char gray_img[Y_SIZE][X_SIZE], unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
452
+
453
+ {
454
+
455
+ int i, j;
456
+
457
+
458
+
459
+ //グレイ画像に変換する
460
+
461
+ for (j = 0; j < Y_SIZE; j++)
462
+
463
+ {
464
+
465
+ for (i = 0; i < X_SIZE; i++)
466
+
467
+ {
468
+
469
+ gray_img[j][i] = (unsigned char)(0.30*r[j][i] + 0.59*g[j][i] + 0.11*b[j][i]);
470
+
471
+ }
472
+
473
+ }
474
+
475
+ }
476
+
477
+
478
+
479
+
480
+
481
+ //画像を保存するための関数
482
+
483
+ void Save_img(char *Save_filepath, unsigned char img[Y_SIZE][X_SIZE])
484
+
485
+ {
486
+
487
+ int i, j;
488
+
489
+
490
+
491
+ FILE *w_filepath;
492
+
493
+
494
+
495
+
496
+
497
+ w_filepath = fopen(Save_filepath, "wb");
498
+
499
+
500
+
501
+ //もし,w_filepathが無かったら,「存在しません」と表示する
502
+
503
+ if (w_filepath == NULL)
504
+
505
+ {
506
+
507
+ printf("%sは存在しません!", Save_filepath);
508
+
509
+ exit(-1);
510
+
511
+ }
512
+
513
+
514
+
515
+
516
+
517
+ //画像を保存していく
518
+
519
+ for (j = 0; j < Y_SIZE; j++)
520
+
521
+ {
522
+
523
+ for (i = 0; i < X_SIZE; i++)
524
+
525
+ {
526
+
527
+ fputc(img[j][i], w_filepath);
528
+
529
+ fputc(img[j][i], w_filepath);
530
+
531
+ fputc(img[j][i], w_filepath);
532
+
533
+ }
534
+
535
+ }
536
+
537
+
538
+
539
+
540
+
541
+ //保存するファイルを閉じる
542
+
543
+ fclose(w_filepath);
544
+
545
+
546
+
547
+ }
548
+
159
549
  ```
160
550
 
161
- ###配列を宣言
162
-
163
- ```C
164
-
165
- //画像サイズを決める
166
-
167
- #define X_SIZE 640
168
-
169
-
170
-
171
- #define Y_SIZE 480
172
-
173
-
174
-
175
- //閾値の最小値
176
-
177
- #define LOW 0
178
-
179
-
180
-
181
- //閾値の最大値
182
-
183
- #define HIGH 255
184
-
185
-
186
-
187
- //rgb値の配列を宣言する
188
-
189
- unsigned char r[Y_SIZE][X_SIZE], g[Y_SIZE][X_SIZE], b[Y_SIZE][X_SIZE];
190
-
191
-
192
-
193
- //抽出した後のrgb値の配列を宣言する
194
-
195
- unsigned char r_out[Y_SIZE][X_SIZE], g_out[Y_SIZE][X_SIZE], b_out[Y_SIZE][X_SIZE];
196
-
197
-
198
-
199
- //カラー画像の配列を宣言する
200
-
201
- unsigned char get_color[Y_SIZE][X_SIZE];
202
-
203
-
204
-
205
- //モノクロ画像の配列を宣言する
206
-
207
- unsigned char get_img[Y_SIZE][X_SIZE];
208
-
209
- ```
210
-
211
- ###プロトタイプ宣言
212
-
213
- ```C
214
-
215
- //rgb画像を読み込むための関数
216
-
217
- void Read_rgbimage(char *Read_filepath, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE]);
218
-
219
-
220
-
221
- //RGB画像から特定の色のみを抽出するための関数
222
-
223
- int Color(unsigned char r_in[Y_SIZE][X_SIZE], unsigned char g_in[Y_SIZE][X_SIZE], unsigned char b_in[Y_SIZE][X_SIZE], unsigned char r_out[Y_SIZE][X_SIZE], unsigned char g_out[Y_SIZE][X_SIZE], unsigned char b_out[Y_SIZE][X_SIZE], int rth_min, int rth_max, int gth_min, int gth_max, int bth_min, int bth_max);
224
-
225
-
226
-
227
- //グレイスケールに変換するための関数
228
-
229
- void Gray(unsigned char gray_img[Y_SIZE][X_SIZE], unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE]);
230
-
231
-
232
-
233
- //画像を保存するための関数
234
-
235
- void Save_img(char *Save_filepath, unsigned char img[Y_SIZE][X_SIZE]);
236
-
237
- ```
238
-
239
- ###メインとなる関数
240
-
241
- ```C
242
-
243
- //メインとなる関数
244
-
245
- void main(void)
246
-
247
- {
248
-
249
- //画像を読み込む
250
-
251
- printf("読み込む画像ファイル=");
252
-
253
- scanf("%s", filepath);
254
-
255
-
256
-
257
- //rgb画像を読み込むための関数を呼び出す
258
-
259
- Read_rgbimage(filepath, r, g, b);
260
-
261
-
262
-
263
- //色を抽出するための関数
264
-
265
- Color(r, g, b, r_out, g_out, b_out, 167, 230, 167, 230, 167, 230);
266
-
267
-
268
-
269
- //グレイ画像に変換するための関数を呼び出す
270
-
271
- Gray(get_img, r_out, g_out, b_out);
272
-
273
-
274
-
275
- //画像を保存する
276
-
277
- printf("保存する画像ファイル=");
278
-
279
- scanf("%s", save_filepath);
280
-
281
-
282
-
283
- //画像を保存するための関数を呼び出す
284
-
285
- Save_img(save_filepath, get_img);
286
-
287
-
288
-
289
- break;
290
-
291
- }
292
-
293
- ```
294
-
295
-
296
-
297
- ###RGBカラー画像を読み込むための関数
298
-
299
- ```C
300
-
301
- //RGBカラー画像を読み込むための関数
302
-
303
- void Read_rgbimage(char *Read_filepath, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
304
-
305
- {
306
-
307
- //変数を定義
308
-
309
- int i, j;
310
-
311
-
312
-
313
-
314
-
315
- //画像を読み込むための準備
316
-
317
- FILE *r_filepath;
318
-
319
-
320
-
321
- r_filepath = fopen(Read_filepath, "rb");
322
-
323
-
324
-
325
- //もし,r_filepathが無かったら,「存在しません」と表示する
326
-
327
- if (r_filepath == NULL)
328
-
329
- {
330
-
331
- printf("%sは存在しません!", Read_filepath);
332
-
333
- exit(-1);
334
-
335
- }
336
-
337
-
338
-
339
-
340
-
341
- //rgb値を読み込む
342
-
343
- for (j = 0; j < Y_SIZE; j++)
344
-
345
- {
346
-
347
- for (i = 0; i < X_SIZE; i++)
348
-
349
- {
350
-
351
- //画像のRGB値を取得
352
-
353
- r[j][i] = fgetc(r_filepath);
354
-
355
- g[j][i] = fgetc(r_filepath);
356
-
357
- b[j][i] = fgetc(r_filepath);
358
-
359
- }
360
-
361
- }
362
-
363
-
364
-
365
- //画像ファイルを閉じる
366
-
367
- fclose(r_filepath);
368
-
369
-
370
-
371
- }
372
-
373
- ```
374
-
375
- ###RGBカラー画像から特定の色のみを抽出する関数(質問箇所)
376
-
377
- ```C
378
-
379
- //RGB画像から特定の色のみを抽出するための関数
380
-
381
- int Color(unsigned char r_in[Y_SIZE][X_SIZE], unsigned char g_in[Y_SIZE][X_SIZE], unsigned char b_in[Y_SIZE][X_SIZE], unsigned char r_out[Y_SIZE][X_SIZE], unsigned char g_out[Y_SIZE][X_SIZE], unsigned char b_out[Y_SIZE][X_SIZE], int rth_min, int rth_max, int gth_min, int gth_max, int bth_min, int bth_max)
382
-
383
- {
384
-
385
- int i, j;
386
-
387
-
388
-
389
- for (j = 0; j < Y_SIZE; j++)
390
-
391
- {
392
-
393
- for (i = 0; i < X_SIZE; i++)
394
-
395
- {
396
-
397
- //出力用のrgb値を用意
398
-
399
- r_out[j][i] = r_in[j][i];
400
-
401
- g_out[j][i] = g_in[j][i];
402
-
403
- b_out[j][i] = b_in[j][i];
404
-
405
- }
406
-
407
- }
408
-
409
-
410
-
411
- //色抽出処理
412
-
413
- for (j = 0; i < Y_SIZE; j++)
414
-
415
- {
416
-
417
- for (i = 0; i < X_SIZE; i++)
418
-
419
- {
420
-
421
- //R値が最小閾値以下の時
422
-
423
- if (r_out[j][i] < rth_min)
424
-
425
- {
426
-
427
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
428
-
429
- }
430
-
431
- //R値が最大閾値以上の時
432
-
433
- if (r_out[j][i] > rth_max)
434
-
435
- {
436
-
437
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
438
-
439
- }
440
-
441
- //G値が最小閾値以下の時
442
-
443
- if (g_out[j][i] < gth_min)
444
-
445
- {
446
-
447
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
448
-
449
- }
450
-
451
- //G値が最大しきい値以上の時
452
-
453
- if (g_out[j][i] > gth_max)
454
-
455
- {
456
-
457
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
458
-
459
- }
460
-
461
- //B値が最小閾値以下の時
462
-
463
- if (b_out[j][i] < bth_min)
464
-
465
- {
466
-
467
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
468
-
469
- }
470
-
471
- //B値が最大閾値値以上の時
472
-
473
- if (b_out[j][i] > bth_max)
474
-
475
- {
476
-
477
- r_out[j][i] = g_out[j][i] = b_out[j][i] = 0;
478
-
479
- }
480
-
481
- }
482
-
483
- }
484
-
485
-
486
-
487
- return r_out[j][i], g_out[j][i], b_out[j][i];
488
-
489
- }
490
-
491
-
492
-
493
- ```
494
-
495
- ###グレイ画像に変換する関数
496
-
497
- ```C
498
-
499
- //グレイ画像に変換するための関数
500
-
501
- void Gray(unsigned char gray_img[Y_SIZE][X_SIZE], unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
502
-
503
- {
504
-
505
- int i, j;
506
-
507
-
508
-
509
- //グレイ画像に変換する
510
-
511
- for (j = 0; j < Y_SIZE; j++)
512
-
513
- {
514
-
515
- for (i = 0; i < X_SIZE; i++)
516
-
517
- {
518
-
519
- gray_img[j][i] = (unsigned char)(0.30*r[j][i] + 0.59*g[j][i] + 0.11*b[j][i]);
520
-
521
- }
522
-
523
- }
524
-
525
- }
526
-
527
- ```
528
-
529
- ###画像を保存するための関数
530
-
531
- ```C
532
-
533
- //画像を保存するための関数
534
-
535
- void Save_img(char *Save_filepath, unsigned char img[Y_SIZE][X_SIZE])
536
-
537
- {
538
-
539
- int i, j;
540
-
541
-
542
-
543
- FILE *w_filepath;
544
-
545
-
546
-
547
-
548
-
549
- w_filepath = fopen(Save_filepath, "wb");
550
-
551
-
552
-
553
- //もし,w_filepathが無かったら,「存在しません」と表示する
554
-
555
- if (w_filepath == NULL)
556
-
557
- {
558
-
559
- printf("%sは存在しません!", Save_filepath);
560
-
561
- exit(-1);
562
-
563
- }
564
-
565
-
566
-
567
-
568
-
569
- //画像を保存していく
570
-
571
- for (j = 0; j < Y_SIZE; j++)
572
-
573
- {
574
-
575
- for (i = 0; i < X_SIZE; i++)
576
-
577
- {
578
-
579
- fputc(img[j][i], w_filepath);
580
-
581
- fputc(img[j][i], w_filepath);
582
-
583
- fputc(img[j][i], w_filepath);
584
-
585
- }
586
-
587
- }
588
-
589
-
590
-
591
-
592
-
593
- //保存するファイルを閉じる
594
-
595
- fclose(w_filepath);
596
-
597
-
598
-
599
- }
600
-
601
- ```
551
+
552
+
553
+
602
554
 
603
555
  #参考資料
604
556