2016-01-26 37 views
1

我想用兩個RGB值比較兩個圖像。使用RGB值比較兩張圖像。 (Java)

下面的代碼爲未過濾和已過濾的圖像提取相同的RGB值。我希望兩個圖像的值不同。 (未經過濾和過濾已預先定義)。這個想法是,兩個圖像之間的差異越大(過濾前後)越差的過濾圖像。

由於我的結果,我期望兩組不同的RGB值(1代表未過濾,1代表已過濾)。我得到兩組RGB值,但是,兩者是相同的。

我正在創建一個色盲模擬器,並且想要比較兩者的值。以下是「正常」視覺圖像和「色盲」視覺圖像的示例。

Unfiltered Image | Filtered Image

filteredImage = unfilteredImage = Img; 

...

ImageDisplay = new JLabel(new ImageIcon(filteredImage)); 

...

private void TypeButtonPressed() 
{ 
    filteredImage(GetType()); 
} 

...

int GetType() 
{ 
    int type = 0; 
    for (int i=0; i<numberOfTypes; i++) 
    { 
     JToggleButton TypeButton = TypeButtons[i]; 
     if (TypeButton.isSelected()) type = i; 
    } 

    TypeListener.SetType(type); 
    return type; 
} 

...

 BufferedImage unfiltered = unfilteredImage; 
     BufferedImage filtered = filteredImage; 

     //unfilteredImage 
     int ufwidth = unfiltered.getWidth(); 
     int ufheight = unfiltered.getHeight(); 

     Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth/2, ufheight/2)); 

     int ufred = unfilteredRGBValue.getRed(); 
     int ufgreen = unfilteredRGBValue.getGreen(); 
     int ufblue = unfilteredRGBValue.getBlue(); 

     System.out.println("Unfiltered Red: " + ufred); 
     System.out.println("Unfiltered Green: " + ufgreen); 
     System.out.println("Unfiltered Blue: " + ufblue); 

     System.out.println("Unfiltered Score: " + ufred + ufgreen + ufblue); 

     //filteredImage 
     int fwidth = filtered.getWidth(); 
     int fheight = filtered.getHeight(); 

     Color filteredRGBValue = new Color(filtered.getRGB(fwidth/2, fheight/2)); 

     int fred = filteredRGBValue.getRed(); 
     int fgreen = filteredRGBValue.getGreen(); 
     int fblue = filteredRGBValue.getBlue(); 

     System.out.println("Filtered Red: " + fred); 
     System.out.println("Filtered Green: " + fgreen); 
     System.out.println("Filtered Blue: " + fblue); 

     System.out.println("Filtered Score: " + fred + fgreen + fblue); 

謝謝!

Ed。

+2

什麼是你的問題? – khelwood

+0

當我運行代碼時,我得到了與過濾和未過濾圖像相同的RGB值。我想知道是否有人可以看到爲什麼? – eamuldowne

+0

在上面編輯你的問題,指定你想要發生的事情,以及實際發生的事情 – khelwood

回答

1

你在這裏做什麼,走的是一個像素的彩色圖像的中心是:

Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth/2, ufheight/2)) 

如果我們看的javadoc爲getRGB()方法,它說

有對於使用此方法時返回數據中的每種顏色分量,只有8位精度。

我認爲8位是一個相當小的精度,因爲jpeg格式的標準RGB圖像具有24位/像素。可能你的兩幅圖像中的中間像素並不那麼明顯。

編輯:正如邁克爾下面提到的,它是每種顏色的精度,所以應該是ENOGH。 無論如何比較圖像只有一個像素是不是一個好主意,最好採取一定數量的像素,並計算其差異的平均值或平均值。

+0

我以爲你修好了! :-(但我確定它只是使用原始圖像的RGB值,我已經使用了許多圖像,並且完全一樣。我希望能夠顯示所有代碼,因爲這是一個相當大的項目。 – eamuldowne

+0

8位<< 8位<< 8位= 24位...每個顏色分量,8位給每個組件256個顏色組合提供空間,因此你可以得到r,256,g,256和b,256位置。如果你的中間像素是黑色的......好吧...... – Tschallacka

1

你的代碼看起來可疑與

filteredImage = unfilteredImage = Img; 

對於要正確讀取的圖像,我需要看到

BufferedImage bim1=null, bim2=null; 
try { 
    bim1=ImageIO.read(new File("c:/..../image1.png")); 
    bim2=ImageIO.read(new File("c:/..../image2.png")); 
} 
catch (Exception ex) { ex.printStackTrace(); }