2015-09-22 27 views
0

我的意思是相當於AWT的BufferedImage#getType(),或其他什麼讓我寫一個簡單的isGrayscale()方法。有可能知道SWT圖像是灰度還是RGB?

我正在使用SWT,因爲我需要讀取AWT無法打開的TIF圖像。

我的目標是在任意圖像上繪製(使用顏色),如果是灰度圖,我必須首先創建一個RGB圖像並在繪製之前將B像素複製到其中。知道圖像是否已經是RGB將保存該轉換過程。


最終代碼,基於以下

Alex的解決方案,我用總體標準差爲RGB值的更精細的控制。

private static final double GRAY_LEVEL_STD_SIGMA = 2.4; 
public static boolean isShadowOfGray(RGB color) { 
    // pure shadow 
    if (color.red == color.green && color.green == color.blue) { 
     return true; 
    } 
    // Standard deviation filter 
    double mean = (color.red + color.green + color.blue)/3; 
    double std = Math.sqrt((
     Math.pow(color.red - mean, 2) + 
     Math.pow(color.green - mean, 2) + 
     Math.pow(color.blue - mean, 2))/3); 
    return (std < GRAY_LEVEL_STD_SIGMA); 
} 

順便說一句,我認爲「直接」調色板圖像永遠是RGB(它們不包含getRGBs直接值())。解決方案代碼沒有針對該類圖像的專用像素循環。

回答

1

你可以嘗試自己寫這個方法。如果圖像是灰度的,則意味着其調色板中的所有顏色具有相同的R,G,B。

public static boolean isGrayscale(Image image) { 
    ImageData data = image.getImageData(); // or new ImageData("C:\\image.bmp"); 
    RGB[] rgbs = data.getRGBs(); 
    for (int i = 0; i < rgbs.length; i++) { 
     if (!isShadowOfGray(rgbs[i])) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean isShadowOfGray(RGB color) { 
    return color.red == color.green && color.green == color.blue; 
} 

P.S.我想了一下,決定添加一些關於灰色陰影的文字。在理想世界中,灰色陰影滿足條件r == g == b。但有時(尤其是由於JPEG圖像壓縮)顏色可能會像(201,198,199)。從技術上講,它仍然是灰色的,人類無法識別這種顏色爲非灰色,但上述算法可以。因此,如果每個通道和平均值之間的絕對差值小於某個閾值,我建議計算r,g,b的平均值並將圖像檢測爲灰度。我相信閾值= 5是合理的。

相關問題