3

私はそれを変換RGBHSIて元に戻そうとしています。(タスクはゼロから作成する必要があります。)

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;
    }
4

2 に答える 2

1

問題は次の行にあります。

temp = (R - (G/2) - (B/2)) / (sqrt((R*R) + (G*G) + (B*B) - (R*G) - (R*B) - (G*B)));

の場合R = G = B、ゼロ除算があります。

R² - G² - B² - RG - RB - GB = R² + R² + R² - R² - R² - R² = 0

壊れなかったのが本当に不思議…

その場合は、hue に 0 を割り当てるだけです。あなたのリンクから:

白、グレー、黒の中間色は便宜上 0° に設定されています。

于 2013-03-17T17:25:19.797 に答える
1

R = G = B他の回答から、計算時にゼロ除算の問題があるように見えますが、三角関数で s をtemp使用していると私が言えることからもdegree、彼らは s を期待していますradian:

#include <cmath>
#include <iostream>

int main()
{
   double pi = atan(1)*4 ;
   std::cout << cos(180) << std::endl ;
   std::cout << cos(360) << std::endl ;
   std::cout << cos(pi) << std::endl ;
   std::cout << cos(2*pi) << std::endl ;   
}
于 2013-03-17T17:25:34.923 に答える