2015-10-18 4 views
2

Does getPixels() в android читает пиксели вверх-вниз влево-вправо или влево-вправо вверх-вниз. В основном он читается строками или столбцами. Если бы я хотел сказать, где на картинке находятся красные значения выше, могу ли я это сделать (я предположил, что он читается столбцами).Как обнаружить красные пиксели в растровом изображении

 Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 

     imgTakenPhoto.setImageBitmap(thumbnail); 
     int[] pixels = new int[thumbnail.getHeight()*thumbnail.getWidth()]; 

     thumbnail.getPixels(pixels, 0, thumbnail.getWidth(), 0, 0, thumbnail.getWidth(), thumbnail.getHeight()); 
     Colered[] color = new Colered[pixels.length]; 
     int length = pixels.length; 
     int width = thumbnail.getWidth(); 
     int height = thumbnail.getHeight(); 
     for(int i=0; i<pixels.length;i++){ 
      color[i] = new Colered(getRed(pixels[i]),getBlue(pixels[i]),getGreen(pixels[i])); 
      System.out.print(color[i].red + " "); 
     } 
     int indice=-1; 
     int greatest = -1; 
     for(int i=0;i<length-1;i++){ 
      if(color[i].red> greatest){ 
       greatest = color[i].red; 
       indice = i; 
      } 


     } 

     public static int getRed(int color){ 
    return (color >> 16) & 0xFF; 
    } 
+2

Я написал программу в C#, похожую на то, что вы пытаетесь сделать, одна вещь, которую я заметил, это то, что красный редко бывает красным на картинке, вам придется дать ему ряд возможных красных, возможно используя RGB, где R больше X и G и B меньше, чем Y, например. – Eliseo

+0

преобразуйте растровое изображение в пиксельный массив, затем пропустите его и найдите красный пиксель, если он есть! –

+0

'Does getPixels() в android читает пиксели вверх-вниз влево-вправо или влево-вправо вверх-вниз. В основном он читается строками или столбцами ** ** **. Он читает «конкретную координату x, y». –

ответ

3

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

Вы также слишком усложняете ситуацию. Давайте начнем с Bitmap и две петли:

int redThreshold = 200; // adjust this to your needs 
List<int[]> redPixels = new ArrayList<>(); // redPixels.get(int)[0] = x, redPixels.get(int)[1] = y 
Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
for(int x = 0; x < thumbnail.getWidth(); x++) // x is row 
    for(int y = 0; y < thumbnail.getHeight(); y++) // y is col 
     if(Color.red(thumbnail.getPixel(x, y)) > redThreshold) { 
      redPixels.add(new int[]{x, y}); 
      System.out.println(String.format("Pixel at (%d, %d) has a red value exceeding our threshold of %d!", x, y, redThreshold); 
     } 

Как @Eliseo намекает в своем комментарии, в зависимости от ваших реальных потребностей, вам может понадобиться, чтобы проверить, что другие два цвета ниже определенного порога, а также, как это будет отображать цвета, такие как белый (r = 255, g = 255, b = 255 - белый!).

Итак, как мы будем искать визуальные красные? Что-то, с кем ты и я смотрел бы и соглашался бы просто «красным». Ну, давайте удостовериться, что наше красное значение имеет соответствующее отношение к большему или зеленому или синему; и что синий и зеленый находятся в пределах порога друг друга, иначе мы поймаем розовый и оранжевый. Что-то вроде этого:

int thresholdRatio = 2; 
int threshold = 15; 
List<int[]> redPixels = new ArrayList<>(); 
Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
for(int x = 0; x < thumbnail.getWidth(); x++) 
    for(int y = 0; y < thumbnail.getHeight(); y++) { 
     Color color = thumbnail.getPixel(x, y); 
     int r = Color.red(color); 
     int g = Color.green(color); 
     int b = Color.blue(color); 
     if((r > (Math.max(g, b) * thresholdRatio)) && (Math.abs(g - b) < threshold)) { 
      redPixels.add(new int[]{x, y}); 
      System.out.println(String.format("Pixel at (%d, %d) has a red value more than %d times the max(green, blue) value, and the green and blue value are also within %d points!", x, y, thresholdRatio, threshold); 
     } 
    } 

Это поймает очень светлые и очень темные оттенки красного. Добавьте порог потолка и пола, если вам нужно поймать очень специфические оттенки красного.

Хотите визуализировать, какие пиксели пойманы? Мы можем, если битмап изменен.

Random rand = new Random(); 
Color getRandomColor() { 
    int[] rgb = new int[3]; 
    for(int i = 0; i < rgb.length; i++) { 
     rgb[i] = rand.nextInt(256); 
    } 
    return Color.rgb(rgb[0], rgb[1], rgb[2]); 
} 

boolean transformRedPixels(Bitmap bm, List<int[]> redPixels) { 
    for(int[] coords : redPixels) { 
     bm.setPixel(coords[0], coords[1], getRandomColor()); // This will set each pixel caught to a new random color 
    } 
    return bm.isMutable(); 
} 

Сообщите мне, если это соответствует вашим потребностям. Счастливое кодирование :)

Смежные вопросы