亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

JavaSE圖像驗證碼簡單識別程序詳解

2024-07-13 10:16:57
字體:
來源:轉載
供稿:網友

本文為大家分享了JavaSE圖像驗證碼簡單識別程序,供大家參考,具體內容如下

首先你應該對圖片進行樣本采集,然后將樣本進行灰度處理,也就是變成黑白兩色。

然后你就可以使用該類,對目標文件進行分析。具體怎么實現我覺得這個類非常清楚,就是將樣本從左都有這么橫向移動,匹配出一個合適的就將坐標調整到下個位置。 

此程序已是3年多前寫的,后來沒有在深入寫下去,圖像識別一個很深的領域,得需要很深的數學功底跟思維能力,這個java的程序效率不高,也不能識別變形的或者拉伸的圖片,但在那個年代,已經足夠用了,大家如果有更好的開源的圖像識別代碼,請務必來信交流:)

/** * 圖片解析引擎,適合做網站驗證碼的分析。 * 首先必須載入樣品,解析器將從左到右橫向掃描,發現于樣本的就自動記錄。 * 當然本程序不適合樣本不是唯一的,也就是說要識別的圖片被縮放或者坐標變動和變形本程序無法進行這樣的識別。 * 如果圖片中的顏色變化非常大,此程序可能會有問題,當然了你可以選擇一個標準的值做為轉換成0,1矩陣的標準。 *  * 樣本的制作:請將樣本轉換成灰度模式,只含有兩色最好,當然了不轉換我也幫你轉換了。 *  */import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.imageio.ImageIO;public class ImageParser {  // ------------------------------------------------------------ Private Data  // 樣本的矩陣  private static List swatches   = null;  // 樣本的值  private static List swatcheValues = null;  // 圖片文件的矩陣化  private byte[][]  targetColors;    // ------------------------------------------------------------ Test main method  public static void main(String[] args) {    // 加入樣本與其樣本對應的數值    String[] files = new String[10];    String[] values = new String[10];    for (int i = 0; i < files.length; i++){      files[i] = "D:/workspace/SZXClientAPP/res/" + i + ".jpg";      values[i] = String.valueOf(i);    }        ImageParser parse = new ImageParser(files, values);    long startime = System.currentTimeMillis();    try {      // 解析圖片      System.out.println(parse.parseValue("D:/workspace/SZXClientAPP/res/ValidateNum"));      long sincetime = System.currentTimeMillis();      System.out.println("所花時間 = " + (sincetime - startime));    } catch (Exception e) {      e.printStackTrace();    }  }  // ------------------------------------------------------------ Constructors  /**   * 載入所有樣本路徑與其樣本對應的數值   *    * @param files   */  public ImageParser(String[] files, String[] values) {    // 只允許樣本創建一次即可    if (swatches == null && swatcheValues == null) {      int fileslength = files.length;      int valueslength = values.length;      if(fileslength != valueslength){        System.out.println("樣本文件與樣本數值不匹配!請重新設置!");        return;      }      swatches = new ArrayList(fileslength);      swatcheValues = new ArrayList(valueslength);      int i = 0;      try {        for (; i < files.length; i++) {          swatches.add(imageToMatrix(files[i]));          swatcheValues.add(i, values[i]);        }      } catch (Exception e) {        System.out.println(files[i] + " can not be parsed");        e.printStackTrace();      }    }  }  public ImageParser() {    super();    if (swatches == null || swatcheValues == null) {      System.out.println("您未載入樣本,請先載入樣本!");    }  }  /**   * 解析圖片的值   *    * @param parseFilePath   *      給出圖片路徑   * @return 返回字符串   * @throws Exception   */  public String parseValue(String parseFilePath) throws Exception {    StringBuffer result = new StringBuffer();    targetColors = imageToMatrix(parseFilePath);    // printMatrix(targetColors);    int height = targetColors.length;    int targetWidth = targetColors[0].length;    int width = 0;    Iterator it = swatches.iterator();    while (it.hasNext()) {      byte[][] bytes = (byte[][]) it.next();      int templen = bytes[0].length;      if (templen > width)        width = templen;    }    // System.out.println("MaxWidth = " + width);    // System.out.println("MaxHeight = " + height);    int xTag = 0;    while ((xTag + width) < targetWidth) {      cout: {        Iterator itx = swatches.iterator();        int i = 0;        while (itx.hasNext()) {          byte[][] bytes = (byte[][]) itx.next();          byte[][] temp = splitMatrix(targetColors, xTag, 0, width, height);          // System.out.println(i++);          if (isMatrixInBigMatrix(bytes, temp)) {            xTag += width;            // System.out.println("new maxtrix: ");            // printMatrix(temp);                        result.append(swatcheValues.get(i));            break cout;          }          i++;        }        xTag++;      }    }    return result.toString();  }  // ------------------------------------------------------------ Private methods  /**   * 判斷一個矩陣是否在另外的矩陣中   *    * @param source   *      源矩陣   * @param bigMatrix   *      大的矩陣   * @return 如果存在就返回 true   */  private static final boolean isMatrixInBigMatrix(byte[][] source, byte[][] bigMatrix) {    if (source == bigMatrix)      return true;    if (source == null || bigMatrix == null)      return false;    if (source.length > bigMatrix.length)      return false;    try {      for (int i = 0; i < source.length; i++) {        if (source[i].length > bigMatrix[i].length)          return false;      }    } catch (ArrayIndexOutOfBoundsException e) {      return false;    }    int height = source.length;    int width = source[0].length;    int x = 0, y = 0;    int i = 0, j = 0;    int count = 0;    int comparecount = height * width;    for (; i < bigMatrix.length - height + 1; i++) {      for (j = 0; j < bigMatrix[i].length - width + 1; j++) {        cout: {          x = 0;          count = 0;          for (int k = i; k < height + i; k++) {            y = 0;            for (int l = j; l < width + j; l++) {              // System.out.println("bytes[" + x + "][" + y + "]"              // + " = " + source[x][y] + ", " + "other["              // + k + "][" + l + "] = " + bigMatrix[k][l]);              if ((source[x][y] & bigMatrix[k][l]) == source[x][y]) {                count++;              } else                break cout;              y++;            }            x++;          }          // System.out.println("count = " + count);          if (count == comparecount)            return true;        }      }    }    return false;  }  /**   * 切割矩陣   *    * @param source   *      源矩陣   * @param x   *      X坐標   * @param y   *      Y坐標   * @param width   *      矩陣的寬度   * @param height   *      矩陣的高度   * @return 切割后的矩陣   */  private static final byte[][] splitMatrix(byte[][] source, int x, int y, int width, int height) {    byte[][] resultbytes = new byte[height][width];    for (int i = y, k = 0; i < height + y; i++, k++) {      for (int j = x, l = 0; j < width + x; j++, l++) {        resultbytes[k][l] = source[i][j];        // System.out.println("source[" + i + "][" + j + "]" + " = " +        // source[i][j] + ", " + "resultbytes["        // + k + "][" + l + "] = " + resultbytes[k][l]);      }    }    return resultbytes;  }  /**   * 圖片轉換成矩陣數組   *    * @param filePath   *      文件路徑   * @return 返回矩陣   * @throws Exception   *       可能會拋出異常   */  private byte[][] imageToMatrix(String filePath) throws Exception {    // 讀入文件    Image image = ImageIO.read(new File(filePath));    int w = image.getWidth(null);    int h = image.getHeight(null);    BufferedImage src = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);    src.getGraphics().drawImage(image, 0, 0, null);    byte[][] colors = new byte[h][w];    for (int i = 0; i < h; i++) {      for (int j = 0; j < w; j++) {        int rgb = src.getRGB(j, i);        // 像素進行灰度處理        String sRed = Integer.toHexString(rgb).substring(2, 4);        String sGreen = Integer.toHexString(rgb).substring(4, 6);        String sBlank = Integer.toHexString(rgb).substring(6, 8);        long ired = Math.round((Integer.parseInt(sRed, 16) * 0.3 + 0.5d));        long igreen = Math.round((Integer.parseInt(sGreen, 16) * 0.59 + 0.5d));        long iblank = Math.round((Integer.parseInt(sBlank, 16) * 0.11 + 0.5d));        long al = ired + igreen + iblank;        // if (al > 127)        // System.out.print(" " + " ");        // else        // System.out.print(" " + "1");        // System.out.print(" " + (tempint > = maxint ? 0 : 1));        // System.out.println("tempInt = " + tempint);        /* 將圖像轉換成0,1 */        // 此處的值可以將來修改成你所需要判斷的值        colors[i][j] = (byte) (al > 127 ? 0 : 1);      }      // System.out.println();    }    return colors;  }  /**   * 打印矩陣   *    * @param matrix   */  private static final void printMatrix(byte[][] matrix) {    for (int i = 0; i < matrix.length; i++) {      for (int j = 0; j < matrix[i].length; j++) {        if (matrix[i][j] == 0)          System.out.print(" ");        else          System.out.print(" 1");      }      System.out.println();    }  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久| 久久精品国产69国产精品亚洲| 98精品国产自产在线观看| 成人午夜黄色影院| 91精品一区二区| 日韩精品中文字幕有码专区| 亚洲欧美日韩中文在线| 久久影视电视剧免费网站| 伊人久久综合97精品| 国产91精品不卡视频| 久久噜噜噜精品国产亚洲综合| 欧美日本国产在线| 亚洲欧美一区二区精品久久久| 成人午夜黄色影院| 九九视频这里只有精品| 国内精品视频久久| 日韩电影大片中文字幕| 国产成人精品在线| 国产精品欧美激情在线播放| 欧美成人精品h版在线观看| 美乳少妇欧美精品| 国产视频一区在线| 这里只有视频精品| 久久久久成人精品| 精品久久久久久久久久久久久久| 国模精品视频一区二区| 日韩视频亚洲视频| 欧美性猛交xxx| 国产日韩在线免费| 69久久夜色精品国产7777| 亚洲影院高清在线| 久久国产精品久久精品| 欧美国产日韩一区二区三区| 亚洲精美色品网站| 91av视频在线播放| 欧美俄罗斯乱妇| 日韩va亚洲va欧洲va国产| 欧美大肥婆大肥bbbbb| 亚洲欧美日韩直播| 成年无码av片在线| 国产午夜精品久久久| 亚洲精品乱码久久久久久金桔影视| 中文字幕久久久av一区| 国产精品久久久久久久久久东京| 91精品国产乱码久久久久久蜜臀| 日韩精品小视频| 国产香蕉精品视频一区二区三区| 国语自产精品视频在线看一大j8| 91在线视频导航| 国内免费精品永久在线视频| 亚洲女成人图区| 亚洲春色另类小说| 成人久久久久久久| 欧美激情18p| 亚洲视频一区二区三区| 欧美色欧美亚洲高清在线视频| 亚洲男人7777| 91网站免费观看| 欧美在线视频在线播放完整版免费观看| 91精品国产自产在线观看永久| 久久成人一区二区| 国产美女搞久久| 国产精品久久久av久久久| 欧美日韩在线第一页| 亚洲国产成人精品久久久国产成人一区| 久久欧美在线电影| 日韩av网址在线观看| 国产精品扒开腿做爽爽爽男男| 性视频1819p久久| 91国偷自产一区二区三区的观看方式| 亚洲精品国产综合区久久久久久久| 欧美午夜女人视频在线| 久久精视频免费在线久久完整在线看| 亚洲第一视频网站| 亚洲人成伊人成综合网久久久| 日韩综合视频在线观看| 狠狠久久五月精品中文字幕| 国产精品免费一区| 欧美在线性视频| 91av在线播放视频| 国产一区二区三区三区在线观看| 伊人亚洲福利一区二区三区| 亚洲人成网站777色婷婷| 国语自产精品视频在免费| 这里只有精品视频在线| 按摩亚洲人久久| 久久久国产精彩视频美女艺术照福利| 中文字幕在线国产精品| 超碰精品一区二区三区乱码| 亚洲成人久久久久| 91免费高清视频| 欧美电影免费观看网站| 久久久久久久久中文字幕| 日韩av电影免费观看高清| 欧美成在线视频| 久久成年人视频| 色偷偷av亚洲男人的天堂| 91精品国产91久久| 欧美成人四级hd版| 色综合久久天天综线观看| 久久久欧美精品| 欧美成人免费在线视频| 欧美综合在线第二页| 中文字幕精品国产| 少妇高潮久久久久久潘金莲| 亚洲第一视频在线观看| 国内精品模特av私拍在线观看| 欧美日韩亚洲91| 2018中文字幕一区二区三区| 亚洲色图在线观看| 日韩在线观看高清| 2019中文在线观看| 亚洲国产精品视频在线观看| 亚洲色图在线观看| 成人性生交大片免费看视频直播| 欧美性生交xxxxx久久久| 日韩有码视频在线| 久久噜噜噜精品国产亚洲综合| 青草青草久热精品视频在线观看| 欧美xxxx14xxxxx性爽| 亚洲欧洲国产伦综合| 亚洲最大的网站| 久久久91精品| 亚洲最大的网站| 久久久久久久97| 68精品久久久久久欧美| 色噜噜久久综合伊人一本| 欧美孕妇与黑人孕交| 成人a在线观看| 中文字幕日韩欧美精品在线观看| 亚洲free性xxxx护士白浆| 国产91在线视频| 国产精品第100页| 日韩中文av在线| 久久久久久久999精品视频| 欧美高清电影在线看| 欧美成人精品在线播放| 国产精品男人的天堂| 尤物九九久久国产精品的特点| 欧美精品18videos性欧美| 成人h猎奇视频网站| 久久中文字幕在线视频| 97香蕉久久超级碰碰高清版| 日韩免费在线播放| 国产精品亚洲片夜色在线| 亚洲欧美日韩精品久久亚洲区| 亚洲精品999| 国产精品黄色av| 国产精品视频网| 97视频在线观看播放| 国产精品专区h在线观看| 日韩免费观看网站| 亚洲欧美日韩一区在线| 久久激情五月丁香伊人| 91精品久久久久久久久久久久久久| 精品久久久精品| 欧美午夜www高清视频| 欧美多人爱爱视频网站| 亚洲成人三级在线| 88xx成人精品| 欧美在线视频在线播放完整版免费观看| 成人精品在线视频| 日韩精品视频在线观看免费| 性欧美xxxx交|