fork download
  1. /*
  2.   http://i...content-available-to-author-only...e.com/fskVl3
  3.  
  4.   http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1349527750/951
  5.   > [1] 授業単元:2値化
  6.   > [2] 問題文(含コード&リンク):
  7.   > http://i...content-available-to-author-only...e.com/fskVl3
  8.   > 画像読み込み→2値化→2値化した画像を表示するプログラムを作成せよ
  9.   > 画像読み込みまでは出来ましたが、2値化がよくわかりませんでした。
  10.   > フルカラー前提でRGBの全チャンネルが同値なら濃淡画像に変換され、その濃淡画像を閾値処理によって2値にするらしいですがその辺がよくわかりません
  11.   > [3] 環境
  12.   >  [3.1] OS:Windows7
  13.   >  [3.2] コンパイラ名とバージョン:VS2010
  14.   >  [3.3] 言語:C
  15.   > [4] 期限:12/1
  16.   > [5] その他の制限:出来るだけ標準ライブラリでお願いします
  17. */
  18. #include<stdio.h>
  19. #include<stdlib.h>
  20. #include<string.h>
  21.  
  22. #define WIDTH (640)
  23. #define HEIGHT (480)
  24. #define BMP_HEADER_SIZE (54)
  25. #define INPUT_IMAGE_FILE "image.bmp"
  26. #define OUT_IMAGE_FILE "image2.bmp"
  27. #define OUT_IMAGE_COMMAND "start" // image 出力コマンド
  28. //#define OUT_IMAGE_COMMAND "eog" // Linux Gnome の「Eye of GNOME」を使う場合
  29.  
  30. typedef struct color {
  31. unsigned char r; // 入力画像 赤
  32. unsigned char g; // 緑
  33. unsigned char b; // 青
  34. int v; // 出力画像 2値 (0 or 1)
  35. } COLOR;
  36.  
  37. int main()
  38. {
  39. int i, j;
  40. int mode = 3; // 2値変換モード (1:要求通り、2:RGBの平均値から計算、3:YCrCb変換)
  41. unsigned char sikiichi = 0x80; // しきい値(これ以上なら白、未満なら黒)
  42. int ave; // RGB3値平均計算用
  43. unsigned char head[BMP_HEADER_SIZE]; // BMPヘッダ
  44. static COLOR data[WIDTH][HEIGHT], *pColor; // データ
  45. FILE *fp; // ファイル
  46.  
  47. // init
  48. memset(data, 0x00, sizeof(data));
  49.  
  50. // read
  51. if ((fp = fopen(INPUT_IMAGE_FILE, "rb")) == NULL) {
  52. fprintf(stderr, "file open error\n");
  53. exit(1);
  54. }
  55. rewind(fp);
  56. fread(head, BMP_HEADER_SIZE, 1, fp);
  57. for (j = HEIGHT - 1; j >= 0; j--) {
  58. for (i = 0; i < WIDTH; i++) {
  59. pColor = &data[i][j];
  60. pColor->b = getc(fp);
  61. pColor->g = getc(fp);
  62. pColor->r = getc(fp);
  63. }
  64. }
  65. fclose(fp);
  66.  
  67. // 2値計算
  68. for (j = HEIGHT - 1; j >= 0; j--) {
  69. for (i = 0; i < WIDTH; i++) {
  70. pColor = &data[i][j];
  71. switch (mode) {
  72. case 1:
  73. // ※ RGB値が同値でないドットは「黒」とする
  74. if ((pColor->b == pColor->g) && (pColor->g == pColor->r) && (sikiichi <= pColor->r)) {
  75. data[i][j].v = 1;
  76. }
  77. break;
  78. case 2:
  79. ave = (int) pColor->b + (int) pColor->g + (int) pColor->r;
  80. ave /= 3;
  81. if (sikiichi <= ave) {
  82. data[i][j].v = 1;
  83. }
  84. break;
  85. case 3:
  86. ave = (int) (((double) pColor->r * 0.299 + (double) pColor->g * 0.587 + (double) pColor->b * 0.114) / (0.114 + 0.587 + 0.299));
  87. if (sikiichi <= ave) {
  88. data[i][j].v = 1;
  89. }
  90. break;
  91. }
  92. }
  93. }
  94.  
  95. // 画像出力
  96. fp = fopen(OUT_IMAGE_FILE, "wb");
  97. fwrite(head, BMP_HEADER_SIZE, 1, fp);
  98. for (j = HEIGHT - 1; j >= 0; j--) {
  99. for (i = 0; i < WIDTH; i++) {
  100. if (data[i][j].v) {
  101. putc(0xFF, fp);
  102. putc(0xFF, fp);
  103. putc(0xFF, fp);
  104. } else {
  105. putc(0, fp);
  106. putc(0, fp);
  107. putc(0, fp);
  108. }
  109. }
  110. }
  111. fclose(fp);
  112. system(OUT_IMAGE_COMMAND " " OUT_IMAGE_FILE);
  113.  
  114. // end
  115. return 0;
  116. }
Runtime error #stdin #stdout 0.02s 4248KB
stdin
Standard input is empty
stdout
Standard output is empty