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 = 2; // 2値変換モード (1:要求通り、2:RGBの平均値から計算)
  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. }
  86. }
  87. }
  88.  
  89. // 画像出力
  90. fp = fopen(OUT_IMAGE_FILE, "wb");
  91. fwrite(head, BMP_HEADER_SIZE, 1, fp);
  92. for (j = HEIGHT - 1; j >= 0; j--) {
  93. for (i = 0; i < WIDTH; i++) {
  94. if (data[i][j].v) {
  95. putc(0xFF, fp);
  96. putc(0xFF, fp);
  97. putc(0xFF, fp);
  98. } else {
  99. putc(0, fp);
  100. putc(0, fp);
  101. putc(0, fp);
  102. }
  103. }
  104. }
  105. fclose(fp);
  106. system(OUT_IMAGE_COMMAND " " OUT_IMAGE_FILE);
  107.  
  108. // end
  109. return 0;
  110. }
Runtime error #stdin #stdout 0.02s 4248KB
stdin
Standard input is empty
stdout
Standard output is empty