• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#中实现图片灰度化技术详解

c#中实现图片灰度化技术详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#彩色图像灰度化,c#图像灰度化,c#灰度图,c#图片灰度化,c#灰度重心法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

去年买了本数字图像处理算法,一直都没有看,前几个星期都一直忙着工作上的活,趁这阶段悠闲点,玩一玩图片处理,这玩意还是非常有意思的。

以前我们在做Web上的用户注册时,通常都会做一个验证码,大家都知道用来防止暴力注册的,当然提到验证码大家都知道C#里面有一个Bitmap类专门用来处理图片的,好吧,这一篇我们从最简单的“图片灰度化”说起。

一:图片灰度化

我们都知道,位图是由一个一个像素点组成的,像素点可能是红色,橙色,粉色等等,这些颜色我们都知道是用RGB来表示的。

每个颜色分量都是一个字节(0-255),所以一般情况下图的像素点都是24位,当然还有32位,64位,当RGB是0-255之间的不同值时,那么该像素点就呈现“五颜六色”,而当RGB都是相同的值是,则像素点呈现“灰色”,如果大家玩过CSS的话,肯定都知道给一个字体的color通常都是#999999,#666666,#333333这些不同深度的灰色。

1.计算公式

下面我们该如何设置合理的灰度值呢?当然还是用当前的RGB为模板,然后对RGB乘以一个合理的权重就ok了
   Gary(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.114*B(i,j);
</div>

2.编程

有了公式,实现起来就不成问题了。Bitmap类中有一个GetPixel/SetPixel,它可以获取和设置当前的像素点。

static void Main(string[] args)
{
  Bitmap bitmap = new Bitmap(Environment.CurrentDirectory + "//1.jpg");
 
  for (int i = 0; i < bitmap.Width; i++)
  {
    for (int j = 0; j < bitmap.Height; j++)
    {
      //取图片当前的像素点
      var color = bitmap.GetPixel(i, j);
 
      var gray = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
 
      //重新设置当前的像素点
      bitmap.SetPixel(i, j, Color.FromArgb(gray, gray, gray));
    }
  }
 
  bitmap.Save(Environment.CurrentDirectory + "//2.jpg");
}
</div>

3.改进

上面这个方法很简单,Get/Set就Ok了,当然这是我们站在像素点这个角度来考虑问题的,貌似只要O(N2)的时间就可以KO问题,但是Get/Set远远不是O(1)的,基于性能考虑,我们能不能有更优的方法,此时我们可以站在字节这个角度思考,不过这里我们要注意一个问题就是:比如图片的width=21px,一个像素点占用3个字节,但是21个像素点不一定就占用63个字节,这是因为系统基于性能考虑,在每一行中存放着一个“未用区域”,来确保图片每行的byte数是4的倍数,那么如何去读某一行的字节数呢?

C#里面有一个Stride属性就可以用来获取,很简单吧。

static void Main(string[] args)
    {
      Bitmap bitmap = new Bitmap(Environment.CurrentDirectory + "//1.jpg");
 
      //定义锁定bitmap的rect的指定范围区域
      Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
 
      //加锁区域像素
      var bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
 
      //位图的首地址
      var ptr = bitmapData.Scan0;
 
      //stride:扫描行
      int len = bitmapData.Stride * bitmap.Height;
 
      var bytes = new byte[len];
 
      //锁定区域的像素值copy到byte数组中
      Marshal.Copy(ptr, bytes, 0, len);
 
      for (int i = 0; i < bitmap.Height; i++)
      {
        for (int j = 0; j < bitmap.Width * 3; j = j + 3)
        {
          var color = bytes[i * bitmapData.Stride + j + 2] * 0.299
                + bytes[i * bitmapData.Stride + j + 1] * 0.597
                + bytes[i * bitmapData.Stride + j] * 0.114;
 
          bytes[i * bitmapData.Stride + j]
               = bytes[i * bitmapData.Stride + j + 1]
               = bytes[i * bitmapData.Stride + j + 2] = (byte)color;
        }
      }
 
      //copy回位图
      Marshal.Copy(bytes, 0, ptr, len);
 
      //解锁
      bitmap.UnlockBits(bitmapData);
 
      bitmap.Save(Environment.CurrentDirectory + "//3.jpg");
    }
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#图像灰度级拉伸的方法
  • C#数字图象处理之图像灰度化方法
  • C#彩色图片灰度化算法实例
  • c#中实现图片灰度化技术详解
  • C#实现把彩色图片灰度化代码分享
  • C#灰度化图像的实例代码
  • 解析C#彩色图像灰度化算法的实现代码详解
  • 基于c#图像灰度化、灰度反转、二值化的实现方法详解

相关文章

  • 2017-05-28浅析C# 中的类型系统(值类型和引用类型)
  • 2017-05-28详解C#中使用对象或集合的初始值设定项初始化的操作
  • 2017-05-28C#递归算法之归并排序
  • 2017-05-28基于C# 生成Zip压缩包代码
  • 2017-05-28C#实现线程池的简单示例
  • 2017-05-28C#执行存储过程并将结果填充到GridView的方法
  • 2017-05-28c#图片上传和显示的实现方法
  • 2017-05-28C#中的程序集和反射介绍
  • 2017-05-28C# 设计模式系列教程-观察者模式
  • 2017-05-28浅谈C# winForm 窗体闪烁的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入Ref,Out的理解及其使用
    • C#计算器编写代码
    • c#使用process.start启动程序报错解决方法
    • C#实现写入文本文件内容的方法
    • C#实现异步发送邮件的方法
    • winform分页控件 附源码下载
    • winform下实现win7 Aero磨砂效果实现代码
    • C#通过热键控制显示器开关的方法
    • C#实现输入法功能详解
    • C#使用LINQ查询表达式的基本子句总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有