Skip to content

Conversão de Imagens para GrayScale/Binária/R/G/B

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

Published injava

One Comment

  1. x x

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.