#include #include<atlimage.h> #include using namespace std; class HSV { public: double H;//色度[0,360) double S;//饱和度[0,1] double V;//亮度[0,1] HSV() {} HSV(double h, double s, double v) :H(h), S(s), V(v) {} }; double getMax(double a, double b, double c) { //需要实现,返回三个参数的最大值 return max(max(a, b), c); } double getMin(double a, double b, double c) { //需要实现,返回三个参数的最小值 return min(min(a, b), c); } double getMod(double a, int b) { return a - (int)(a / b) * b; } HSV RGB2HSV(COLORREF c) { //需要实现,把 COLORREF(RGB)类对象 c 转换为 HSV 类对象,返回 double R = GetRValue(c); double G = GetGValue(c); double B = GetBValue(c); R = R / 255; G = G / 255; B = B / 255; double V = getMax(R, G, B); double S; if (V != 0) S = (V - getMin(R, G, B)) / V; else S = 0; double H; if (V == getMin(R, G, B)) H = 0; else if (V == R) H = 60 * (G - B) / (V - getMin(R, G, B)); else if (V == G) H = 120 + (60 * (B - R) / (V - getMin(R, G, B))); else if (V == B) H = 240 + (60 * (R - G) / (V - getMin(R, G, B))); if (H < 0) H = H + 360; return HSV(H, S, V); } COLORREF HSV2RGB(HSV hsv) { //需要实现,把 HSV 类对象 hsv 转换为 COLORREF(RGB)类对象,返回 double C, X, m; double R, G, B; double H = hsv.H, S = hsv.S, V = hsv.V; C = V * S; double mod = getMod(H / 60, 2); X = C * (1 - abs(mod - 1)); m = V - C; if (0 <= H && H < 60) { R = C; G = X; B = 0; } else if (60 <= H && H < 120) { R = X; G = C; B = 0; } else if (120 <= H && H < 180) { R = 0; G = C; B = X; } else if (180 <= H && H < 240) { R = 0; G = X; B = C; } else if (240 <= H && H < 300) { R = X; G = 0; B = C; } else if (300 <= H && H < 360) { R = C; G = 0; B = X; } R = round((R + m) * 255); G = round((G + m) * 255); B = round((B + m) * 255); return RGB(R, G, B); } int main() { LPCTSTR srcFilePath = _T("6.jpg"); LPCTSTR destFilePath = _T("6-ans.jpg"); CImage srcImage; srcImage.Load(srcFilePath); int width = srcImage.GetWidth(); int height = srcImage.GetHeight(); int bpp = srcImage.GetBPP(); int pitch = srcImage.GetPitch(); BYTE* pData = (BYTE*)srcImage.GetBits(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { BYTE b = *(pData + pitch * y + x * bpp / 8 + 0); BYTE g = *(pData + pitch * y + x * bpp / 8 + 1); BYTE r = *(pData + pitch * y + x * bpp / 8 + 2); COLORREF c = RGB(r, g, b); HSV h = RGB2HSV(c); if (h.V < 0.4)h.V *= 3; else if (h.V > 0.995)h.V /= 1.065;//0.939 else if (h.V > 0.99)h.V /= 1.06;//0.938 else if (h.V > 0.985)h.V /= 1.055;//0.938 else if (h.V > 0.98)h.V /= 1.05;//0.937 else if (h.V > 0.975)h.V /= 1.045;//0.937 else if (h.V > 0.97)h.V /= 1.04;//0.937 else if (h.V > 0.965)h.V /= 1.035; else if (h.V > 0.96)h.V /= 1.03; else if (h.V > 0.955)h.V /= 1.025; else if (h.V > 0.95)h.V /= 1.02; else if (h.V > 0.945)h.V /= 1.015; COLORREF ans = HSV2RGB(h); *(pData + pitch * y + x * bpp / 8 + 0) = GetBValue(ans); *(pData + pitch * y + x * bpp / 8 + 1) = GetGValue(ans); (pData + pitch * y + x * bpp / 8 + 2) = GetRValue(ans); } } srcImage.Save(destFilePath); return 0; } / 这段代码是一个简单的颜色空间转换的示例代码,它实现了将一张图片从RGB颜色空间转换为HSV颜色空间,并对亮度值进行了一些调整,然后将图片再转换回RGB颜色空间。

代码中定义了一个HSV类,包含了色度(H)、饱和度(S)和亮度(V)三个成员变量。然后定义了一些辅助函数,包括获取三个数的最大值、最小值,以及取模运算。

接下来是RGB2HSV函数,它将一个COLORREF对象转换为HSV对象。首先将RGB值归一化到[0, 1]的范围,然后根据RGB值计算HSV的各个分量。其中,亮度值V为RGB三个分量中的最大值,饱和度S根据亮度值和RGB三个分量的最小值计算得到,色度H根据RGB三个分量的比例关系计算得到。

然后是HSV2RGB函数,它将一个HSV对象转换为COLORREF对象。根据HSV的色度、饱和度和亮度值,计算出RGB颜色空间中的三个分量的值。

最后是主函数main,它使用CImage类载入并操作图片。首先获取图片的宽度、高度、位深和行间距等信息。然后使用GetBits函数获取图片的像素数据的指针,通过遍历每个像素,并使用RGB2HSV函数将其转换为HSV颜色空间。在转换过程中,对亮度值进行了一些调整。最后再使用HSV2RGB函数将图片转换回RGB颜色空间。最后保存处理后的图片。

总的来说,这段代码是一个将RGB颜色空间转换为HSV颜色空间并进行亮度调整的简单示例。 */

C++代码实现RGB转HSV颜色空间转换,并进行亮度调整

原文地址: https://www.cveoy.top/t/topic/o4Ep 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录