Imagem salvando toda embasada

34 respostas
R

bom pessoal estou fazendo um programa que salva uma imagem de uma url especifica, só que ela salva toda embasada tem outro metodo que possa ser salvo uma imagem?

o programa que fiz é esse

private void salva() { try { url = new URL(URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Cookie", this.cookie); conn.setRequestProperty("Content-Language", "en-US"); conn.setDoInput(true); conn.setDoOutput(true); InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(this.entradagif); byte[] b = new byte [2048]; int length; while ((length = is.read(b)) != -1) { os.write(b, 0, b.length);// } is.close(); os.close(); }catch (IOException ex){ this.dadosLista.add("Pesquisa Indisponivel - Tente de Novo."); this.dados = null; this.dados = (String[]) dadosLista.toArray(new String[0]); System.exit(0); } }

34 Respostas

kadu.m.lino

jah tentou usar a biblioteca IOUtils? http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#copy(java.io.InputStream, java.io.OutputStream)

acho q ficaria assim seu código…

private void salva() {  
        try {  
            url = new URL(URL);  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
            conn.setRequestMethod("GET");  
            conn.setRequestProperty("Cookie", this.cookie);  
            conn.setRequestProperty("Content-Language", "en-US");  
            conn.setDoInput(true);  
            conn.setDoOutput(true);  
            InputStream is = conn.getInputStream();  
            IOUtils.copy(is, new FileOutputStream(this.entradagif));  
            is.close();  
            os.close();  
        }catch (IOException ex){  
            this.dadosLista.add("Pesquisa Indisponivel - Tente de Novo.");  
            this.dados = null;  
            this.dados = (String[]) dadosLista.toArray(new String[0]);  
            System.exit(0);  
        }  
    }

ve se dá certo

R

o kadu.m.lino
deu certo, fico perfeito a imagem agora…
obrigado pela ajuda ai

ViniGodoy

Provavelmente o único erro do seu código era que faltava fazer flush() antes do close(). Mas a IOUtils simplifica bastante esse tipo de operação, além de deixar o código bem mais legível.

ViniGodoy

Só um detalhe, “embasado” é algo que tem base, como na frase “ele afirmou com embasamento científico”.

Bem diferente de “embaçado”, que significa “sem cor, embaciado, turvo”.

R

O ViniGodoy, obrigado pela dica ai…

não sabia essa diferença…rsrs

R

uma outra pergunta, tem algum filtro que consiga transformar as partes com cor em uma unica cor ( no caso preto) e onde for branco deixar como está

eu estou usando threshold mas não fica como eu preciso, tem algum outro filtro?

R

eu pesquisei aqui, e pelo que entendi, acho que se eu usar um filtro negativo resolve meu problema.
Mas eu num acho nada desse filtro em java, alguém tem ideia como faço?

ViniGodoy

Pode postar um exemplo da imagem e de como vc gostaria que ficasse? (nem que vc produza o resultado no photoshop?)

E

RafaTeko:
uma outra pergunta, tem algum filtro que consiga transformar as partes com cor em uma unica cor ( no caso preto) e onde for branco deixar como está

eu estou usando threshold mas não fica como eu preciso, tem algum outro filtro?

O que é branco, para você? É (R,G,B) = (255,255,255) ou algum cinza bem clarinho também é branco?

R

ViniGodoy - Desculpa não coloca uma imagem aqui, que o programa que estou fazendo fico em casa no note, e só quando eu chegar em casa…rsrsrs

entanglement - Então, é isso mesmo, a parte que quero deixa em branco são varios pontinhos coloridos (tipo imagem quando está fora de sintonia na TV só que com tons de varias cores) = (R,G,B) = (255,255,255) e onde está o branco meio cinza, queria deixa preto.

R

Se caso quiser a imagem, quando eu chega em casa eu coloca a imagem e como eu gostaria que ficasse

E

RafaTeko:
ViniGodoy - Desculpa não coloca uma imagem aqui, que o programa que estou fazendo fico em casa no note, e só quando eu chegar em casa…rsrsrs

entanglement - Então, é isso mesmo, a parte que quero deixa em branco são varios pontinhos coloridos (tipo imagem quando está fora de sintonia na TV só que com tons de varias cores) = (R,G,B) = (255,255,255) e onde está o branco meio cinza, queria deixa preto.

Melhor você postar a imagem e o resultado desejado. Você quer transformar todos os pontos, exceto os que são absolutamente brancos (RGB = 255,255,255) em pretos? Ou você quer deixar os pontos coloridos em branco, ou conservá-los coloridos?

ViniGodoy

Seria bom postar a imagem. Se o problema for ruído, uma forma de reduzir é usar o filtro da mediana. Basicamente, vc percorre a imagem e, para cada pixel, vê a cor que mais se repete nos 9 pixels vizinhos e usa ela no lugar. Ele tem uma vantagem sobre os filtros da média, pois ele praticamente não gera “blur”.

Quando tiver em casa posso postar um exemplo aqui.

Outra possibilidade, se o ruído for mais ou menos constante, é usar uma transformada de Fourrier. Mas isso não é nem um pouco trivial de se explicar aqui no tópico, embora os resultados sejam ótimos.

Se quiser processar imagens, recomendo dar uma olhada nesse site aqui:
http://www.jhlabs.com/ip/filters/

O filtro que falei (da Mediana) é esse aqui:
http://www.jhlabs.com/ip/filters/MedianFilter.html

R

estão ai a imagem como é, e como eu quero que fique

é um captcha, e pra fica como eu quero, eu fiz no foto shop, usei a ferramenta inversão de cores e depois deu um threshold, só isso
o threshold eu uso em java já, só que a inversão de cores, eu num sei se tem na biblioteca do java, pelo menos num achei nada sobre ele

http://imageshack.us/photo/my-images/715/entradaa.jpg/
http://imageshack.us/photo/my-images/338/entradabinarizado.jpg/

R

o ViniGodoy, eu tinha visto esse site que me mando falando sobre os filtros de imagem, só que não cheguei a ler todo, tava sem tempo.

ViniGodoy

Eu faria o seguinte:
a) Converter para grayscale;
b) Aplicar uma operação de abertura morfológica.

Se você ao invés de aplicar uma abertura aplicar duas erosões e uma restauração morfológica, é capaz até de conseguir um resultado ainda melhor do que aquele ali.

R

ViniGodoy:
Eu faria o seguinte:
a) Converter para grayscale;
b) Aplicar uma operação de abertura morfológica.

