2016-01-30 233 views
1

我非常適合數字圖像處理和編程的初學者。我正在嘗試使用光柵來查找圖像的平均值。說實話,這是在黑暗中真正的刺,但我真的迷失在這裏做什麼。查找圖像Java的平均值

我的代碼目前沒有返回任何內容,我不確定它是否甚至在做任何事情。我對它正在做什麼的解釋是,讀取圖像文件,然後使用柵格根據高度和寬度共同提取該圖像的細節。我希望它能夠在控制檯上輸出平均值。

所以有人可以告訴我我做錯了什麼,爲什麼我的代碼沒有返回圖像的意思?我一直在挖掘資源來嘗試和學習,但與圖像處理相關的任何東西似乎都不適合新手,而且我發現它很難。因此,如果任何人有任何可以開始的地方,我們將不勝感激。

最終,我想計算一個圖像上的平均值,然後我想要針對其他圖像的文件目錄運行該圖像。這一點就是根據平均值查看哪些圖像最相似。但我覺得我有點偏離自己想去的地方。

這裏是我的代碼

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.awt.image.Raster; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class calculateMean { 

static BufferedImage image; 
static int width; 
static int height; 
public static void main(String[] args) throws Exception{ 
    try{ 
     File input = new File("C:\\Users\\cbirImages\\jonBon2.jpg"); 
     image = ImageIO.read(input); 
     width = image.getWidth(); 
     height = image.getHeight(); 
}catch (Exception c){} 
} 

private double sum; 

public double imageToCalculate(){ 
    int count = 0; 
    for(int i=0; i<height; i++){ 

    for(int j=0; j<width; j++){ 
     count++; 
     Raster raster = image.getRaster(); 
     double sum = 0.0; 

     for (int y = 0; y < image.getHeight(); ++y){ 
      for (int x = 0; x < image.getWidth(); ++x){ 
      sum += raster.getSample(x, y, 0); 
      } 
     } 
     return sum/(image.getWidth() * image.getHeight()); 

     } 
} 
    System.out.println("Mean Value of Image is " + sum); 
    return sum; 

} 

}

+0

感謝您的寶貴意見@gpasch – user1167596

+0

您在哪裏調用imageToCalculate方法? –

回答

1

你在你的方法imageToCalculate經過的所有像素的兩倍。這個簡單的代碼就足以計算圖像的平均:

for (int y = 0; y < image.getHeight(); ++y) 
    for (int x = 0; x < image.getWidth(); ++x) 
     sum += raster.getSample(x, y, 0) ; 
return sum/(image.getWidth() * image.getHeight()); 

但通常情況下,最好是給圖像作爲方法的參數:

public double Average(BufferedImage image) 

併爲最終目的的項目,平均無法給你一個好的結果。假設您有兩個圖像:第一個像素爲127,第二個像素爲0,另一個像素爲255。

+1

完美的答案,謝謝:) :) – user1167596

+0

有沒有其他方式做到這一點?我已經實現了這一點,但是我已經面臨改善的挑戰。有任何想法嗎?我不知道其他計算平均值比上述。 – user1167596

+0

兩種解決方案。 1 /在Java中最快的是使用DataBuffer(image.getRaster()。getDataBuffer()),因爲您可以直接訪問像素而不使用Raster。 2 /使用JNI來調用C/C++函數。速度要快得多,特別是如果您的映像很大並且使用OpenMP。 – FiReTiTi