灰度处理的方法主要有如下3种:

1、最大值法:使R、G、B的值等于3值中最大的一个,即:
   R=G=B=max(R,G,B)

最大值法会使形成高亮度很高的灰度图象

  1. var
  2. bitmap:tbitmap;
  3. i,j:integer;
  4. a,b,c,crgb,temp:longint;
  5. res:byte;
  6. begin
  7. //最大值灰度处理方法
  8. bitmap:=tbitmap.Create;
  9. bitmap.Width:=image1.Width+1;
  10. bitmap.Height:=image1.Height+1;
  11. for i:=0 to image1.Width+1 do
  12. begin
  13. for j:=0 to image1.Height+1 do
  14. begin
  15. crgb:=colortorgb(image1.Canvas.Pixels[i,j]);
  16. a:=crgb;
  17. b:=crgb shr 8;
  18. c:=crgb shr 8;
  19. //求出3者之间的最大值
  20. if a>b then
  21. temp:=a
  22. else temp:=b;
  23. if c>temp then
  24. temp:=c ;
  25. res:=byte(temp);
  26. bitmap.Canvas.Pixels[i,j]:=rgb(res,res,res);
  27. end;
  28. end;
  29. image1.Canvas.Draw(0,0,bitmap);
  30. bitmap.Free;
  31. end;

2、平均值方法:使R、G、B的值求出平均值,即:
R=G=B=(R+G+B)3
平均值法会形成较柔和的灰度图象。

  1. var
  2. bitmap:tbitmap;
  3. i,j:integer;
  4. crgb:longint;
  5. rr,gg,bb:byte;
  6. res:byte;
  7. begin
  8. //图象的平均值处理
  9. bitmap:=tbitmap.Create;
  10. bitmap.Width:=image1.Width;
  11. bitmap.Height:=image1.Height;
  12. for i:=0 to image1.Width+1 do
  13. begin
  14. for j:=0 to image1.Height+1 do
  15. begin
  16. crgb:=colortorgb(image1.Canvas.Pixels[i,j]);
  17. rr:=byte(crgb);
  18. gg:=byte(crgb shr 8);
  19. bb:=byte(crgb shr 8);
  20. res:=(rr+gg+bb)div 3;
  21. bitmap.Canvas.Pixels[i,j]:=rgb(res,res,res);
  22. end;
  23. end;
  24. image1.Canvas.Draw(0,0,bitmap);
  25. bitmap.Free;
  26. end;

3、加权平均值法:根据重要性或其他指标给R、G、B赋予不同的权值,并使R、G、B它们的值加权平均,即:
R=G=B=(WrR+WrG+WbB)3,经实际经验和理论推导证明,采用R=G=B=0.30*R+0.59*G+0.11*B,可以得到最合理的灰度图象

    1. var
    2. bitmap:tbitmap;
    3. i,j:integer;
    4. rr,gg,bb,res:byte;
    5. crgb:longint;
    6. begin
    7. //加权平均处理方法
    8. bitmap:=tbitmap.Create;
    9. bitmap.Width:=image1.Width+1;
    10. bitmap.Height:=image1.Height+1;
    11. for i:=0 to image1.Width+1 do
    12. begin
    13. for j:=0 to image1.Height+1 do
    14. begin
    15. crgb:=colortorgb(image1.Canvas.Pixels[i,j]);
    16. rr:=byte(crgb);
    17. gg:=byte(crgb shr 8);
    18. bb:=byte(crgb shr 8);
    19. res:=(30*rr+59*gg+11*bb)div 100;
    20. bitmap.Canvas.Pixels[i,j]:=rgb(res,res,res);
    21. end;
    22. end;
    23. image1.Canvas.Draw(0,0,bitmap);
    24. bitmap.Free;
    25. end;

http://blog.csdn.net/aroc_lo/article/details/9256077

delphi实现图象灰度处理的3种方法的更多相关文章

  1. delphi TreeView 从数据库添加节点的四种方法

    方法一:delphi中递归算法构建treeView 过程:通过读取数据库中table1的数据,来构建一颗树.table1有两个字段:ID,preID,即当前结点标志和父结点标志.所以整个树的表示为父母 ...

  2. Delphi中拖动无边框窗口的5种方法

    1.MouseMove事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POSTM ...

  3. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  4. 2015.1.25 Delphi打开网址链接的几种方法

    Delphi打开网址链接的几种方法1.使用shellapi打开系统中默认的浏览器              首先需在头部引用 shellapi单元即在uses中添加shellapi,这里我们需要知道有 ...

  5. java实现甘特图的2种方法:SwiftGantt和Jfree (转)

    http://blog.sina.com.cn/s/blog_50a7c4a601009817.html 第一种方法使用SwiftGantt实现甘特图(进度图推荐这个)   import java.a ...

  6. UML类图画法及其之间的几种关系(转)

    UML类图画法及其之间的几种关系 最近做重构项目,需要画一下类图,发现类图的画法及其之间的几种关系已经淡忘了很多,所以整理总结一下,有问题的地方大家可以一起讨论下. 文章目录如下: 类图画法 类之间的 ...

  7. Delphi中弹出提示框的四种方法

    参考:http://blog.itpub.net/8432156/viewspace-924843/ 更为详细的内容请参见:http://blog.csdn.net/akof1314/article/ ...

  8. UML类图画法及其之间的几种关系

    最近做重构项目,需要画一下类图,发现类图的画法及其之间的几种关系已经淡忘了很多,所以整理总结一下,有问题的地方大家可以一起讨论下. 文章目录如下: 类图画法 类之间的几种关系:泛化(Generaliz ...

  9. 【转】delphi程序只允许运行一个实例的三种方法:

    一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...

随机推荐

  1. CentOS的MySQL报错:Can't connect to MySQL server

    原文链接: http://www.centoscn.com/CentosBug/softbug/2015/0622/5709.html 问题描述: 使用客户端远程登录连接基于CentOS 6.5服务器 ...

  2. Java NIO--初步认识

    : 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现 一.java NIO 和阻 ...

  3. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  4. Android学习笔记:ListView简单应用--显示文字列表

    在activity中的编写如下代码: final List<String> items = new ArrayList<String>(); //设置要显示的数据,这里因为是例 ...

  5. 基于visual Studio2013解决C语言竞赛题之0418位数操作

      题目 解决代码及点评 /************************************************************************/ /* 18. 给 ...

  6. Android中如何查找内存泄露

    1.首先确定是否有内存泄露及哪个程序造成. 1.1.内存泄露已弹出out of memory对话框的情况. 这种情况很简单,直接看对话框就知道是哪个应用的问题了.然后再分析该应用是否是因为内存泄露造成 ...

  7. Asp.Net中GridView加入鼠标滑过的高亮效果和单击行颜色改变

    转载自:http://www.cnblogs.com/fly_dragon/archive/2010/09/03/1817252.html protected void GridView1_RowDa ...

  8. Sql 参数的使用

    代码片段: a)声明实例 1.声明SQLCommand实例. SqlCommand cmd = new SqlCommand(); 2.声明SqlDataAdapter实例. SqlDataAdapt ...

  9. WinForm----DataGridview---连接数据库,以及双击一条数据,显示信息到Label控件,也可以是TextBox控件。

    最终效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  10. Linux 命令整理

    一.文件目录命令 1.建立目录:mkdir 目录名 2.删除空目录:rmdir 目录名 3.无条件删除子目录: rm -rf 目录名 4.改变当前目录:cd 目录名 (进入用户home目录:cd ~; ...