Se você ao invés de aplicar uma abertura aplicar duas erosões e uma restauração morfológica, é capaz até de conseguir um resultado ainda melhor do que aquele ali.

mais tipo deixa eu ver se entendi o que falou.

aplico o grayscale e a operação de abertura morfológica, mas só isso num ira sair aquele efeito de fundo,
eu preciso tirar ele e deixa só as letras visíveis como fiz na segunda imagem.

ViniGodoy

Apesar de que no teu caso tá bem fácil tratar aquela imagem. O tom de cinza é bem específico, vc poderia binarizar por ele.

ViniGodoy

Baixe um programa que fiz no meu mestrado:
https://dl.dropbox.com/u/8258820/Imagem.zip

Ele permite que você teste diversos filtros. Quando achar a combinação certa, é só implementar.

R

baixei e usei ele aqui…
usei a função “negativo” mas num achei nenhuma função threshold pra ver se dava certo o que eu tava pensando.

tipo meu pensamento era, usar o negativo para poder deixa as letras presta e o fundo no tom mais claro, e usaria o threshold depois e ai iria usar a erosão e dilatação para poder melhora a imagem o maximo que desse.

o que acha?
desculpa tantas perguntas, mas que é sou meio leigo com algumas coisas em java.

ViniGodoy

Parece que dá certo. Agora que notei que um dos filtros mais básicos (que é o threshold) eu não implementei mesmo, hehehehe.

R

hehehehe…

Mas então, só que eu num acho a função “negativo” para o java, num achei nada falando sobre ela, se tem na biblioteca e tal.

ViniGodoy
Dá uma olhada:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Threshold {

    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(new File("C:/temp/imagem/entradaa.jpg"));
        BufferedImage out = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
        for (int y = 0; y < img.getHeight(); y++)
            for (int x = 0; x < img.getWidth(); x++) {
                Color pixel = new Color(img.getRGB(x, y));
                if (pixel.getRed() > 130 && pixel.getGreen() > 130 & pixel.getBlue() > 130)
                    out.setRGB(x, y, Color.BLACK.getRGB());
                else
                    out.setRGB(x, y, Color.WHITE.getRGB());
            }
        ImageIO.write(out, "png", new File("C:/temp/imagem/saida.png"));
    }
}

Simplesmente apliquei threshold simples na cor.

ViniGodoy

A função de negativo é ridiculamente simples de implementar. Basta você inverter o valor do canal.
O R, G e B podem ir até no máximo 255, certo?

Então, basta você fazer 255-r, 255-g e 255-b na imagem de saída.

R

eu imagine que seria só invertendo mesmo
mas como nunca mexi muito com processamento de imagem, queria ter certeza disso…hehehe

eu vou implementa essa função que coloco ai e depois posto o resultado.

R

acabei de implementa aqui e deu certinho, fico ótimo o resultado

obrigado pela a ajuda ViniGodoy

ViniGodoy

De nada. Acho que processamento de imagens é a área que, disparado, eu mais gosto em informática, hehehehe.

R

eu gosto muito dessa area, só que vou ter processamento de imagem na facul só esse ano, então to lutando pra aprender antes…kkkkkkkkk

ViniGodoy

Se prepare para estudar matemática. :slight_smile:

Mas dá para fazer coisas legais, como esse filtro de bloom aqui:


R

nossa muito da hora essas coisas…

e matemática,ta fácil, depois de 3 anos de calculo, física, álgebra e assim por diante…kkkkkkkkkkk

zuera, num deve ser tão fácil não, ainda mais quando escuto o povo do ano a frente reclamando que tá foda a matéria…kkkkk

E

Mas a parte de processamento digital de imagens não é tão difícil, matematicamente, assim. É até legal porque não é nem um pouco abstrato.

O difícil é ficar tentando absorver aqueles conceitos de topologia que se dão em álgebra linear - isso sim é que é abstrato.

R

ah sim entendeu, vamos ver esse ano quando começa a matéria

pena eu não ter tido um bom professor em álgebra linear, vou pena um pouco então…rs

ViniGodoy

É verdade, acho que é porque pensei junto na parte de síntese de imagens em 3D, que é outra área onde trabalho bastante. E ali, é álgebra linear na veia.

Mas também acho muito mais digerível do que muitas matérias da engenharia. Até porque, por definição, a área de imagens permite que você visualize os resultados das contas. Me lembro quando cursei Matemática, que boa parte dos teoremas eram essencialmente descritos por suas demonstrações, sem qualquer analogia visual (e pior ainda, no caso da Matemática pura, sem nem mesmo com aplicação prática)… era tenso.

R

ah sim, com certeza

espera agora quando eu tiver a matéria, ai sim vou ver se é difícil ou fácil pra mim…rsrs

Criado 30 de dezembro de 2012
Ultima resposta 3 de jan. de 2013
Respostas 34
Participantes 4