Ваш код ищет «самый красный» пиксель, пиксель с самым высоким красным значением. Я не думаю, что это действительно то, что вам нужно, но исправьте меня, если я ошибаюсь.
Вы также слишком усложняете ситуацию. Давайте начнем с 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();
}
Сообщите мне, если это соответствует вашим потребностям. Счастливое кодирование :)
Я написал программу в C#, похожую на то, что вы пытаетесь сделать, одна вещь, которую я заметил, это то, что красный редко бывает красным на картинке, вам придется дать ему ряд возможных красных, возможно используя RGB, где R больше X и G и B меньше, чем Y, например. – Eliseo
преобразуйте растровое изображение в пиксельный массив, затем пропустите его и найдите красный пиксель, если он есть! –
'Does getPixels() в android читает пиксели вверх-вниз влево-вправо или влево-вправо вверх-вниз. В основном он читается строками или столбцами ** ** **. Он читает «конкретную координату x, y». –