質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2274閲覧

C言語 特定の色のみを抽出したいが出来ない

BASEBALL-Y

総合スコア67

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/07 01:35

編集2020/05/07 01:51

#質問内容
画像内のRGB値の閾値以下と閾値以上を黒く表示したいのですが,黒くなりません.
もし,間違っている個所が分かる方がいらっしゃいましたら,教えて頂けると幸いです.

#質問箇所のコード

C

1//RGB画像から特定の色のみを抽出するための関数 2//r_in,g_in,b_in・・・入力画像のRGB値 3//r_out,g_out,b_out・・・出力画像のRGB値 4//rth_min,gth_min,bth_min・・・最小の閾値 5//rth_max,gth_max,bth_max・・・最大の閾値 6 7int 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) 8{ 9 int i, j; 10 11 for (j = 0; j < Y_SIZE; j++) 12 { 13 for (i = 0; i < X_SIZE; i++) 14 { 15 //出力用のrgb値を用意 16 r_out[j][i] = r_in[j][i]; 17 g_out[j][i] = g_in[j][i]; 18 b_out[j][i] = b_in[j][i]; 19 } 20 } 21 22 //色抽出処理 23 for (j = 0; i < Y_SIZE; j++) 24 { 25 for (i = 0; i < X_SIZE; i++) 26 { 27 //R値が最小閾値以下の時 28 if (r_out[j][i] < rth_min) 29 { 30 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 31 } 32 //R値が最大閾値以上の時 33 if (r_out[j][i] > rth_max) 34 { 35 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 36 } 37 //G値が最小閾値以下の時 38 if (g_out[j][i] < gth_min) 39 { 40 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 41 } 42 //G値が最大しきい値以上の時 43 if (g_out[j][i] > gth_max) 44 { 45 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 46 } 47 //B値が最小閾値以下の時 48 if (b_out[j][i] < bth_min) 49 { 50 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 51 } 52 //B値が最大閾値値以上の時 53 if (b_out[j][i] > bth_max) 54 { 55 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 56 } 57 } 58 } 59 60 return r_out[j][i], g_out[j][i], b_out[j][i]; 61}

#一連の流れ

C

