2013-11-03 260 views
0

我有一個程序,它使用getRed(),getGreen()getBlue(),它工作正常。我正在尋找是否可以找到一些其他的算法,這些算法也可以爲灰度圖像着色,不管它或多或少都是準確無誤的,它只是用來比較方法和準確性的東西。 我決定使用類似的方法,只需對圖像1,2和3使用getRed()(相對於1),並對每種顏色除以3,理論上實現3幅圖像上的平均紅色,綠色和藍色值並從中創建一個新的圖像。通過平均組合灰度圖像

生成的圖像很奇怪;顏色並不均勻,即對於每個像素都是隨機的顏色,你幾乎可以很容易地發現圖像的任何特徵,因爲它的顆粒感很強,我認爲它是描述它的最好方式。它看起來像一張普通的照片,但隨處都有彩色噪點。只是想知道是否有人知道爲什麼會發生這種情況?它不是我的意圖,並期待更爲正常,與原始方法非常相似,但每種方法可能會更柔和/明亮。

任何人都知道爲什麼會發生這種情況?它看起來不正確。除了標準getRGB()之外,還有其他方法可以用來對圖像進行着色嗎?

BufferedImage combinedImage = new BufferedImage(image1.getWidth(), image1.getHeight(), image1.getType()); 
     for(int x = 0; x < combinedImage.getWidth(); x++) 
      for(int y = 0; y < combinedImage.getHeight(); y++) 
       combinedImage.setRGB(x, y, new Color(
       new Color((image1.getRGB(x, y) + image2.getRGB(x, y) + image3.getRGB(x, y))/3).getRed(), 
       new Color((image1.getRGB(x, y) + image2.getRGB(x, y) + image3.getRGB(x, y))/3).getGreen(), 
       new Color((image1.getRGB(x, y) + image2.getRGB(x, y) + image3.getRGB(x, y))/3).getBlue()). 
       getRGB()); 

預先感謝

回答

2

的getRGB()返回一個像素的INT表示,包括alpha通道。因爲int是4個字節(32位),這個中斷將是這樣的:

01010101 11111111 10101010 11111111 
    Alpha  Red  Green Blue 

當您添加三個值,這是一個使用alpha通道太多,所以我想這是使你得到奇怪的結果。另外,以這種方式添加int會導致其中一個通道出現「溢出」。例如,如果一個像素的藍色值爲255,另一個像素的值爲2,那麼總和的值將爲綠色,值爲1。

要從int中提取每個顏色通道,可以執行此操作。

red = (rgb >> 16) & 0xFF; 
green = (rgb >>8) & 0xFF; 
blue = (rgb) & 0xFF; 

(這是什麼顏色的類內部做內getRed(),GetBlue進行()和getGreen()http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/awt/Color.java#Color.getRed%28%29

然後,結合顏色是這樣的:

combinedImage.setRGB(x, y, new Color(
((image1.getRGB(x, y) >> 16 & 0xFF) + (image1.getRGB(x, y) >> 16 & 0xFF) + (image1.getRGB(x, y) >> 16 & 0xFF))/3, 
((image1.getRGB(x, y) >> 8 & 0xFF) + (image1.getRGB(x, y) >> 8 & 0xFF) + (image1.getRGB(x, y) >> 8 & 0xFF))/3, 
((image1.getRGB(x, y) & 0xFF) + (image1.getRGB(x, y) & 0xFF) + (image1.getRGB(x, y) & 0xFF))/3). 
getRGB()); 

或者使用new Color(image1.getRGB(x, y)).getRed()每次爲每個圖像。

combinedImage.setRGB(x, y, new Color(
    (new Color(image1.getRGB(x, y)).getRed() + new Color(image2.getRGB(x, y)).getRed() + new Color(image3.getRGB(x, y)).getRed())/3, 
    (new Color(image1.getRGB(x, y)).getGreen() + new Color(image2.getRGB(x, y)).getGreen() + new Color(image3.getRGB(x, y)).getGreen())/3, 
    (new Color(image1.getRGB(x, y)).getBlue() + new Color(image2.getRGB(x, y)).getBlue() + new Color(image3.getRGB(x, y)).getBlue())/3). 
    getRGB()); 
+0

啊,這是有道理的,謝謝。當我使用你發佈的代碼時,我得到一個錯誤,說int不能被解除引用,只能按照以前的方式使它工作,對此有什麼想法?感謝您的幫助 – user2517280

+0

我通過編譯代碼更新了我的答案 – Evans

+0

非常感謝,正如我所說的,我很欣賞它。圖像是完全組合的,但是,輸出圖像只是灰色。我能想到的唯一原因是它不超過255,所以除以3時R,G,B值通常是相同的,導致灰色? – user2517280