标题: Delphi图像二值化分享处理 [打印本页]

作者: puimhty    时间: 2019-7-23 19:47
标题: Delphi图像二值化分享处理
图像的灰度化处理的基本原理

将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可用两种方法来实现。

第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。

第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。

二、用Delphi进行图像灰度化的实现:

procedure TForm1.BitBtn1Click(Sender: TObject);

var

  p:PByteArray;

  //PByteArray的定义格式


  //PByteArray = ^TByteArray;


  //TByteArray = array[0..32767] of Byte;


  ChangedBmp : Tbitmap;

  gray,x,y:integer;

  TestBMP : Tbitmap;   // 处理过程中位图

begin

  TestBMP:=Tbitmap.Create;

  ChangedBmp:=Tbitmap.Create;

  TestBMP.Assign(image1.Picture);

  for y := 0 to TestBMP.Height - 1 do

  begin

        //获取每一行象素信息

    p := TestBMP.scanline[y];

    for x := 0 to TestBMP.Width - 1 do

    begin

    //这里采用YUV与RGB颜色空间变换的方法,即 Y=0.3R+0.59G+0.11B

      Gray := Round(p[3 * x + 2] * 0.3 + p[3 * x + 1] * 0.59

            + p[3 * x] * 0.11);

    //由于是24位真彩色,故一个像素点为三个字节

      p[3 * x + 2] := byte(Gray);

      p[3 * x + 1] := byte(Gray);

      p[3 * x] := byte(Gray);

    //Gray的值必须在0~255之间

    end;

      ChangedBmp.Assign(TestBMP);

      PaintBox1.Canvas.CopyMode:=srccopy;

      PaintBox1.Canvas.Draw(0,0,ChangedBmp);//用PaintBox控件重新绘制图像;

  end;

三、注意事项:

程序申请了TestBMP、WillbeChangedBmp,所以在程序初始化的时候,要注意创建:

       TestBMP:=Tbitmap.Create;

ChangedBmp:=Tbitmap.Create;

     程序结束后注意要把TestBMP.Destory和ChangedBmp.Destory;










欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1