GDI+ 在Delphi程序的应用 -- 图像二值化

    技术2022-05-11  95

        图像的二值化,无论是理论,还是方法都很多,网上搜索一大堆,本人水平有限,没法完全搞清楚,只在这里针对GDI+在Delphi中如何做一般二值化处理,写一个简单例子。

        其实,这个例子在昨天本人发表的《GDI+ 在Delphi程序的应用 -- ColorMatrix与图像灰度化 》中已经给出了基本的代码,只要在其上加一个参数和一句代码就行了:

     

    // 灰度或者二值化彩色图像 procedure GrayImage(Image: TGpImage; Threshold: Single  =   0.0 ); const   ColorMatrix: TColorMatrix  =    (( 0.3 0.3 0.3 0.0 0.0 ),    ( 0.59 0.59 0.59 0.0 0.0 ),    ( 0.11 0.11 0.11 0.0 0.0 ),    ( 0.0 0.0 0.0 1.0 0.0 ),    ( 0.0 0.0 0.0 0.0 1.0 ));var  Tmp: TGpImage;  attr: TGpImageAttributes;  g: TGpGraphics;begin  Tmp : =  Image.Clone;  g : =  TGpGraphics.Create(Image);  attr : =  TGpImageAttributes.Create;   try     attr.SetColorMatrix(ColorMatrix);        // 灰度化     if  Threshold  >   0.0  then                        // 如果给出了阀值,在灰度图基础上二值化      attr.SetThreshold(Threshold );    g.DrawImage(Tmp, GpRect( 0 0 , Image.Width, Image.Height),                 0 0 , Tmp.Width, Tmp.Height, utPixel, attr);   finally     g.Free;    attr.Free;    Tmp.Free;  end;end;procedure TForm1.Button1Click(Sender: TObject);var  Image: TGpImage;  g: TGpGraphics;begin  Image : =  TGpImage.Create( ' ..mediaFRUIT.jpg ' );  g : =  TGpGraphics.Create(Handle, False);  g.DrawImage(Image,  10 10 , Image.Width, Image.Height);  GrayImage(Image,  0.5 );  g.DrawImage(Image,  220 10 , Image.Width, Image.Height);  g.Free;  image.Free;end;

        从例子可以看出,彩色图像二值化,就是在其灰度化基础上给定一个0 - 1之间的阀值,所谓阀值就是每种颜色成分的分界点。假定阈值设置为 0.7,并且假定当前所呈现的颜色中的红色、绿色和蓝色成分分别为 230、50 和 220,那么红色成分 230 大于 0.7x255,因此,红色成分将更改为 255(全亮度);绿色成分 50 小于0.7x255,因此,绿色成分将更改为 0; 蓝色成分 220 大于 0.7x255,因此,蓝色成分将更改为 255。

        由此可以看出,在正确得到灰度图图后,二值化程度的关键就在这个阀值。所以关于如何确定阀值的理论也就成立图像二值化最主要的理论。

        本例子的阀值为0.5。,运行效果如下图:

     


    最新回复(0)