fork(1) 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. unsigned char sikiichi = 0x80; // しきい値(これ以上なら白、未満なら黒)
  41. unsigned char head[BMP_HEADER_SIZE]; // BMPヘッダ
  42. static COLOR data[WIDTH][HEIGHT], *pColor; // データ
  43. FILE *fp; // ファイル
  44.  
  45. // init
  46. memset(data, 0x00, sizeof(data));
  47.  
  48. // read
  49. if ((fp = fopen(INPUT_IMAGE_FILE, "rb")) == NULL) {
  50. fprintf(stderr, "file open error\n");
  51. exit(1);
  52. }
  53. rewind(fp);
  54. fread(head, BMP_HEADER_SIZE, 1, fp);
  55. for (j = HEIGHT - 1; j >= 0; j--) {
  56. for (i = 0; i < WIDTH; i++) {
  57. pColor = &data[i][j];
  58. pColor->b = getc(fp);
  59. pColor->g = getc(fp);
  60. pColor->r = getc(fp);
  61. }
  62. }
  63. fclose(fp);
  64.  
  65. // 2値計算
  66. for (j = HEIGHT - 1; j >= 0; j--) {
  67. for (i = 0; i < WIDTH; i++) {
  68. pColor = &data[i][j];
  69. // ※ RGB値が同値でないドットは「黒」とする
  70. if ((pColor->b == pColor->g) && (pColor->g == pColor->r) && (sikiichi <= pColor->r)) {
  71. data[i][j].v = 1;
  72. }
  73. }
  74. }
  75.  
  76. // 画像出力
  77. fp = fopen(OUT_IMAGE_FILE, "wb");
  78. fwrite(head, BMP_HEADER_SIZE, 1, fp);
  79. for (j = HEIGHT - 1; j >= 0; j--) {
  80. for (i = 0; i < WIDTH; i++) {
  81. if (data[i][j].v) {
  82. putc(0xFF, fp);
  83. putc(0xFF, fp);
  84. putc(0xFF, fp);
  85. } else {
  86. putc(0, fp);
  87. putc(0, fp);
  88. putc(0, fp);
  89. }
  90. }
  91. }
  92. fclose(fp);
  93. system(OUT_IMAGE_COMMAND " " OUT_IMAGE_FILE);
  94.  
  95. // end
  96. return 0;
  97. }
Runtime error #stdin #stdout 0.02s 4204KB
stdin
Standard input is empty
stdout
Standard output is empty