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.));
}
}