图像的二值化,无论是理论,还是方法都很多,网上搜索一大堆,本人水平有限,没法完全搞清楚,只在这里针对GDI+在Delphi中如何做一般二值化处理,写一个简单例子。
其实,这个例子在昨天本人发表的《GDI+ 在Delphi程序的应用 -- ColorMatrix与图像灰度化》中已经给出了基本的代码,只要在其上加一个参数和一句代码就行了:
// 灰度或者二值化彩色图像
procedureGrayImage(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;
procedureTForm1.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;
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;
procedureTForm1.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。,运行效果如下图:
本文介绍在Delphi中使用GDI+进行图像二值化的方法,通过设置灰度化后的阀值来实现彩色图像的二值化处理。文章提供了具体的代码实例,演示了如何通过调整0到1之间的阀值来改变二值化的程度。
4231

被折叠的 条评论
为什么被折叠?



