2013-03-17 2 views
3

Я пытаюсь скрыть RGB до HSI и вернуть его. (Задача должна быть выполнена с нуля.)Преобразование RGB в HSI и HSI в RGB

В 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 

Я использую this calculator, чтобы проверить мои выводы.

Пожалуйста, дайте мне знать, что случилось. Благодарю.

#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; 
    } 
+1

Вы должны исправить свой отступ. Это позволит людям сосредоточиться на вашем вопросе больше, чем пытаться понять ваш код. – Synxis

+1

Число -2147483648 предполагает, что у вас есть проблема с целыми числами с подписью/без знака (или, возможно, с использованием NaN/inf для int.) –

+2

Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –

ответ

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 

Я на самом деле удивлен, что не разбился ...

В этом случае просто присвойте 0 оттенку. С вашей ссылки:

Нейтральные цвета - белый, серый и черный - для удобства установлены на 0 °.

1

От других ответа, похоже, существует деление на ноль вопрос, когда R = G = B при расчете temp, но и от того, что я могу сказать, вы используете degree с с тригонометрической функции, но они ожидают 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 ; 
} 
Смежные вопросы