java編寫圖片灰度化處理,首先對圖片的一些知識進行補充說明。
一:圖片灰度化的處理方法:
1.最大值法(Maximum):R=G=B=Max(R,G,B),這種方法處理後灰度圖象的亮度會偏高。
2.平均值法(Average):R=G=B=(R+G+B)/3,這種方法處理後灰度圖象的亮度較柔和。
3.加權平均值法(Weighted Average):
R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分別爲R、G、B的權值。
當其權值取不同的值時,能夠形成不同灰度的灰度圖象,由於人眼對綠色的敏感度最高,紅色次之,
藍色最低,因此當wg > wr > wb時,所產生的灰度圖像更符合人眼的視覺感受。
通常wr=30%,wg=59%,wb=11%,圖像的灰度最合理。
本代碼採用的是第三種加權平均值法,具體內容我代碼中有詳細註釋.
處理前的美女圖片:
灰度化處理後的美女圖片:
下面貼出源代碼如下:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class HuiDu {
/**
* 圖片顏色的處理
* @param alpha //透明名度
* 三原色
* @param red
* @param green
* @param blue
* @return
*/
private static int colorToRGB(int alpha, int red, int green, int blue) {
/************************************************************
* 對於正數和負數在不考慮溢出的情況下,他們的運算如下: *
* 3 << 2,則是將數字3左移2位,解釋如下: *
* 左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。 *
* 即 newPixel << 8 即等於 newPixel * 2^8 *
* **********************************************************
*/
int newPixel = 0;
newPixel += alpha;
newPixel = newPixel << 8;
newPixel += red;
newPixel = newPixel << 8;
newPixel += green;
newPixel = newPixel << 8;
newPixel += blue;
return newPixel;
}
public static void main(String[] args) throws IOException {
BufferedImage bufferedImage
= ImageIO.read(new File(("C:/Users/lwp940118/Desktop" + "/123.jpg")));
//獲取到圖片的屬性信息
BufferedImage grayImage =
new BufferedImage(bufferedImage.getWidth(),
bufferedImage.getHeight(),
bufferedImage.getType());
//圖片的寬高
System.out.println("getWidth----->"+bufferedImage.getWidth());
for (int i = 0; i < bufferedImage.getWidth(); i++) {
for (int j = 0; j < bufferedImage.getHeight(); j++) {
/**------------------------------------------------------
* 得到 i,j 每個座標像素在RGB顏色模板和默認的sRGB的色彩空間 |
* color一個整數像素在默認的RGB顏色模型和默認的sRGB色彩 |
**------------------------------------------------------
*/
final int color = bufferedImage.getRGB(i, j);
/**----------------------------------------------------------
* 像素的右移 得到 三原色 |
* 顏色RGB顏色是由紅(Red)、綠(Green)、藍(Blue)三原色組成的, |
* 所以可以使用這三個顏色的組合來代表一種具體的顏色,其中R、 |
* G、B的每個數值都位於0-255之間。在表達顏色的時候, |
* 即可以使用三個數字來表達,也可以使用一個格式如0X00RRGGBB |
* 這樣格式的十六進制來表達,下面是常見顏色的表達形式: |
* red = (rgb & 0x00ff0000) >> 16 |
* 紅色:(255,0,0)或0x00FF0000 |
* green = (color & 0x0000ff00) >> 8 |
* 綠色:(0,255,0)或0x0000FF00 |
* blue = (color & 0x000000ff) |
* 藍色:(255,255,255)或0x00FFFFFF |
*-----------------------------------------------------------
*/
final int r = (color >> 16) & 0xff; //右移四位
final int g = (color >> 8) & 0xff; //右移3爲
final int b = color & 0xff;
//運用灰度處理 的方法 加權平均值
int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
//每一個像素點的灰度轉化
int newPixel = colorToRGB(255, gray, gray, gray);
grayImage.setRGB(i, j, newPixel);
}
}
File newFile = new File(("C:/Users/lwp940118/Desktop") + "/321.jpg");
ImageIO.write(grayImage, "jpg", newFile);
}
}
我最近在寫有關圖像處理的,即在圖中識別文字的算法(java版的Android版的不限),歡迎大家交流指導,如有大神指點迷津在下必當感激不盡。