如果你的照片看上去灰蒙蒙的,缺少生機,那么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 }