程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java若何完成圖象灰度化

詳解Java若何完成圖象灰度化

編輯:關於JAVA

詳解Java若何完成圖象灰度化。本站提示廣大學習愛好者:(詳解Java若何完成圖象灰度化)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java若何完成圖象灰度化正文


24位黑色圖與8位灰度圖

起首要先引見一下24位黑色圖象,在一個24位黑色圖象中,每一個像素由三個字節表現,平日表現為RGB。平日,很多24位黑色圖象存儲為32位圖象,每一個像素過剩的字節存儲為一個alpha值,表示有特別影響的信息[1]。

在RGB模子中,假如R=G=B時,則黑色表現一種灰度色彩,個中R=G=B的值叫灰度值,是以,灰度圖象每一個像素只需一個字節寄存灰度值(又稱強度值、亮度值),灰度規模為0-255[2]。如許就獲得一幅圖片的灰度圖。

幾種灰度化的辦法

     1、重量法:應用RGB三個重量中的一個作為灰度圖的灰度值。

     2、最值法:應用RGB三個重量中最年夜值或最小值作為灰度圖的灰度值。

     3、均值法:應用RGB三個重量的均勻值作為灰度圖的灰度值。

     4、加權法:因為人眼色彩敏感度分歧,按下必定的權值對RGB三重量停止加權均勻能獲得較公道的灰度圖象。普通情形依照:Y = 0.30R + 0.59G + 0.11B。

[注]加權法現實上是取一幅圖片的亮度值作為灰度值來盤算,用到了YUV模子。在[3]中會發明作者應用了Y = 0.21 * r + 0.71 * g + 0.07 * b來盤算灰度值(明顯三個權值相加其實不等於1,能夠是作者的毛病?)。現實上,這類差異應當與能否應用伽馬校訂有關[1]。

一種Java完成灰度化的辦法

假如你搜刮“Java完成灰度化”,十有八九都是一種辦法(代碼):

public void grayImage() throws IOException{
 File file = new File(System.getProperty("user.dir")+"/test.jpg");
 BufferedImage image = ImageIO.read(file);
  
 int width = image.getWidth(); 
 int height = image.getHeight(); 
  
 BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
 for(int i= 0 ; i < width ; i++){ 
  for(int j = 0 ; j < height; j++){ 
  int rgb = image.getRGB(i, j); 
  grayImage.setRGB(i, j, rgb); 
  } 
 } 
  
 File newFile = new File(System.getProperty("user.dir")+"/method1.jpg"); 
 ImageIO.write(grayImage, "jpg", newFile); 
}

test.jpg的原圖為:

應用上述辦法獲得的灰度圖:

看到這幅灰度圖,仿佛還真是可行,然則假如我們應用opencv來完成灰度化或應用PIL(Python),你會發明後果相差很年夜:

img = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imwrite('PythonMethod.jpg', gray)

可以清晰的看到,應用opencv(PIL也是一樣的)獲得的灰度圖要比下面Java辦法獲得的辦法好許多,許多細節都可以或許看獲得。這解釋,網上這類風行的辦法一向都存在這某種成績,只是一向被疏忽。

opencv若何完成灰度化

假如讀過opencv相干的書本或代碼,年夜概都能曉得opencv灰度化應用的是加權法,之所以說是年夜概,由於我們不曉得為何opencv灰度化的圖象如斯的好,能否有其他的處置細節被我們疏忽了?

驗證我們的料想很簡略,只需檢查像素值灰度化前後的變更就曉得了,可以以下測試:

img = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
h, w = img.shape[:2]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
for j in range(w):
 for i in range(h):
  print str(i) + " : " + str(j) + " " + str(gray[i][j])
print img[h-1][w-1][0:3]

以下打印了這麼多像素點,我們也很難斷定,然則我們只需存眷一下最初一個像素點,就可以夠發明眉目: 原圖最初的像素點RGB值為44,67,89,而灰度化以後的值為71。正好相符加權法盤算的灰度值。假如你檢討之前用Java灰度化的圖片的像素值,你會發明不只僅像素值不相符這個公式,乃至相差甚遠。

到此,我們猜想opencv(也包含PIL)是應用加權法完成的灰度化。

Java完成加權法灰度化

假如網上那段風行的辦法不可,我們該若何應用Java完成灰度化?現實上[3]曾經勝利的完成了(多種辦法的)灰度化(本國友人弄技巧照樣很給力的),在此僅僅提取需要的代碼:

private static int colorToRGB(int alpha, int red, int green, int blue) {
 
  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(System.getProperty("user.dir" + "/test.jpg"));
 BufferedImage grayImage = 
  new BufferedImage(bufferedImage.getWidth(), 
       bufferedImage.getHeight(), 
       bufferedImage.getType());
   
  
 for (int i = 0; i < bufferedImage.getWidth(); i++) {
  for (int j = 0; j < bufferedImage.getHeight(); j++) {
   final int color = bufferedImage.getRGB(i, j);
   final int r = (color >> 16) & 0xff;
   final int g = (color >> 8) & 0xff;
   final int b = color & 0xff;
   int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);;
   System.out.println(i + " : " + j + " " + gray);
   int newPixel = colorToRGB(255, gray, gray, gray);
   grayImage.setRGB(i, j, newPixel);
  }
 }
 File newFile = new File(System.getProperty("user.dir") + "/ok.jpg");
 ImageIO.write(grayImage, "jpg", newFile);
}

下面的代碼會打印出灰度化後的像素值,假如再與下面的Python代碼做比較,你會發明像素值完整的對應上了。colorToRGB辦法中對黑色圖的處置正好是4個字節,個中之一是alpha參數(前文所講),下圖是這段代碼灰度化後的圖象:

關於其他辦法,順次同理可得。

總結

本文的成因本是願望應用Java完成幾種灰度化操作,並應用opencv來驗證轉化的對錯,但在現實測試中發明了一些成績(轉化後的圖片有差別,和若何在轉化後依據灰度值生成灰度圖等成績),並就此停止了必定的思慮與驗證。這裡須要留意的是,網上的一些文章或多或少沒有做更進一步的思慮(乃至許多都是照搬,特別是國際的文章),而關於這些現實成績,著手完成並驗證長短常主要的辦法。願望本文的內容對年夜家能有所贊助。假如有疑問可以留言評論辯論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved