驗證碼識別處理--基於java(二)
阿新 • • 發佈:2019-01-02
先給出要處理的驗證碼地址(地址後面為隨機數字,便於生成不同的驗證碼)
http://vote.sun0769.com/include/ ... 1025&rid=866359
(圖示應該為bmp的,因為論壇限制,給存為jpg格式上傳了)
看到此驗證碼,開始想到的步驟就是二值化、去幹擾線,分割字元,在做樣品對比
但在用畫圖開啟多個驗證碼圖片後有新的想法
(放大到800%,開啟網格線,因論壇圖片限制,左右兩側空白有剪下掉,實際上就是看到每個單元格就是一個畫素點)
觀察影象後發現,只有0~9共10個數字,且無變形無偏斜,在多個驗證碼中都保持大小一致,驗證碼中字型顏色和干擾線顏色一致,且和背景色對比鮮明
如果把10個數字裁剪下來,然後將每個數字對應字元點陣和驗證碼圖象中字元點陣匹配畫素進行對比,可按百分比或完全一致來判斷每個數字在驗證碼中是否存在及存在的座標點位置,這樣可無視干擾線存在
以下是程式碼
http://vote.sun0769.com/include/ ... 1025&rid=866359
(圖示應該為bmp的,因為論壇限制,給存為jpg格式上傳了)
看到此驗證碼,開始想到的步驟就是二值化、去幹擾線,分割字元,在做樣品對比
但在用畫圖開啟多個驗證碼圖片後有新的想法
(放大到800%,開啟網格線,因論壇圖片限制,左右兩側空白有剪下掉,實際上就是看到每個單元格就是一個畫素點)
觀察影象後發現,只有0~9共10個數字,且無變形無偏斜,在多個驗證碼中都保持大小一致,驗證碼中字型顏色和干擾線顏色一致,且和背景色對比鮮明
如果把10個數字裁剪下來,然後將每個數字對應字元點陣和驗證碼圖象中字元點陣匹配畫素進行對比,可按百分比或完全一致來判斷每個數字在驗證碼中是否存在及存在的座標點位置,這樣可無視干擾線存在
以下是程式碼
-
import inet.http;
-
import soImage;
-
import console;
-
math.randomize();
-
//建立影象
-
var img1 = soImage();
-
var img2 = soImage();
-
//記憶體載入影象檔案
-
img2.setBytes(
-
inet.http().get("http://vote.sun0769.com/include/captcha.asp?s=signup1025&rid="++math.random(100000,999999))
-
,"*.bmp"
-
);
-
img2.paint();
-
//首先計算出圖片的高度寬度
-
var w2 = img2.getWidth();
-
var h2 = img2.getHeight();
-
//遍歷影象中的所有點,將驗證碼字型改為黑色(畫素點是從0開始的)
-
for(o=0;w2-1;1){
-
for(p=0;h2-1;1){
-
if(img2.getPixel(o,p)!=15527662 and img2.getPixel(o,p)!=14679807) {
-
img2.setPixel(o,p,0);//黑色
-
}
-
}
-
}
-
var tab={};
-
for(x=0;9;1){
-
img1.load(io.fullpath("/res/"++x++".bmp"));
-
var w1 = img1.getWidth();
-
var h1 = img1.getHeight();
-
//將img1中黑色字型位置寫入到陣列中,便於和img2影象對比
-
var tab1={};
-
for(i=0;w1-1;1){
-
for(j=0;h1-1;1){
-
if(img1.getPixel(i,j)==0){
-
table.push(tab1,{i;j})
-
}
-
}
-
}
-
//對比黑點,以左上角的座標點為參考,滿足完全重合條件的座標點記錄到tab2中
-
var tab2={};
-
for(m=0;w2-w1;1){
-
for(n=0;h2-h1;1){
-
for(k=1;#tab1;1){
-
if(img2.getPixel(m+tab1[k][1]-1,n+tab1[k][2]-1)!=0 and k<#tab1){
-
break 1;
-
}
-
elseif(img2.getPixel(m+tab1[#tab1][1]-1,n+tab1[#tab1][2]-1)==0 and k==#tab1){
-
table.push(tab2,{m;n})
-
}
-
}
-
}
-
}
-
if(#tab2>=1){
-
for(z=1;#tab2;1){
-
table.push(tab,{x;tab2[z][1]})
-
}
-
}
-
}
-
//按座標點的X軸大小重新排序
-
table.sort(tab,function(b){
-
return owner[2] < b[2]
-
});
-
var captcha='';
-
for(y=1;#tab;1){
-
captcha = captcha ++tab[y][1];
-
}
- console.log(captcha)