2010-10-28 93 views
2

我試圖使用這些算法中的一個在RGB圖像轉換爲灰度級:如何申請,從彩色圖像轉換爲灰度算法到Android?

明度方法平均最突出的和最不突出的顏色: (MAX(R,G,B)+分鐘( R,G,B))/ 2。

平均方法簡單地平均化的值:(R + G + B)/ 3。

用於光度的公式是0.21 R + 0.71 G + 0.07 B.

但我得到非常奇怪的結果!我知道還有其他方法可以實現這一目標,但這樣做有可能嗎?

下面是代碼:

for(int i = 0 ; i < eWidth*eHeight;i++){ 
     int R = (pixels[i] >> 16) ;  //bitwise shifting 
     int G = (pixels[i] >> 8) ; 
     int B = pixels[i] ; 
     int gray = (R + G + B)/ 3 ; 
     pixels[i] = (gray << 16) | (gray << 8) | gray ; 
} 
+1

你從哪兒得到這些數字?應該是0.299 R'+ 0.587 G'+ 0.114 B' – EboMike 2010-10-28 18:15:02

+1

@EboMike,這些是HDTV使用的新版本的常量:http://en.wikipedia.org/wiki/YUV#BT.709_and_BT.601但是我認爲G應該是0.72而不是0.71。 – 2010-10-28 18:55:14

+0

@EboMike,我發現這個博客上的數字:http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/ – Tony 2010-10-28 20:34:03

回答

2

您需要去掉不屬於您所獲得組件的位,特別是如果在班次中有任何符號擴展。

int R = (q[i] >> 16) & 0xff ;  //bitwise shifting 
    int G = (q[i] >> 8) & 0xff ; 
    int B = q[i] & 0xff ; 
1

你做什麼看起來還好吧我..

我曾經這樣做,在Java中,在幾乎相同的方式。 獲取RGB的0-255色值的平均值,以獲得灰度,並且看起來很像您的。

public int getGray(int row, int col) throws Exception 
{ 
    checkInImage(row,col); 
    int[] rgb = this.getRGB(row,col); 
    return (int) (rgb[0]+rgb[1]+rgb[2])/3; 
} 
1

你當然可以修改Java中的每個像素,但是這是非常低效的。如果您有選擇,我會使用ColorMatrix。有關詳細信息,請參閱Android文檔:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html

您可以將矩陣的飽和度設置爲0以使其變爲灰度。

,如果你真的想這樣做在Java中,你可以做到這一點,你所採取的方式,但是你需要先屏蔽掉每一個元素,即適用& 0xff它。

+0

非常感謝你的答案。我很痛苦從確實沒有setpixel功能,這是我的下一個問題。 – Tony 2010-10-28 18:48:13

1

我明白你不是要求鋤頭來編碼,而是算法?

沒有「正確」的算法按照http://www.dfanning.com/ip_tips/color2gray.html

他們使用

Y = 0.3*R + 0.59*G + 0.11*B 
+0

這些常數是爲NTSC彩色電視選擇的簡化版本:http://en.wikipedia.org/wiki/YUV。我從來沒有看到任何證據表明它們能夠很好地映射人類的感知,但它可能比直線平均更好。 – 2010-10-28 18:36:13