gpt4 book ai didi

c++ - 实现 RGBtoHSV C++,错误的 H 输出

转载 作者:行者123 更新时间:2023-11-30 03:40:50 25 4
gpt4 key购买 nike

我正在尝试在 HSV 维度中执行 Sobel 运算符(我的向导告诉我在 HSV 中执行此操作,但我不明白为什么它在 HSV 上比在 RGB 上工作得更好)。我构建了一个从 RGB 转换为 HSV 的函数。虽然我在 C++ 方面的知识一般,但我对图像处理感到困惑,因此我试图使代码尽可能简单,这意味着我不关心(在这个阶段)时间和空间。从我在灰度级 bmp 照片中得到的结果来看,我的 V 和 S 似乎很好,但我的 H 看起来很乱码。我在这里有 2 个问题:1. 与源照片相比,灰度级别的普通 H 照片应该看起来如何?2.我的代码哪里错了:

   void RGBtoHSV(unsigned char image[][NUMBER_OF_COLUMNS][NUMBER_OF_COLORS],
float Him[][NUMBER_OF_COLUMNS],
float Vim[][NUMBER_OF_COLUMNS],
float Sim[][NUMBER_OF_COLUMNS])
{

double Rn, Gn, Bn;

double C;
double H, S, V;

for (int row = 0; row < NUMBER_OF_ROWS; row++)
{
for (int column = 0; column < NUMBER_OF_COLUMNS; column++)
{
Rn = (1.0*image[row][column][R]) / 255;
Gn = (1.0*image[row][column][G] )/ 255;
Bn = (1.0*image[row][column][B] )/ 255;

//double RGBn[3] = { Rn, Gn, Bn };

double max = Rn;
if (max < Gn) max = Gn;
if (max < Bn) max = Bn;
double min = Rn;
if (min > Gn) min = Gn;
if (min > Bn) min = Bn;

C = max - min;

H = 0;
if (max==0)
{
S = 0;
H = -1; //undifined;
V = max;
}
else
{

/* if (max == Rn)
H = (60.0* ((int)((Gn - Bn) / C) % 6));
else if (max == Gn)
H = 60.0*( (Bn - Rn)/C + 2);
else
H = 60.0*( (Rn - Gn)/C + 4);
*/

if (max == Rn)
H = ( 60.0* ( (Gn - Bn) / C) ) ;
else if (max == Gn)
H = 60.0*((Bn - Rn) / C + 2);
else
H = 60.0*((Rn - Gn) / C + 4);

V = max; //AKA lightness
S = C / max; //saturation
}


while (H < 0)
H += 360;
while (H>360)
H -= 360;

Him[row][column] = (float)H;

Vim[row][column] = (float)V;
Sim[row][column] = (float)S;
}
}
}

还有我的 hsvtorgb :

void HSVtoRGB(unsigned char image[][NUMBER_OF_COLUMNS][NUMBER_OF_COLORS],
float Him[][NUMBER_OF_COLUMNS],
float Vim[][NUMBER_OF_COLUMNS],
float Sim[][NUMBER_OF_COLUMNS])
{

double R1, G1, B1;

double C;
double V;
double S;
double H;
int Htag;
double Htag2;
double x;
double m;

for (int row = 0; row < NUMBER_OF_ROWS; row++)
{
for (int column = 0; column < NUMBER_OF_COLUMNS; column++)
{
H = (double)Him[row][column];
S = (double)Sim[row][column];
V = (double)Vim[row][column];


C = V*S;

Htag = (int) (H / 60.0);
Htag2 = H/ 60.0;


//x = C*(1 - abs(Htag % 2 - 1));
double tmp1 = fmod(Htag2, 2);
double temp=(1 - abs(tmp1 - 1));
x = C*temp;
//switch (Htag)
switch (Htag)
{
case 0 :
R1 = C;
G1 = x;
B1 = 0;
break;
case 1:
R1 = x;
G1 = C;
B1 = 0;
break;
case 2:
R1 = 0;
G1 = C;
B1 = x;
break;
case 3:
R1 = 0;
G1 = x;
B1 = C;
break;
case 4:
R1 = x;
G1 = 0;
B1 = C;
break;
case 5:
R1 = C;
G1 = 0;
B1 = x;
break;
default:
R1 = 0;
G1 = 0;
B1 = 0;
break;

}


m = V - C;
//this is also good change I found
//image[row][column][R] = unsigned char( (R1 + m)*255);
//image[row][column][G] = unsigned char( (G1 + m)*255);
//image[row][column][B] = unsigned char( (B1 + m)*255);

image[row][column][R] = round((R1 + m) * 255);
image[row][column][G] = round((G1 + m) * 255);
image[row][column][B] = round((B1 + m) * 255);



}
}
}


