zoukankan      html  css  js  c++  java
  • 判断位图是否是黑白图片

    图片对象:经过处理过的jpg格式的位图(头像照片)

    算法原理:

    通过每个像素点的RGB值来进行判断。我们知道,位图都是由像素点构成的,每个像素点都有一个 RBG值,所以可以通过RGB值来判断图片是否是黑白的。

    【RGB】:R代表红,G代表绿,B代表蓝,通过三原色原理来形成丰富多彩的颜色。

    初步思路:

    1、纯黑白图片,只有判断像素点的颜色是黑还是白就可以了,一旦遇到非黑白颜色,就可以认为是非黑白图片。

    2、灰阶黑白图片,由于有灰阶,所以不是能通过像素点是否是黑白来判断,但是灰阶像素点的RGB有个特点:【R=G=B】

    算法优化:

    1、纯黑白,只有白黑二色,白色RGB【R=G=B=255】,黑色【R=G=B=0】;

    2、灰阶,RGB【R=G=B】;

    可以看出无论是黑白还是灰阶都是RGB中【R=G=B】

    遇到问题:

    有些可以认为是黑白图片,存在偏绿或者偏红的情况,用【R=G=B】无法判断出来。

    解决思路:

    虽然这些图片【R<>B<>G】但是颜色大体一致都是靠近灰阶颜色,所以R,G,B的差值应该不是很大,经过我自己测试,发现这种【有偏色的黑白照片】图片中的所有像素点的R,G,B差值绝对最大值不超过50(R-G,R-B,G-B),而彩色图片中的R,B,G差值存在绝对值最大值存在超过 50的像素点。

    简单来说就是:

    1、【自定义】色偏值 Diff = Max(|R-G|,|R-B|,|G-B|);

    2、黑白图片所有图片中最大的 Diff < 50;

     【P.S:这个算法可能存在误差,严格意义上来说R=G=B,Diff=0才对。】

    具体实现:

    /// <summary>  
    /// 判断图片是否是黑白  
    /// </summary>  
    /// <param name="filename">图片文件路径</param>  
    /// <returns></returns>  
    public bool isBlackWhite(string filename) 
    { 
       Color c = new Color(); 
     
       using (Bitmap bmp = new Bitmap(filename)) 
       { 
          //遍历图片的像素点  
          for (int y = 0; y < bmp.Height; y++) 
          { 
             for (int x = 0; x < bmp.Width; x++) 
             { 
                 c = bmp.GetPixel(x, y); 
     
                 //判断像素点的色偏差值Diff  
                 if (GetRGBDiff(c.R, c.G, c.B) > 50) 
                 { 
                   return false; 
                 } 
              } 
           } 
           return true; 
        } 
    } 
     
    public int GetRGBDiff(int r,int g,int b) 
    { 
        //略,很简单的,就是取r-g,r-b,g-b绝对值的最大值。  
    } 
    
    /// <summary>
    /// 判断图片是否是黑白
    /// </summary>
    /// <param name="filename">图片文件路径</param>
    /// <returns></returns>
    public bool isBlackWhite(string filename)
    {
       Color c = new Color();
    
       using (Bitmap bmp = new Bitmap(filename))
       {
           //遍历图片的像素点
           for (int y = 0; y < bmp.Height; y++)
           {
              for (int x = 0; x < bmp.Width; x++)
              {
                 c = bmp.GetPixel(x, y);
    
                 //判断像素点的色偏差值Diff
                 if (GetRGBDiff(c.R, c.G, c.B) > 50)
                 {
                   return false;
                 }
              }
           }
           return true;
        }
    }
    
    public int GetRGBDiff(int r,int g,int b)
    {
        //略,很简单的,就是取r-g,r-b,g-b绝对值的最大值。
    }    
  • 相关阅读:
    import nonWPF types into the markup
    using放在namespace里面还是外面?
    WCF Contracts
    Properties Specific to RoutedEventArgs
    sql将浮点表示的日期转化为标准日期
    Debug into WCF ServiceReference
    让form自适应高度
    Qt Access violation code c0000005 debug write access violation
    C++支持多态的几种方法
    java on CentOS
  • 原文地址:https://www.cnblogs.com/a7265813/p/3421438.html
Copyright © 2011-2022 走看看