delphi实现图象灰度处理的3种方法

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

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

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

[delphi] view plain copy
 
 print?
  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:=to image1.Width+do  
  12.  begin  
  13.   for j:=to image1.Height+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
平均值法会形成较柔和的灰度图象。

[delphi] view plain copy
 
 print?
  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:=to image1.Width+do  
  13.  begin  
  14.   for j:=to image1.Height+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,可以得到最合理的灰度图象

[delphi] view plain copy
 
 print?
    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:=to image1.Width+do  
    12.  begin  
    13.    for j:=to image1.Height+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

原文地址:https://www.cnblogs.com/findumars/p/5400233.html