void HSVfloattoGrayconvert(unsigned char grayimage[NUMBER_OF_ROWS] [NUMBER_OF_COLUMNS], float hsvimage[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS], char hsv)
{
//grayimage , flaotimage , h/s/v
float factor;
if (hsv == 'h' || hsv == 'H') factor = (float) 1 / 360;
else factor = 1;
for (int row = 0; row < NUMBER_OF_ROWS; row++)
{
for (int column = 0; column < NUMBER_OF_COLUMNS; column++)
{
grayimage[row][column] = (unsigned char) (0.5f + 255.0f * (float)hsvimage[row][column] / factor);
}
}
}

和我的主要:

 unsigned char ColorImage1[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]   [NUMBER_OF_COLORS];
float Himage[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
float Vimage[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
float Simage[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];

unsigned char ColorImage2[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS] [NUMBER_OF_COLORS];

unsigned char HimageGray[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
unsigned char VimageGray[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
unsigned char SimageGray[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];

unsigned char HAfterSobel[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
unsigned char VAfterSobel[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
unsigned char SAfterSobal[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];

unsigned char HSVcolorAfterSobal[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS][NUMBER_OF_COLORS];

unsigned char RGBAfterSobal[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS][NUMBER_OF_COLORS];


int KernelX[3][3] = {
{-1,0,+1}, {-2,0,2}, {-1,0,1 }
};

int KernelY[3][3] = {
{-1,-2,-1}, {0,0,0}, {1,2,1}
};

void main()
{

//work
LoadBgrImageFromTrueColorBmpFile(ColorImage1, "P22A.bmp");

// add noise
AddSaltAndPepperNoiseRGB(ColorImage1, 350, 255);
StoreBgrImageAsTrueColorBmpFile(ColorImage1, "saltandpepper.bmp");
AddGaussNoiseCPPstileRGB(ColorImage1, 0.0, 1.0);
StoreBgrImageAsTrueColorBmpFile(ColorImage1, "Saltandgauss.bmp");

//saves hsv in float array
RGBtoHSV(ColorImage1, Himage, Vimage, Simage);

//saves hsv float arrays in unsigned char arrays
HSVfloattoGrayconvert(HimageGray, Himage, 'h');
HSVfloattoGrayconvert(VimageGray, Vimage, 'v');
HSVfloattoGrayconvert(SimageGray, Simage, 's');


StoreGrayImageAsGrayBmpFile(HimageGray, "P22H.bmp");
StoreGrayImageAsGrayBmpFile(VimageGray, "P22V.bmp");
StoreGrayImageAsGrayBmpFile(SimageGray, "P22S.bmp");

WaitForUserPressKey();

}

编辑:更改代码 + 添加方程式来源:来源:方程式:

  1. http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
  2. http://www.rapidtables.com/convert/color/rgb-to-hsv.htm

编辑3:听@gpasch建议和使用better reference并删除 mod6 我现在可以恢复 RGB 原始照片了!!!但不幸的是,现在我的灰度 H 照片比以前更加困惑。我将编辑代码,以便它包含有关我如何保存 H 灰度照片的更多信息。

最佳答案

这就是浏览垃圾网站的危险;我建议如下:

https://www.cs.rit.edu/~ncs/color/t_convert.html

那个 mod 6 在那里看起来很可疑。

您还需要确保了解 H 的单位是从 0 到 360 的度数;如果您的过滤器需要 0..1,则您有更改。

关于c++ - 实现 RGBtoHSV C++,错误的 H 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com