1#include "pch.h" 2#include "stdio.h" 3#include "stdlib.h" 4#include <string.h> 5#include <iostream> 6 7//画像サイズを決める 8#define X_SIZE 640 9#define Y_SIZE 480 10 11//閾値の最小値 12#define LOW 0 13//閾値の最大値 14#define HIGH 255 15 16//rgb値の配列を宣言する 17unsigned char r[Y_SIZE][X_SIZE], g[Y_SIZE][X_SIZE], b[Y_SIZE][X_SIZE]; 18 19//抽出した後のrgb値の配列を宣言する 20unsigned char r_out[Y_SIZE][X_SIZE], g_out[Y_SIZE][X_SIZE], b_out[Y_SIZE][X_SIZE]; 21 22//カラー画像の配列を宣言する 23unsigned char get_color[Y_SIZE][X_SIZE]; 24 25//モノクロ画像の配列を宣言する 26unsigned char get_img[Y_SIZE][X_SIZE]; 27 28 29void main(void) 30{ 31//画像を読み込む 32printf("読み込む画像ファイル="); 33scanf("%s", filepath); 34 35//rgb画像を読み込むための関数を呼び出す 36Read_rgbimage(filepath, r, g, b); 37 38//色を抽出するための関数 39Color(r, g, b, r_out, g_out, b_out, 167, 230, 167, 230, 167, 230); 40 41//グレイ画像に変換するための関数を呼び出す 42Gray(get_img, r_out, g_out, b_out); 43 44//画像を保存する 45printf("保存する画像ファイル="); 46scanf("%s", save_filepath); 47 48//画像を保存するための関数を呼び出す 49Save_img(save_filepath, get_img); 50 51break; 52 53 54 55//RGBカラー画像を読み込むための関数 56void 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]) 57{ 58 //変数を定義 59 int i, j; 60 61 62 //画像を読み込むための準備 63 FILE *r_filepath; 64 65 r_filepath = fopen(Read_filepath, "rb"); 66 67 //もし,r_filepathが無かったら,「存在しません」と表示する 68 if (r_filepath == NULL) 69 { 70 printf("%sは存在しません!", Read_filepath); 71 exit(-1); 72 } 73 74 75 //rgb値を読み込む 76 for (j = 0; j < Y_SIZE; j++) 77 { 78 for (i = 0; i < X_SIZE; i++) 79 { 80 //画像のRGB値を取得 81 r[j][i] = fgetc(r_filepath); 82 g[j][i] = fgetc(r_filepath); 83 b[j][i] = fgetc(r_filepath); 84 } 85 } 86 87 //画像ファイルを閉じる 88 fclose(r_filepath); 89 90} 91 92 93 94//RGB画像から特定の色のみを抽出するための関数 95int 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) 96{ 97 int i, j; 98 99 for (j = 0; j < Y_SIZE; j++) 100 { 101 for (i = 0; i < X_SIZE; i++) 102 { 103 //出力用のrgb値を用意 104 r_out[j][i] = r_in[j][i]; 105 g_out[j][i] = g_in[j][i]; 106 b_out[j][i] = b_in[j][i]; 107 } 108 } 109 110 //色抽出処理 111 for (j = 0; i < Y_SIZE; j++) 112 { 113 for (i = 0; i < X_SIZE; i++) 114 { 115 //R値が最小閾値以下の時 116 if (r_out[j][i] < rth_min) 117 { 118 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 119 } 120 //R値が最大閾値以上の時 121 if (r_out[j][i] > rth_max) 122 { 123 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 124 } 125 //G値が最小閾値以下の時 126 if (g_out[j][i] < gth_min) 127 { 128 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 129 } 130 //G値が最大しきい値以上の時 131 if (g_out[j][i] > gth_max) 132 { 133 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 134 } 135 //B値が最小閾値以下の時 136 if (b_out[j][i] < bth_min) 137 { 138 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 139 } 140 //B値が最大閾値値以上の時 141 if (b_out[j][i] > bth_max) 142 { 143 r_out[j][i] = g_out[j][i] = b_out[j][i] = 0; 144 } 145 } 146 } 147 148 return r_out[j][i], g_out[j][i], b_out[j][i]; 149} 150 151 152 153//グレイ画像に変換するための関数 154void 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]) 155{ 156 int i, j; 157 158 //グレイ画像に変換する 159 for (j = 0; j < Y_SIZE; j++) 160 { 161 for (i = 0; i < X_SIZE; i++) 162 { 163 gray_img[j][i] = (unsigned char)(0.30*r[j][i] + 0.59*g[j][i] + 0.11*b[j][i]); 164 } 165 } 166} 167 168 169//画像を保存するための関数 170void Save_img(char *Save_filepath, unsigned char img[Y_SIZE][X_SIZE]) 171{ 172 int i, j; 173 174 FILE *w_filepath; 175 176 177 w_filepath = fopen(Save_filepath, "wb"); 178 179 //もし,w_filepathが無かったら,「存在しません」と表示する 180 if (w_filepath == NULL) 181 { 182 printf("%sは存在しません!", Save_filepath); 183 exit(-1); 184 } 185 186 187 //画像を保存していく 188 for (j = 0; j < Y_SIZE; j++) 189 { 190 for (i = 0; i < X_SIZE; i++) 191 { 192 fputc(img[j][i], w_filepath); 193 fputc(img[j][i], w_filepath); 194 fputc(img[j][i], w_filepath); 195 } 196 } 197 198 199 //保存するファイルを閉じる 200 fclose(w_filepath); 201 202}

#参考資料
画像内の特定の色を抽出するサンプルコード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/05/07 01:41

> 黒くなりません 黒くならずにどうなるのでしょうか. どのような入力をするとどのような出力になるのかを追記して頂けますか. また, なぜコードがバラバラなのでしょうか. 実際に実行できるコードとしてご提示頂かないと, 実際に動かしてどうなるのか, また見て分からない場合に修正・確認を行うことも出来ません.
BASEBALL-Y

2020/05/07 01:44

特定の色を抽出しない場合と同じ結果になります. コードの件は申し訳ございません. 一通りの流れを載せておきます.
jimbe

2020/05/07 01:51 編集

流れでは無く, 一つのファイルであれば纏めて頂ければいいですし, 別々のファイルなのであればそれぞれのコードに include 等があるはずです. 「~の関数」というのはコードの先頭にでもコメントで書いてあれば良いことで, include しているのであれば それぞれにファイル名を書いて頂けますか.
guest

回答1

0

ベストアンサー

どっちがホントかわからないけど、流れの方のforのカウンターがおかしいです。

投稿2020/05/07 02:09

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BASEBALL-Y

2020/05/07 02:12

for文を修正すると,正しく表示されました. 回答して頂き,本当にありがとうございます.
amiya

2020/05/07 02:12

両方ともでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問