zoukankan      html  css  js  c++  java
  • 图象处理算法(九)

    九、色调
      此例中需要使用HSL(色调、饱和度、亮度)类来进行转换,以下是HSL与RGB类之间的定义与转换。
      HSL类代码:
      1    /// <summary>
      2    /// HSL类
      3    /// </summary>

      4    public class HSL
      5    {
      6        public int        Hue;
      7        public double    Saturation;
      8        public double    Luminance;
      9
     10        public HSL()
     11        {
     12        }

     13
     14        /// <summary>
     15        /// 转换到RGB
     16        /// </summary>
     17        /// <returns></returns>

     18        public RGB ToColor()
     19        {
     20            if ( this.Saturation == 0 )
     21            {
     22
     23                return new RGB((byte)( this.Luminance * 255 ));
     24            }

     25            else
     26            {
     27                double    v1, v2;
     28                double    hue = (doublethis.Hue / 360;
     29
     30                v2 = ( this.Luminance < 0.5 ) ?
     31                    ( this.Luminance * ( 1 + this.Saturation ) ) :
     32                    ( ( this.Luminance + this.Saturation ) - ( this.Luminance * this.Saturation ) );
     33                v1 = 2 * this.Luminance - v2;
     34
     35                byte Red    = (byte)( 255 * Hue_2_RGB( v1, v2, hue + ( 1.0 / 3 ) ) );
     36                byte Green    = (byte)( 255 * Hue_2_RGB( v1, v2, hue ) );
     37                byte Blue    = (byte)( 255 * Hue_2_RGB( v1, v2, hue - ( 1.0 / 3 ) ) );
     38                return new RGB(Red, Green, Blue);
     39            }
            
     40        }

     41
     42        /// <summary>
     43        /// 从RGB获取
     44        /// </summary>
     45        /// <param name="rgb"></param>

     46        public void FormRGB(RGB rgb)
     47        {
     48            double    r = ( rgb.Red   / 255.0 );
     49            double    g = ( rgb.Green / 255.0 );
     50            double    b = ( rgb.Blue  / 255.0 );
     51
     52            double    min = Math.Min( Math.Min( r, g ), b );
     53            double    max = Math.Max( Math.Max( r, g ), b );
     54            double    delta = max - min;
     55
     56            this.Luminance = ( max + min ) / 2;
     57
     58            if ( delta == 0 )
     59            {
     60                this.Hue = 0;
     61                this.Saturation = 0.0;
     62            }

     63            else
     64            {
     65                this.Saturation = ( this.Luminance < 0.5 ) ? ( delta / ( max + min ) ) : ( delta / ( 2 - max - min ) );
     66
     67                double    del_r = ( ( ( max - r ) / 6 ) + ( delta / 2 ) ) / delta;
     68                double    del_g = ( ( ( max - g ) / 6 ) + ( delta / 2 ) ) / delta;
     69                double    del_b = ( ( ( max - b ) / 6 ) + ( delta / 2 ) ) / delta;
     70                double    hue;
     71
     72                if ( r == max )
     73                    hue = del_b - del_g;
     74                else if ( g == max )
     75                    hue = ( 1.0 / 3 ) + del_r - del_b;
     76                else
     77                    hue = ( 2.0 / 3 ) + del_g - del_r;
     78
     79                if ( hue < 0 )
     80                    hue += 1;
     81                if ( hue > 1 )
     82                    hue -= 1;
     83
     84                this.Hue = (int) ( hue * 360 );
     85            }

     86        }

     87
     88        private double Hue_2_RGB(double v1, double v2, double vH)
     89        {
     90            if ( vH < 0 )
     91                vH += 1;
     92            if ( vH > 1 )
     93                vH -= 1;
     94            if ( ( 6 * vH ) < 1 )
     95                return ( v1 + ( v2 - v1 ) * 6 * vH );
     96            if ( ( 2 * vH ) < 1 )
     97                return v2;
     98            if ( ( 3 * vH ) < 2 )
     99                return ( v1 + ( v2 - v1 ) * ( ( 2.0 / 3 ) - vH ) * 6);
    100            return v1;
    101        }

    102
    103        public HSL(int hue, double saturation, double luminance)
    104        {
    105            this.Hue        = hue;
    106            this.Saturation    = saturation;
    107            this.Luminance    = luminance;
    108        }

    109    }
      RGB类代码:
     1    public class RGB
     2    {
     3        public byte    Red;
     4        public byte Green;
     5        public byte Blue;
     6
     7        public System.Drawing.Color Color
     8        {
     9            get return Color.FromArgb(Red, Green, Blue); }
    10            set
    11            {
    12                Red        = value.R;
    13                Green    = value.G;
    14                Blue    = value.B;
    15            }

    16        }

    17
    18        public RGB()
    19        {
    20        }

    21
    22        public RGB(byte red, byte green, byte blue)
    23        {
    24            this.Red    = red;
    25            this.Green    = green;
    26            this.Blue    = blue;
    27        }

    28
    29        public RGB(System.Drawing.Color color)
    30        {
    31            this.Red    = color.R;
    32            this.Green    = color.G;
    33            this.Blue    = color.B;
    34        }

    35
    36        public RGB(byte Value)
    37        {
    38            this.Red    = Value;
    39            this.Green    = Value;
    40            this.Blue    = Value;
    41        }

    42    }
      实现代码:
     1        public static bool Hue(Bitmap b, int Value)
     2        {
     3            if(Value < 0 || Value > 360)return false;
     4            BitmapData bmData = b.LockBits(new Rectangle(00, b.Width, b.Height), 
     5                ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
     6            int stride = bmData.Stride;
     7            System.IntPtr Scan0 = bmData.Scan0;
     8            unsafe
     9            {
    10                byte * p = (byte *)(void *)Scan0;
    11                int nOffset = stride - b.Width*3;
    12                for(int y=0;y<b.Height;++y)
    13                {
    14                    for(int x=0; x < b.Width; ++x )
    15                    {
    16                        RGB rgb = new RGB(p[2], p[1], p[0]);
    17                        HSL hsl = new HSL();
    18                        hsl.FormRGB(rgb);
    19                        hsl.Hue = Value;
    20                        rgb = hsl.ToColor();
    21                        p[0= rgb.Blue;
    22                        p[1= rgb.Green;
    23                        p[2= rgb.Red;
    24                        p += 3;
    25                    }

    26                    p += nOffset;
    27                }

    28            }

    29            b.UnlockBits(bmData);
    30            return true;
    31        }
  • 相关阅读:
    sscanf()
    分享:Python字符编码详解
    STL priority_queue使用
    google maps 控件controller
    Google Maps Overlays叠加层
    java JDBC配置和使用
    转:总结java的interface和abstract class
    java 多线程 之 生产者和消费者
    一个简单的marker和infowindow
    java Nested Classes
  • 原文地址:https://www.cnblogs.com/faib/p/664582.html
Copyright © 2011-2022 走看看