Galera alguem conhece um codigo para converter uma imagem bmp de 24bit para uma binaria, estou apanhando nesta parte de Image.
Obrigado!
Galera alguem conhece um codigo para converter uma imagem bmp de 24bit para uma binaria, estou apanhando nesta parte de Image.
Obrigado!
O nome do processo é “binarization”.
O exemplo abaixo requer a biblioteca JAI (Java Advanced Imaging), que deve ser usada por qualquer aplicação que deva fazer processamento de imagem com um mínimo de eficiência, já que ela usa código nativo (para Windows, Linux e Solaris).
http://www.lac.inpe.br/~rafael.santos/JIPCookbook/4100-jaiop-point-colormod1.jsp
Obrigado amigo vou dar uma estudada no material que vc passou!
Amigo valeu pela ajuda mas infelizmente este meio não vai ser possivel, faltou por minha parte dizer que este codigo irá rodar na J9 da IBM e infelizmente esta biblioteca tem 5mb e o dispostivo em questão nem tem toda esta memoria hehe, mas pelo menos agora eu sei o nome da operação assim posso fazer uma buscar e ver se acho um codigo mais de baixo nivel que faça esta operação.
Obrigado!
O processo para isso é muito simples, e não há necessidade de usar uma biblioteca.
O algoritmo consiste em recuperar o valor de um pixel, e usar uma função de limiar(threshold) nele.
[code]if(pixel > limiar){
pixel = 255;
}
else{
pixel = 0;
}[/code]
aqui tem um livro completo sobre processamento de imagens.
http://homepages.inf.ed.ac.uk/rbf/HIPR2/threshld.htm
este limear seria oque?
o limiar é o limite.
se o valor do pixel ultrapassá-lo, você o deixa branco(255), caso contrário, o deixa negro(0)
olha o link que te passei, nele tem um exemplo com código fonte java.
Aqui é um pouco mais complicado, a imagem gerada é em 24bit, não em 256 cores como no exemplo, quando pego um valor de uma posição em branco, me retorna o int -256, creio que seja a uniao dos valores RGB, juntos para formar um int.
Um pixel é formado pela uniao das 3 cores, eu consigo especificar o valor da cor RED, Green, Blue de um pixel, ou jogar um valor int nestes pixel, como não entendo nada disso tah complicado!
[quote=Shakall]Aqui é um pouco mais complicado, a imagem gerada é em 24bit, não em 256 cores como no exemplo, quando pego um valor de uma posição em branco, me retorna o int -256, creio que seja a uniao dos valores RGB, juntos para formar um int.
Um pixel é formado pela uniao das 3 cores, eu consigo especificar o valor da cor RED, Green, Blue de um pixel, ou jogar um valor int nestes pixel, como não entendo nada disso tah complicado![/quote]
então tá difícil mesmo. Sem estudar não vai.
a imagem resultante terá que ser de 8 bits, ou seja, ter apenas uma banda de cor. Uma imagem em escala de cinza.
após isso, pode aplicar o limiar, e conseguir uma imagem binarizada, como no exemplo.
Então devo primeiro converte-la para 8bit depois para binario!
isso mesmo.
Se você tiver uma imagem de 24 bits (3 componentes - R, G e B) você normalmente converte para um valor de escala de cinza (“luminância”), e então aplica o “threshold”.
Veja uma fórmula para a luminância aqui:
http://www.cs.princeton.edu/introcs/31datatype/Luminance.java.html
Veja que você pode encontrar coeficientes diferentes para esse cálculo, mas isso é porque você pode dar um peso maior ao componente vermelho, por exemplo. (Na fórmula, ele dá o peso 0.299 para o vermelho, 0.587 para o verde e 0.114 para o azul.)
Ae amigo consegui deixa-la em preto e branco, com o tamanho menor, agora terei que aplicar o threshold.
Vou tentar depois posto o que aconteceu hehe
Fiz os passos para transformala em uma escala cinza, deu certo, e apliquei o threshold, tb deu certo mas minha imagem contem um valor de pixel de 0 a 255, ou seja está em 8bit como faço para passa-la para binario? segue abaixo os codigos
Criar imagem
Display display = new Display();
int x = 200, y = 100, font = 17;
Image imagem = new Image(display, x, y);
GC g = new GC(imagem);
g.setFont(new Font(Display.getDefault(), "DIALOG", font, SWT.NORMAL));
g.drawString("teste de impressao", 30, 30);
g.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
g.fillRectangle(60, 60, 80, 80);
g.dispose();
ImageData data = imagem.getImageData();
RGB pixel;
for (int posx = 0; posx < x; posx++) {
for (int posy = 0; posy < y; posy++) {
pixel = data.palette.getRGB(data.getPixel(posx, posy));
pixel = toGray(pixel);
data.setPixel(posx, posy, data.palette.getPixel(pixel));
System.out.print(data.getPixel(posx, posy) + ",");
}
}
ImageLoader loader = new ImageLoader();
loader.data = new ImageData[]{data};
loader.save(file, SWT.IMAGE_BMP);
imagem.dispose();
display.dispose();
Metodos para o cinza e passando para obits com o threshold.
private static double lum(RGB pixel) {
int r = pixel.blue;
int g = pixel.green;
int b = pixel.red;
return .299 * r + .587 * g + .114 * b;
}
public static RGB toGray(RGB color) {
int y = (int) (Math.round(lum(color)));
if (y > 100) {//threshold
y = 255;
} else {
y = 0;
}
RGB gray = new RGB(y, y, y);
return gray;
}
Essa função aqui já fez o limiar e já binarizou sua imagem. Mas você setou o limiar em 100, e colocou o nome dela para toGray, quando na verdade ela é uma função de limiar. Procure deixar 100 como uma variável, para você poder controlar o limite:
public static RGB threshold(RGB color, int limite) {
int y = (int) (Math.round(lum(color)));
if (y > limite) {//threshold
y = 255;
} else {
y = 0;
}
RGB gray = new RGB(y, y, y);
return gray;
}
Detalhe, agora o formato da imagem é de 1bit por pixel(somente duas possibilidades). A classe BufferedImage possui diversas definições de formatos de imagem.
Resolvido o problema, descobri como criar uma Imagem binaria no SWT
Display display = new Display();
int x = 384, y = 1800, font = 14;
org.eclipse.swt.graphics.Color white = display.getSystemColor(SWT.COLOR_WHITE);
org.eclipse.swt.graphics.Color black = display.getSystemColor(SWT.COLOR_BLACK);
// Create a source ImageData of depth 1 (monochrome)
PaletteData palette = new PaletteData(new RGB[]{white.getRGB(), black.getRGB(),});
ImageData sourceData = new ImageData(x, y, 1, palette);
Image im = new Image(display, sourceData);
GC gc = new GC(im);
Font normal = new Font(Display.getDefault(), "DIALOG", font, SWT.NORMAL);
Font bold = new Font(Display.getDefault(), "DIALOG", font, SWT.BOLD);
gc.setFont(normal);
gc.drawString(lin.elementAt(p).toString(), coluna, linha * spaceline);
gc.dispose();
sourceData = im.getImageData();
ImageLoader load = new ImageLoader();
load.data = new ImageData[]{sourceData};
load.save(file, SWT.IMAGE_BMP);
im.dispose();
[quote=Shakall]Resolvido o problema, descobri como criar uma Imagem binaria no SWT
Display display = new Display();
int x = 384, y = 1800, font = 14;
org.eclipse.swt.graphics.Color white = display.getSystemColor(SWT.COLOR_WHITE);
org.eclipse.swt.graphics.Color black = display.getSystemColor(SWT.COLOR_BLACK);
// Create a source ImageData of depth 1 (monochrome)
PaletteData palette = new PaletteData(new RGB[]{white.getRGB(), black.getRGB(),});
ImageData sourceData = new ImageData(x, y, 1, palette);
Image im = new Image(display, sourceData);
GC gc = new GC(im);
Font normal = new Font(Display.getDefault(), "DIALOG", font, SWT.NORMAL);
Font bold = new Font(Display.getDefault(), "DIALOG", font, SWT.BOLD);
gc.setFont(normal);
gc.drawString(lin.elementAt(p).toString(), coluna, linha * spaceline);
gc.dispose();
sourceData = im.getImageData();
ImageLoader load = new ImageLoader();
load.data = new ImageData[]{sourceData};
load.save(file, SWT.IMAGE_BMP);
im.dispose();
[/quote]
Isso…a imagem agora tem 1 bit, e você só precisa copiar os dados de uma banda, da outra imagem para essa nova de 1 bit/px.