Boa tarde,
Este é um pequeno exercício de Sistemas Multimidias (INE5431). O mesmo consistia em:
1) Transforme a imagem do elefante em tons de cinza.
2) Gere 3 imagens fazendo a função de split RGB, cada imagens com intensidades luminosas proporcionais a um componente de cor.
3) Implemente um programa que transforme a imagem do elefante em imagem binária.
Primeiramente, como realizar conversão de RGB para Tons de cinza:
Y = 0.3R + 0.59G + 0.11B;
Para realizar a conversão para binário precisamos uma imagem de tons binários e aplicamos a seguinte lógica:
if (Y > 127) {b = 1; } else { b = 0; }
Para deixar somente uma componente de cor, necessitamos manipular a imagem para que a mesma fique somente com a componente que desejamos.
No projeto em anexo, acessamos uma imagem e temos várias funções que realizam a conversão para GrayScale, Binária e Componente RGB. Apartir da imagem original, criamos um Buffer do mesmo tamanho e percorremos os Pixels da imagem original realizamos as transformações adequadas em cada método e jogamos nesse novo Buffer, criando assim uma nova imagem.
Método responsável por receber um BufferedImage e converter o mesmo para tons de cinza
[code lang="java"]
public static BufferedImage criaImagemCinza(BufferedImage imgJPEG) {
// Cria um novo Buffer para BYTE GRAY
BufferedImage img = new BufferedImage(imgJPEG.getWidth(), imgJPEG.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = img.getRaster();
WritableRaster rasterJPEG = imgJPEG.getRaster();
// Para cada Pixel realiza a transformação para tons de cinza e joga na nova imagem.
for(int h=0;h<256;h++)
for(int w=0;w<256;w++) {
int[] p = new int[4];
rasterJPEG.getPixel(w, h, p);
p[0] = (int) (0.3 * p[0]);
p[1] = (int) (0.59 * p[1]);
p[2] = (int) (0.11 * p[2]);
int y = p[0] + p[1] + p[2];
raster.setSample(w,h,0,y);
}
return img;
}
[/code]
Método responsável por receber uma BufferedImage e converte-la para binária.
[code lang="java"]
public static BufferedImage criaImagemBinaria(BufferedImage imgJPEG) {
// Cria um novo buffer para binário
BufferedImage img = new BufferedImage(imgJPEG.getWidth(), imgJPEG.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
WritableRaster raster = img.getRaster();
WritableRaster rasterPB = criaImagemCinza(imgJPEG).getRaster();
// Para cada pixel realiza a verificação de se é mais cinza ou mais branco decidindo se o pixel será branco ou preto.
for(int h=0;h<256;h++)
for(int w=0;w<256;w++) {
int[] p = new int[1];
rasterPB.getPixel(w, h, p);
if(p[0] > 127) {
raster.setSample(w, h, 0, 1);
} else {
raster.setSample(w, h, 0, 0);
}
}
return img;
}
[/code]
Método responsável por receber um BufferedImage e um Tipo (R - 1, G - 2, B - 3) e só deixar a componente de cor escolhida.
[code lang="java"]
public static BufferedImage criaImagemRGB(BufferedImage imgJPEG, int tipo) {
// Cria um novo Buffer para RGB
BufferedImage img = new BufferedImage(imgJPEG.getWidth(), imgJPEG.getHeight(), BufferedImage.TYPE_INT_RGB);
WritableRaster rasterT = img.getRaster();
WritableRaster raster = imgJPEG.getRaster();
// Para cada pixel pega a componente desejada e utiliza somente a mesma na nova imagem
for(int h=0;h<256;h++)
for(int w=0;w<256;w++) {
int[] p = new int[4];
raster.getPixel(w,h,p);
rasterT.setSample(w,h,tipo-1,p[tipo-1]);
}
return img;
}
[/code]
Manipulador de imagens para GrayScale, Binária e Componente de cor desejada.
Matheus
Fui dentro de varios sites na internet destinado a afundar
sobre isto, li varios sites e também nem um se compara a esse até este lugar, teu Texto e exelente, bastante claramente aclimado e também explicativo, adorei.
bem-agradecido pelas informaçoes.
desculpe o portugues estou abaixo do BR a anos.