前提・実現したいこと
課題でRGBカラーの画像を修正HSV表色系に変換するプログラム課題です。
内容を書く所はConvertMHSVの中身だけです。
色相成分は六角錐モデルにしなければならなく処理が複雑なのでConvHであらかじめ定義されているのを使う。
発生している問題・エラーメッセージ
エラーはなし 画像の入力処理は上手く行っていますが、3つの画像が出力されず困っています。
該当のソースコード
c言語
// RGBカラー画像を入力し、修正HSV表色系に変換して出力
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* 画像サイズ /
#define X 256
#define Y 256
#define PI 4.0atan(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][X3], unsigned char H[Y][X], unsigned char Qc[Y][X], unsigned char I[Y][X]);
void ConvH(unsigned char rgbimg[Y][X3], unsigned char himg[Y][X]);
/* --- メイン --- */
int main(int argc, char argv[])
{
unsigned char inimg[Y][X3], 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][X3], 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/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー