zoukankan      html  css  js  c++  java
  • 让你的照片更鲜艳------hsv拉伸

    如果你的照片看上去灰蒙蒙的,缺少生机,那么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...
    "));
    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 }
  • 相关阅读:
    bzoj1007: [HNOI2008]水平可见直线(单调栈)
    1264: [AHOI2006]基因匹配Match(动态规划神题)
    bzoj1433: [ZJOI2009]假期的宿舍(最大二分图匹配)
    bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)
    [ZJOI2007]矩阵游戏
    [HAOI2007]覆盖问题
    [ZJOI2008]树的统计
    [ZJOI2010]数字计数
    [HAOI2006]旅行
    [HAOI2006]数字序列
  • 原文地址:https://www.cnblogs.com/easymind223/p/3462195.html
Copyright © 2011-2022 走看看