映像的二值化,無論是理論,還是方法都很多,網上搜尋一大堆,本人水平有限,沒法完全搞清楚,只在這裡針對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。,運行效果如: