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

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

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

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

Q&A

解決済

1回答

2144閲覧

c言語 画像処理 修正HSV表色系

yuu_1033

総合スコア0

C

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

0グッド

0クリップ

投稿2021/06/22 06:25

前提・実現したいこと

課題でRGBカラーの画像を修正HSV表色系に変換するプログラム課題です。
内容を書く所はConvertMHSVの中身だけです。
色相成分は六角錐モデルにしなければならなく処理が複雑なのでConvHであらかじめ定義されているのを使う。
修正HSV表色系

発生している問題・エラーメッセージ

エラーはなし 画像の入力処理は上手く行っていますが、3つの画像が出力されず困っています。

該当のソースコード

c言語

// RGBカラー画像を入力し、修正HSV表色系に変換して出力
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* 画像サイズ /
#define X 256
#define Y 256
#define PI 4.0
atan(1.0)

/* --- 関数プロトタイプ宣言 --- /
void RGBImageRead(char name, unsigned char img[Y][X3]);
void ImageWrite(char name, unsigned char img[Y][X]);
void ConvertMHSV(unsigned char in[Y][X
3], unsigned char H[Y][X], unsigned char Qc[Y][X], unsigned char I[Y][X]);
void ConvH(unsigned char rgbimg[Y][X
3], unsigned char himg[Y][X]);

/* --- メイン --- */
int main(int argc, char argv[])
{
unsigned char inimg[Y][X
3], outH[Y][X], outQc[Y][X], outI[Y][X];
int j, k;

if(argc != 5){ printf("コマンド:%s [入力ファイル] [出力H] [出力Qc] [出力I]\n", argv[0]); return 0; } // 画像入力 RGBImageRead(argv[1], inimg); // 処理 ConvertMHSV(inimg, outH, outQc, outI); // 画像出力 ImageWrite(argv[2], outH); ImageWrite(argv[3], outQc); ImageWrite(argv[4], outI); return 0;

}

/* --- 画像入力 --- */
void RGBImageRead(char name, unsigned char img[Y][X3])
{
FILE *fp;

if((fp = fopen(name, "rb")) == NULL){ printf("ファイルオープンできません。\n"); exit(0); } fread(img, sizeof(unsigned char), Y*X*3, fp); printf("\"%s\"を入力しました。\n", name); fclose(fp);

}

/* --- 画像出力 --- */
void ImageWrite(char *name, unsigned char img[Y][X])
{
FILE *fp;

if((fp = fopen(name, "wb")) == NULL){ printf("ファイルオープンできません。\n"); exit(0); } fwrite(img, sizeof(unsigned char), Y*X, fp); printf("\"%s\"に出力しました。\n", name); fclose(fp);

}

// RGBカラー画像から修正HSV表色系に変換
void ConvertMHSV(unsigned char in[Y][X*3], unsigned char imgH[Y][X], unsigned char imgQc[Y][X], unsigned char imgI[Y][X])
{
** int j, k, x,a,c;
unsigned char r[Y][X], g[Y][X], b[Y][X], R, G, B;
double tmp;

// 初期化 for(j = 0; j < Y; j++){ for(k = 0; k < X; k++){ imgH[j][k] = 255; imgQc[j][k] = 255; imgI[j][k] = 255; } } // RGB各成分に分離 // 処理を記述する for (j = 0;j < Y;j++) { x = 0; for (k = 0;k < X * 3;k = k + 3) { r[j][x] = in[j][k]; g[j][x] = in[j][k+1]; b[j][x] = in[j][k+2]; x++; } } // 修正HSV表色系へ変換 // 色相成分 ConvH(in, imgH); // 修正彩度成分 : imgQc[j][k] for (j = 0;j < Y;j++) { for (k = 0;k < X;k++) { a = (2 * r[j][k] - g[j][k] - b[j][k]) / 2; c = (sqrt(3) * (g[j][k] - b[j][k])) / 2; a = a * a; c = c * c; tmp = sqrt(a + c); imgQc[j][k] =(unsigned char) (tmp); } } // 強度成分 : imgI[j][k] // 処理を記述する for (j = 0;j < Y;j++) { for (k = 0;k < X;k++) { imgI[j][k] = (unsigned char)((r[j][k] + g[j][k] + b[j][k])/3); } }**

}

