私はそれを変換RGB
しHSI
て元に戻そうとしています。(タスクはゼロから作成する必要があります。)
RGB
変換ではHSI
、彩度と強度の出力は問題ありません。しかし、色相の定式化には問題がないようです。出力例:
Red = 255, Green = 255, Blue = 255
Hue = -2147483648, Saturation = 0, Intensity = 255
Red = 252, Green = 255, Blue = 255
Hue = 3, Saturation = 0.00787402, Intensity = 254
この計算機を使用して、出力を確認します。
何が問題なのか教えてください。ありがとう。
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
int main()
{
char infname[256];
ofstream outputFile, outputFile2;
outputFile.open("RGB_HSI.txt");
outputFile2.open("HSI_RGB.txt");
cout << "Enter input image : ";
cin >> infname;
IplImage *img = cvLoadImage(infname, 1);
RgbImage pic(img);
int H = img->height;
int W = img->width;
for (int j=0;j<H;j++)
for (int i=0;i<W;i++) {
double temp = 0;
double R =(double) pic[j][i].r;
double G =(double) pic[j][i].g;
double B =(double) pic[j][i].b;
double intensity = 0;
double hue = 0;
double saturation = 0;
int resultHue = 0;
double resultSaturation = 0;
int resultIntensity = 0;
intensity = (R + G + B) / 3;
if ((R + G + B) == 765) {
saturation = 0;
hue = 0;
}
double minimum = min(R, min(G, B));
if (intensity > 0) {
saturation = 1 - minimum / intensity;
}
else if (intensity == 0) {
saturation = 0;
}
temp = (R - (G/2) - (B/2)) / (sqrt((R*R) + (G*G) + (B*B) - (R*G) - (R*B) - (G*B)));
if (G >= B) {
hue = acos(temp);
outputFile<<"1. temp = "<<temp<<", H = "<<hue<<endl;
}
else if (B > G) {
hue = 360 - acos(temp);
outputFile<<"2. temp = "<<temp<<", H = "<<hue<<endl;
}
resultHue = (int) hue;
resultSaturation = saturation;
resultIntensity = (int) intensity;
//outputFile2<<"image = "<<pic[j][i]<<endl;
outputFile<<"Red = "<<R<<", Green = "<<G<<", Blue = "<<B<<endl;
outputFile<<"Hue = "<<resultHue<<", Saturation = "<<resultSaturation<<", Intensity = "<<resultIntensity<<endl;
//converting HSI to RGB
int backR = 0, backG = 0, backB = 0;
if (resultHue == 0){
backR = (int) (resultIntensity + (2 * resultIntensity * resultSaturation));
backG = (int) (resultIntensity - (resultIntensity * resultSaturation));
backB = (int) (resultIntensity - (resultIntensity * resultSaturation));
}
else if ((0 < resultHue) && (resultHue < 120)) {
backR = (int) (resultIntensity + (resultIntensity * resultSaturation) * cos(resultHue) / cos(60-resultHue));
backG = (int) (resultIntensity + (resultIntensity * resultSaturation) * (1 - cos(resultHue) / cos(60-resultHue)));
backB = (int) (resultIntensity - (resultIntensity * resultSaturation));
}
else if ( resultHue == 120 ){
backR = (int) (resultIntensity - (resultIntensity * resultSaturation));
backG = (int) (resultIntensity + (2 * resultIntensity * resultSaturation));
backB = (int) (resultIntensity - (resultIntensity * resultSaturation));
}
else if ((120 < resultHue) && (resultHue < 240)) {
backR = (int) (resultIntensity - (resultIntensity * resultSaturation));
backG = (int) (resultIntensity + (resultIntensity * resultSaturation) * cos(resultHue-120) / cos(180-resultHue));
backB = (int) (resultIntensity + (resultIntensity * resultSaturation) * (1 - cos(resultHue-120) / cos(180-resultHue)));
}
else if (resultHue == 240) {
backR = (int) (resultIntensity - (resultIntensity * resultSaturation));
backG = (int) (resultIntensity - (resultIntensity * resultSaturation));
backB = (int) (resultIntensity + (2 * resultIntensity * resultSaturation));
}
else if ((240 < resultHue) && (resultHue < 360)) {
backR = (int) (resultIntensity + (resultIntensity * resultSaturation) * (1 - cos(resultHue-240) / cos(300-resultHue)));
backG = (int) (resultIntensity - (resultIntensity * resultSaturation));
backB = (int) (resultIntensity + (resultIntensity * resultSaturation) * cos(resultHue-240) / cos(300-resultHue));
}
//outputpic[j][i] = (int) (R + G + B);
//outputFile2<<"output = "<<outputpic[j][i]<<endl;
outputFile2<<"Hue = "<<resultHue<<", Saturation = "<<resultSaturation<<", Intensity = "<<resultIntensity<<endl;
outputFile2<<"Red = "<<backR<<", Green = "<<backG<<", Blue = "<<backB<<endl;
}
outputFile.close();
cout << "\nRGB_HSI values printed as text file: RGB_HSI.text\n";
outputFile2.close();
cout << "\nHSI_RGB values printed as text file: HSI_RGB.text\n";
return 0;
}