Análise de cores de pixels em java e filtro mediana

Olá, estou em um projeto na faculdade o qual preciso de analisar os pixels de uma imagem em java e verificar se a cor deles é compatível com a procurada (nesse caso preto ou branco). Gostaria de sugestões de como vocês fariam isso, visto que já tentei utilizar a classe Color e ir comparando cada parte dos componentes r, g e b e não deu muito certo. A segunda dúvida seria sobre algoritmos para aplicar um filtro de mediana em uma imagem binária (preta e branca) em java, uma vez que estou tentando utilizar o seguinte código e sempre ocorre um determinado erro quando o valor utilizado para o terceiro parâmetro do método LeJanela3x3 é diferente de 0.

public BufferedImage mediana(BufferedImage ima_in) {
    BufferedImage ima_out = new BufferedImage(ima_in.getWidth(), ima_in.getHeight(), ima_in.getType());
    // Recupera matriz das imagens de entrada e saida

    Raster raster = ima_in.getRaster(); // declara e instancia objeto raster soh para leitura
    WritableRaster wraster = ima_out.getRaster(); // declara e instancia objeto raster para escrita

    // Processa valores da imagem de entrada e armazena na imagem de saida
    double valornr, valorng, valornb;
    int[] v = new int[9];

    for (int y = 1; y < ima_in.getHeight() - 1; y++) {
        for (int x = 1; x < ima_in.getWidth() - 1; x++) {
            // Aplica Filtro de Mediana 3x3
            LeJanela3x3(raster, v, x, y, 0);

            valornr = CalcMediana(9, v);

            LeJanela3x3(raster, v, x, y, 1);

            valorng = CalcMediana(9, v);
            LeJanela3x3(raster, v, x, y, 2);
        
            valornb = CalcMediana(9, v);

            wraster.setSample(x, y, 0, (int) (valornr + .5));
            wraster.setSample(x, y, 1, (int) (valorng + .5));
            wraster.setSample(x, y, 2, (int) (valornb + .5));

        }
    }
    return ima_out;
}

public void LeJanela3x3(Raster raster, int[] v, int x, int y, int banda) {
//    System.out.println("Banda: " + banda);
    v[0] = raster.getSample(x - 1, y - 1, banda);
    v[1] = raster.getSample(x, y - 1, banda);
    v[2] = raster.getSample(x + 1, y - 1, banda);
    v[3] = raster.getSample(x - 1, y, banda);
    v[4] = raster.getSample(x, y, banda);
    v[5] = raster.getSample(x + 1, y, banda);
    v[6] = raster.getSample(x - 1, y + 1, banda);
    v[7] = raster.getSample(x, y + 1, banda);
    v[8] = raster.getSample(x + 1, y + 1, banda);
}

public double CalcMediana(int npts, int[] v) {
    int aux;
    // Ordena em ordem crescente os elementos do vetor
    for (int i = 0; i < npts - 1; i++) {
        for (int j = i + 1; j < npts; j++) {
            if (v[i] > v[j]) {
                aux = v[i];
                v[i] = v[j];
                v[j] = aux;
            }
        }
    }
    // Define o valor da mediana
    if ((npts % 2) == 0) {
        return ((double) v[npts / 2]);
    } else {
        return ((double) ((v[npts / 2] + v[npts / 2 + 1]) / 2.));
    }
}

Vou dar só uma ideia inicial, portanto, não vai abordar todas as suas necessidades.
Você vai precisar de um -> Map<Integer, ArrayList<int[]>> mapa = new TreeMap<>();

Como a chave é um Integer, ela corresponderá a uma cor em especifico.
Como o Map não admite chaves duplicadas, você não terá cores repetidas.
Como o valor é um ArrayList<int[]>, você poderá guardar todas as coordenadas de uma determinada cor.
Como assegurar a inserção:
Em sua codificação, quando encontrar uma cor, basta pegar o número dela bem como as coordenada x e y e depois chamar o mapa com a seguinte ordem:

//não vai sobrecrever a lista caso exista
mapa.putIfAbsent(numero_da_cor, new ArrayList<>());
//insere na lista todas as coordenadas em que a cor ocorrer
mapa.get(numero_da_cor).add(new int[]{linha_da_cor,coluna_da_cor});

Quando quiser saber se há uma cor em especifico, basta consultar o mapa, para ver se há uma chave correspondente ao número da cor -> mapa.containsKey(numero_da_cor);
Té+;

O número da cor que você se refere quer dizer o rgb que é retornado pelo método getRGB() da classe Color correto? Muito obrigado pela ideia.

Use o getRGB(x,y) da classe BufferedReader e altere o método a seguir de acordo com sua necessidade.

private static void matriciar(Image imagem) {
        Map<Integer, ArrayList<int[]>> mapa = new TreeMap<>();
        BufferedImage img = new BufferedImage(imagem.getWidth(null), imagem.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = img.createGraphics();
        g.drawImage(imagem, 0, 0, null);
        int cor;
        for (int linha = 0; linha < imagem.getWidth(null); linha++) {
            for (int coluna = 0; coluna < imagem.getHeight(null); coluna++) {
                //na linha abaixo olhe o trecho img.getRGB(x,y);
                mapa.putIfAbsent(cor = img.getRGB(linha, coluna), new ArrayList<>());
                mapa.get(cor).add(new int[]{linha, coluna});
            }
        }
        g.dispose();
        /*o resto da codificação é desenvolvimento pois as cores foram mapeadas
        Obs.: para manusear o mapa, declare ele como atributo ou passe ele nos parâmetros do método*/
    }