/* --- rgbカラー画像をHSV表色系のH(色相)成分画像へ変換 --- /
void ConvH(unsigned char rgbimg[Y][X
3], unsigned char himg[Y][X])
{
unsigned char *rimg, *gimg, *bimg;
int x, y, xx;
double rg, rb, gb, angle;

// 初期化 for(y = 0; y < Y; y++){ for(x = 0; x < X; x++){ himg[y][x] = 255; } } // R,G,B各成分画像を保存する領域を動的確保 rimg = (unsigned char *)malloc(sizeof(unsigned char)*Y*X); gimg = (unsigned char *)malloc(sizeof(unsigned char)*Y*X); bimg = (unsigned char *)malloc(sizeof(unsigned char)*Y*X); // 各成分に分ける for(y = 0; y < Y; y++){ for(x = 0; x < X; x++){ *(bimg+x+y*X) = rgbimg[y][x*3 + 0]; *(gimg+x+y*X) = rgbimg[y][x*3 + 1]; *(rimg+x+y*X) = rgbimg[y][x*3 + 2]; } } // H成分(六角錐モデル)へ変換 for(y = 0; y < Y; y++){ for(x = 0; x < X; x++){ // R = G および B = G の場合 if(*(rimg+x+y*X) == *(gimg+x+y*X) && *(bimg+x+y*X) == *(gimg+x+y*X)){ angle = 0.0; } else{ // R = B の場合 if(*(rimg+x+y*X) == *(bimg+x+y*X)){ // G > R の場合 if(*(gimg+x+y*X) > *(rimg+x+y*X)){ angle = 120.0; } else{ angle = 300.0; } } // R = G の場合 else if(*(rimg+x+y*X) == *(gimg+x+y*X)){ // G > B の場合 if(*(gimg+x+y*X) > *(bimg+x+y*X)){ angle = 60.0; } else{ angle = 240.0; } } // G = B の場合 else if(*(gimg+x+y*X) == *(bimg+x+y*X)){ // B > R の場合 if(*(bimg+x+y*X) > *(rimg+x+y*X)){ angle = 180.0; } else{ angle = 360.0; } } else{ rg = (double)(*(rimg+x+y*X) - *(gimg+x+y*X)); rb = (double)(*(rimg+x+y*X) - *(bimg+x+y*X)); gb = (double)(*(gimg+x+y*X) - *(bimg+x+y*X)); // H = acos(((R-G)+(R-B))/(2*sqrt((R-G)*(R-G)+(R-B)*(G-B)))) angle = acos((rg+rb)/(2.0*sqrt(rg*rg+rb*gb)))*180.0/PI; // B > G の場合 if(*(bimg+x+y*X) > *(gimg+x+y*X)){ angle = 360.0 - angle; } } } himg[y][x] = (unsigned char)(angle / 360.0 * 255.0); } } free(rimg); free(gimg); free(bimg);

}

試したこと

問題は修正彩度成分と強度成分の記述に誤りがあると考えている。そこで考えてみたが(unsigned char)が最初は書いていなかったのでそれが問題なのかと思いましたが3つの画像が出力されることがなった。
最終的な値の格納する場所が違うのではと考えたがimgQc or imgIじゃないのかと思ったが3つの画像が出力されず行き詰ってしまった。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

fana

2021/06/22 06:55

> 画像の入力処理は上手く行っていますが というのはどのようにして確認したのですか? 動作状況を確認できる術があるのであれば,どこで問題が起きるのかを確認すればよいのではありませんか. あと,markdownを用いたコードの提示方法をこのサイトのヘルプあたりから調べて,見やすい形に修正してください.
fana

2021/06/22 06:59

ファイルが出力されない,というのであれば,単純には以下のような原因が考えられます. ・ファイルを出力する(つもりの)処理の中身が間違っている ・ファイルを出力する(つもりの)処理がそもそも実行されていない ・ファイルを出力する(つもりの)処理が何かまともに動作できないようなデータ状況になっている 原因はどれなのか?(または別の何かなのか) という視点で調査されてみてはいかがでしょうか. 「とにかく何が何だかわからないが,結果としてダメ」というのではなく,もう少し絞り込んでください.
jbpb0

2021/06/22 07:06

c++のコードの一番最初の行のすぐ上に ```c++ だけの行を追加してください また、c++のコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
yuu_1033

2021/06/22 13:35

結構考えてこれ以外ありえないと思うところまで来てたので質問してみたんですが確認していたら別の似たプログラムを実行していたため出力できなかっただけでした。 目的のプログラムはちゃんとできていました。 大変申し訳ございませんでした。
thkana

2021/06/22 22:07

では自己解決としてその旨書いて自分で回答、解決済みにしておいてください。 何度か言われているソースコードのところのマークダウン処理もよろしく。
guest

回答1

0

自己解決

別のプログラムを実行していて、質問していたプログラムは問題なく機能していたため。

投稿2021/06/24 00:45

yuu_1033

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問