一直以來對Java的圖形處理能力表無力,但好像又不是那么一回事,之前用php做過一些應(yīng)用,涉及到驗證碼的識別,其中有個圖片二值化的步驟,今天換成Java來實現(xiàn)下
在java的擴展包javax.imageio中為我們提供了一個類叫ImageIO,這個類提供了一些執(zhí)行簡單編碼和解碼的靜態(tài)便捷方法,具體說明大家可以翻下API看看
下面來說下關(guān)于圖片二值化的原理:
1、首先要獲取每個像素點的灰度值。
2、定義一個閥值。
3、將每個像素點的灰度值和它周圍的8個像素點的灰度值相疊加再除以9,然后和閥值進行比較。
4、大于閥值則設(shè)為黑色,小雨則為白色。
下面貼下具體代碼,注釋很全
1 import java.awt.Color; 2 import java.awt.image.BufferedImage; 3 import java.io.File; 4 import java.io.IOException; 5 6 import javax.imageio.ImageIO; 7 8 public class ImageTest { 9 10 public static void main(String[] args) throws IOException {11 String filename = "D:" + File.separator + "/123.jpg";// separator是File里的一個常量,由于java歷史遺留問題故為小寫12 File file = new File(filename);13 BufferedImage bi = ImageIO.read(file);14 // 獲取當前圖片的高,寬,ARGB15 int h = bi.getHeight();16 int w = bi.getWidth();17 int rgb = bi.getRGB(0, 0);18 int arr[][] = new int[w][h];19 20 // 獲取圖片每一像素點的灰度值21 for (int i = 0; i < w; i++) {22 for (int j = 0; j < h; j++) {23 // getRGB()返回默認的RGB顏色模型(十進制)24 arr[i][j] = getImageRgb(bi.getRGB(i, j));//該點的灰度值25 }26 27 }28 29 BufferedImage bufferedImage=new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);// 構(gòu)造一個類型為預(yù)定義圖像類型之一的 BufferedImage,TYPE_BYTE_BINARY(表示一個不透明的以字節(jié)打包的 1、2 或 4 位圖像。)30 int FZ=130;31 for (int i = 0; i < w; i++) {32 for (int j = 0; j < h; j++) {33 if(getGray(arr,i,j,w,h)>FZ){34 int black=new Color(255,255,255).getRGB();35 bufferedImage.setRGB(i, j, black);36 }else{37 int white=new Color(0,0,0).getRGB();38 bufferedImage.setRGB(i, j, white);39 }40 }41 42 }43 ImageIO.write(bufferedImage, "jpg", new File("D:"+File.separator+"new123.jpg"));44 }45 46 PRivate static int getImageRgb(int i) {47 String argb = Integer.toHexString(i);// 將十進制的顏色值轉(zhuǎn)為十六進制48 // argb分別代表透明,紅,綠,藍 分別占16進制2位49 int r = Integer.parseInt(argb.substring(2, 4),16);//后面參數(shù)為使用進制50 int g = Integer.parseInt(argb.substring(4, 6),16);51 int b = Integer.parseInt(argb.substring(6, 8),16);52 int result=(int)((r+g+b)/3);53 return result;54 }55 56 57 58 //自己加周圍8個灰度值再除以9,算出其相對灰度值 59 public static int getGray(int gray[][], int x, int y, int w, int h) 60 { 61 int rs = gray[x][y] 62 + (x == 0 ? 255 : gray[x - 1][y]) 63 + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1]) 64 + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 1]) 65 + (y == 0 ? 255 : gray[x][y - 1]) 66 + (y == h - 1 ? 255 : gray[x][y + 1]) 67 + (x == w - 1 ? 255 : gray[x + 1][ y]) 68 + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 1]) 69 + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]); 70 return rs / 9; 71 } 72 }
看下效果吧:
新聞熱點
疑難解答