zoukankan      html  css  js  c++  java
  • 灰度处理

    将彩色的图片转换成黑白有很多种方法:

    1。红色转换灰度

      Bitmap desc = new Bitmap(source.Width, source.Height);

    BitmapData sourcedata = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          sourceptr += 2;
          
    byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    2。绿色转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          sourceptr += 1;
          
    byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    3。蓝色转换灰度

     Bitmap desc = new Bitmap(source.Width, source.Height);

    BitmapData sourcedata = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    4。平均转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr) = *(descptr + 1= *(descptr + 2= (byte)((*sourceptr + *(sourceptr + 1+ *(sourceptr + 2)) / 3);
                    descptr 
    += 3;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    5。加权平均转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr) = *(descptr + 1= *(descptr + 2= (byte)(*sourceptr * 0.11 + *(sourceptr + 1* 0.58 + *(sourceptr + 2* 0.31);
                    descptr 
    += 3;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);
  • 相关阅读:
    《Apache Doris在美团外卖数仓中的应用实践》
    《一文教会你如何写复杂业务的代码》
    《SOFA企业应用框架》
    《为什么阿里巴巴代码规约要求避免使用 Apache BeanUtils 进行属性的拷贝》
    《浅析VO、DTO、DO、PO的概念、区别和用处》
    Spring 注解
    《浅析VO、DTO、DO、PO的概念、区别和用处》
    dsgn_ebook
    《清华大学刘世霞“可解释机器学习的可视化分析”(附PPT)》
    《图结构的相似度度量与分类》
  • 原文地址:https://www.cnblogs.com/pennant/p/1821807.html
Copyright © 2011-2022 走看看