步驟一:獲取網(wǎng)頁(yè)中驗(yàn)證碼圖片的url地址
在delphi中加入一個(gè)BitBtn和一個(gè)memo以及WebBrowser控件實(shí)現(xiàn)網(wǎng)頁(yè)中驗(yàn)證碼圖片的url地址的獲取
程序如下:
procedure TForm1.BitBtn1Click(Sender: TObject); var
I:Integer;
begin
for I:=0 to WebBrowser1.OleObject.document.images.length-1 do
Memo1.Lines.Add(WebBrowser1.OleObject.document.images.item(i).href);
end;
步驟二:下載網(wǎng)頁(yè)中驗(yàn)證碼圖片到image中 在delphi中加入一個(gè)BitBtn和一個(gè)image以及WebBrowser控件,image用來(lái)顯示下載的圖片 代碼: procedure TForm1.BitBtn5Click(Sender: TObject); var i:Integer; rang:IHTMLControlRange; s:string; begin try s := (IHTMLDocument2(WebBrowser.Document).images.item('img_validatecode',EmptyParam) as IHTMLElement).getAttribute('src',0); rang:=((IHTMLDocument2(WebBrowser.Document).body as HTMLBody).createControlRange)as IHTMLControlRange; rang.add(IHTMLDocument2(WebBrowser.Document).images.item('img_validatecode',EmptyParam)as IHTMLControlElement); rang.execCommand('Copy',False,0); Image1.Picture.Assign(clipboard);//若為加入Clipbrd單元,編譯時(shí)會(huì)提示clipboard為定義 except end; end; 注意: 1、在程序的uses中必須先加入ActiveX,Clipbrd單元,其中Clipbrd不加入會(huì)造成 clipboard未定義 2、img_validatecode 為網(wǎng)頁(yè)驗(yàn)證碼圖片的id號(hào), 3、上面代碼為delphi WebBrowser中的通用代碼,使用時(shí)只需修改id號(hào)和uses中 添加單元即可使用 步驟三:image圖片的灰度處理 首先我們需要知道圖片的灰度處理是將一些彩色的驗(yàn)證碼圖片變成灰色圖片方便圖片的后續(xù)處理,這里有三種方法對(duì)圖片進(jìn)行灰色處理。 方法一:求出RGB這三個(gè)像素點(diǎn)的平均值,然后把平均值分給三個(gè)像素點(diǎn); 方法二:求每個(gè)像素點(diǎn)RGB三個(gè)分量的最大值,然后把最大值分給三個(gè)像素點(diǎn); 方法三:根據(jù)YUV的顏色空間,求出Y的值; 方法一: 代碼: procedure TForm1.BitBtn4Click(Sender: TObject); var
p: pbyteArray; //位指針
x,y: integer;//x寬,y高
Bmp: TBitmap;//位圖組件(TBitMap)
Gray: integer;//灰度值
begin
Bmp := TBitmap.Create;//建立一個(gè)TBitmap
Bmp.Assign(Form1.Image1.Picture.Bitmap);//將image圖片轉(zhuǎn)為位圖模式
Bmp.PixelFormat := pf24bit; //設(shè)為24位之彩色位圖,PixelFormat 為位圖的內(nèi)存格式和顏色深度,總共9個(gè)值
for y := 0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[y];//ScanLine方法用于獲取像素顏色值
for x:=0 to Bmp.Width-1 do
begin
Gray:=(p[3*x+2]+p[3*x+1]+p[3*x]) div 3;//3處像素點(diǎn)的平均值
p[3*x+2]:=byte(Gray);
p[3*x+1]:=byte(Gray);
p[3*x]:=byte(Gray);
end;
end;
image4.Picture.Bitmap := Bmp;
Bmp.Free;//釋放TBitmap
end;
原圖: 處理后: 方法二: 代碼: procedure TForm1.BitBtn4Click(Sender: TObject);
var
p: pbyteArray; //位指針
x,y: integer;//x寬,y高
Bmp: TBitmap;//位圖組件(TBitMap)
Gray: integer;//灰度值
begin
Bmp := TBitmap.Create;//建立一個(gè)TBitmap
Bmp.Assign(Form1.Image1.Picture.Bitmap);//將image圖片轉(zhuǎn)為位圖模式
Bmp.PixelFormat := pf24bit; //設(shè)為24位之彩色位圖,PixelFormat 為位圖的內(nèi)存格式和顏色深度,總共9個(gè)值
for y := 0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[y];//ScanLine方法用于獲取像素顏色值
for x:=0 to Bmp.Width-1 do
begin
Gray:=Max(p[3*x+2],p[3*x+1]); //使用max函數(shù)旭定義Math單元
Gray:=Max(Gray,p[3*x]);
p[3*x+2]:=byte(Gray);
p[3*x+1]:=byte(Gray);
p[3*x]:=byte(Gray);
end;
end;
image4.Picture.Bitmap := Bmp;
Bmp.Free;//釋放TBitmap
end;
方法三:運(yùn)用公式Y(jié)=0.299R+0.857G+0.113B原圖: 處理后: procedure TForm1.BitBtn4Click(Sender: TObject);
var
p: pbyteArray; //位指針
x,y: integer;//x寬,y高
Bmp: TBitmap;//位圖組件(TBitMap)
Gray: integer;//灰度值
begin
Bmp := TBitmap.Create;//建立一個(gè)TBitmap
Bmp.Assign(Form1.Image1.Picture.Bitmap);//將image圖片轉(zhuǎn)為位圖模式
Bmp.PixelFormat := pf24bit; //設(shè)為24位之彩色位圖,PixelFormat 為位圖的內(nèi)存格式和顏色深度,總共9個(gè)值
for y := 0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[y];//ScanLine方法用于獲取像素顏色值
for x:=0 to Bmp.Width-1 do
begin
Gray:=round(p[3*x+2]*0.3+p[3*x+1]*0.59+p[3*x]*0.11);//公式Y(jié)=0.299R+0.857G+0.113B
p[3*x+2]:=byte(Gray);
p[3*x+1]:=byte(Gray);
p[3*x]:=byte(Gray);
end;
end;
image4.Picture.Bitmap := Bmp;
Bmp.Free;//釋放TBitmap
end;
在對(duì)圖像二值化之前需要對(duì)圖像進(jìn)行灰度處理,二值化原理:通過(guò)設(shè)定閾值(threshold),把灰度圖像變成僅用0或1來(lái)表示圖像目標(biāo)和背景,其中圖像目標(biāo)大多為數(shù)字,字母,設(shè)為1,;背景設(shè)為0。在位圖中0對(duì)應(yīng)0,1對(duì)應(yīng)255,二值化方法很多,但是重點(diǎn)是在于對(duì)閾值的選擇。原圖: 處理后: 步驟四:image圖片的二值化 閾值的選擇主要分為兩類:全局閾值和局部閾值。
全局閾值是對(duì)整個(gè)圖像采用一個(gè)閾值進(jìn)行劃分,例如固定閾值法二值化、判斷分析化二值化等; 局部閾值是將圖像分為幾塊,每個(gè)子塊采用不同的閾值;(具體局部閾值法可以自行百度,這里不必過(guò)多解釋) 代碼: procedure TForm1.BitBtn4Click(Sender: TObject);
var
p: pbyteArray; //位指針
x,y: integer;//x寬,y高
Bmp: TBitmap;//位圖組件(TBitMap)
Gray: integer;//灰度值
begin
Bmp := TBitmap.Create;//建立一個(gè)TBitmap
Bmp.Assign(Form1.Image1.Picture.Bitmap);//將image圖片轉(zhuǎn)為位圖模式
Bmp.PixelFormat := pf24bit; //設(shè)為24位之彩色位圖,PixelFormat 為位圖的內(nèi)存格式和顏色深度,總共9個(gè)值
for y := 0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[y];//ScanLine方法用于獲取像素顏色值
for x:=0 to Bmp.Width-1 do
begin
Gray:=round(p[3*x+2]*0.3+p[3*x+1]*0.59+p[3*x]*0.11);//公式Y(jié)=0.299R+0.857G+0.113B
//圖像二值化
if Gray > 120 then//閾值為120
begin
p[3*x+2]:=255;
p[3*x+1]:=255;
p[3*x]:=255;
end
else
begin
p[3*x+2]:=0;
p[3*x+1]:=0;
p[3*x]:=0;
end;
//分割線------------------------------------- end;
end;
image4.Picture.Bitmap := Bmp;
Bmp.Free;//釋放TBitmap
end;
原圖: 處理后: 從效果圖可以看出,圖像二值化就是設(shè)定一個(gè)閾值,然后判定每點(diǎn)的RGB值大于還是小于閾值,大于則為255即黑色,小于閾值則為0即白色。 |
|