如果你的照片看上去灰蒙蒙的,缺少生机,那么hsv拉伸也许可以帮你的忙。hsv拉伸是一种可以提高图像鲜艳程度的图像增强方法,它能够让图像的颜色更加鲜活、艳丽,而且它的处理结果看上去很自然,比如源图中较暗的红色会变的鲜红,而不会像拉伸对比度那样把图像弄的难看失真,暗红色变的发紫发黑。
来个例子:

其基本原理如下:
1、 将源图像的(rgb)颜色空间映射到(hsv ),什么是HSV?
2、 对图像的s和v通道进行一次min-max normalize,h通道不变
所谓min-max normalize是指: dst(x,y) = [src(x,y) – min(src(x,y)) ] / [ (max(src(x,y)) – min(src(x,y)) ]
hsv拉伸处理后,图像不失真的关键因素就是h通道不变,即图像的色相与源图一致
3、 将新的(h s' v')映射回(rgb)
下面是gimp给出的源码(只贴出关键部分):
1 typedef struct { //用来存放最大最小值的结构体
2 double shi;
3 double slo;
4 double vhi;
5 double vlo;
6 } AutostretchData;
7
8 static void //找到最大最小值
9 find_max (guchar *src, gint bpp, AutostretchData *data)
10 {
11 double h, s, v;
12
13 gimp_rgb_to_hsv4(src, &h, &s, &v);
14 if (s > data->shi) data->shi = s;
15 if (s < data->slo) data->slo = s;
16 if (v > data->vhi) data->vhi = v;
17 if (v < data->vlo) data->vlo = v;
18 }
19
20 static void //关键函数!
21 autostretch_hsv_func (guchar *src, guchar *dest, gint bpp,
22 AutostretchData *data)
23 {
24 double h, s, v;
25
26 gimp_rgb_to_hsv4(src, &h, &s, &v);
27 if (data->shi != data->slo)
28 s = (s - data->slo) / (data->shi - data->slo); //关键语句
29 if (data->vhi != data->vlo)
30 v = (v - data->vlo) / (data->vhi - data->vlo); //关键语句
31 gimp_hsv_to_rgb4(dest, h, s, v);
32
33 if (bpp == 4)
34 dest[3] = src[3];
35 }
36
37 static void
38 indexed_autostretch_hsv (gint32 image_ID)
39 {
40 guchar *cmap;
41 AutostretchData data = {0.0, 1.0, 0.0, 1.0};
42 gint ncols, i;
43
44 cmap = gimp_image_get_colormap (image_ID, &ncols);
45
46 if (!cmap)
47 {
48 g_message (_("autostretch_hsv: cmap was NULL! Quitting...\n"));
49 gimp_quit ();
50 }
51
52 for (i = 0; i < ncols; i++)
53 {
54 find_max (&cmap[i * 3], 3, &data);
55 }
56
57 for (i = 0; i < ncols; i++)
58 {
59 autostretch_hsv_func (&cmap[i * 3], &cmap[i * 3], 3, &data);
60 }
61
62 gimp_image_set_colormap (image_ID, cmap, ncols);
63 }
来源:https://www.cnblogs.com/easymind223/p/3462195.html