Как обнаружить все пиксели определенного цвета (и аналогичные) в растровом изображении? - PullRequest
0 голосов
/ 20 октября 2018

Я работаю над растровыми изображениями в Android Studio, и я знаю, как сделать, чтобы обнаружить все красные пиксели для примеров, а не только пиксели, которые строго равны Color.RED.Я просто привожу пример с КРАСНЫМ цветом, но я хочу сделать это с любым другим возможным цветом.

I tried to do this:
...
int[] pixels = new int[width * height];
myBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < width * height; i++) {
    if (pixels[i] == Color.RED) {
        // color detected
    }
...

Но это не работает, так как мое изображение не содержит красного пикселя (255, 0, 0), но содержит пиксели, которые могут быть (251, 30, 77) или (239, 23, 42), которые также являются «красными» и т. Д.

Итак, как я могу поступить с такой вещью?Я также попробовал что-то вроде:

int reference; // color as rgb
if ( (Color.red(pixels[i]) > Color.red(reference) - 20) &&
     (Color.red(pixels[i]) < Color.red(reference) + 20 &&
...
{
   // pixel detected
}
...

Где я предполагаю, что (r + - 20, g + - 20, b + -20) является частью (r, g, b) (я имею в виду, длячеловеческий глаз)

Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете принять все пиксели, которые находятся на определенном расстоянии от цвета, который вы хотите.Предполагая, что вы хотите КРАСНЫЙ и все в пределах евклидового расстояния от 10 КРАСНЫХ:

boolean distance(int a, int b) {
return Math.sqrt(Math.pow(Color.red(a) - Color.red(b), 2) + Math.pow(Color.blue(a) - Color.blue(b), 2) + Math.pow(Color.green(a) - Color.green(b), 2));
}
....
int reference = Color.RED;
if (distance(reference, pixels[i]) < 10) {
//pixel accepted
}
...