Как подать заявку, конвертируя изображение из цветного в оттенки серого в алгоритм Android? - PullRequest
2 голосов
/ 28 октября 2010

Я пытаюсь использовать один из этих алгоритмов для преобразования изображения RGB в оттенки серого:

Метод осветления усредняет самые заметные и наименее заметные цвета: (максимум (R, G, B)+ min (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   ;
}

Ответы [ 4 ]

2 голосов
/ 28 октября 2010

Вам нужно убрать биты, которые не являются частью компонента, который вы получаете, особенно если в сменах происходит расширение знака.

    int R = (q[i] >> 16) & 0xff ;     //bitwise shifting 
    int G = (q[i] >> 8) & 0xff ; 
    int B = q[i] & 0xff ; 
1 голос
/ 28 октября 2010

Я так понимаю, вы спрашиваете не о мотыге для кодирования, а об алгоритме?

Не существует «правильного» алгоритма согласно http://www.dfanning.com/ip_tips/color2gray.html

Они используют

Y = 0.3*R + 0.59*G + 0.11*B
1 голос
/ 28 октября 2010

Вы можете изменить каждый пиксель в Java, но это очень неэффективно.Если у вас есть возможность, я бы использовал ColorMatrix.Подробности смотрите в документации Android: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html

Вы можете установить насыщенность матрицы равной 0, чтобы сделать ее в градациях серого.

Если вы действительно хотите сделать это на Java, вы можете сделать этотак, как вы это сделали, но сначала вам нужно замаскировать каждый элемент, т.е. применить к нему & 0xff.

1 голос
/ 28 октября 2010

То, что ты сделал, выглядит хорошо для меня ..

Однажды я сделал это, в 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;
}
...