GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

[RESOLVIDO]verificar se uma imagem tem algum pixel corrompido


#1

Saudações,
Bom não sei se estou postando no lugar correto mais vamos a dúvida.
Seguinte eu tenho um diretorio onde se encontra diversas imagens, imagens esta que foram obtidas através de um processo de recuperação de dados.
Com isso tem muitas imagens neste diretorio, algumas em perfeito estado e outras nem tanto.
Bom.. o que eu quero e fazer um algoritmo que percorra todas a imagens deste diretorio e consiga identificar as fotos que não estão em perfeito estado e delete as mesma,
restando assim somente as fotos em perfeitas condições.

Alguém poderia me ajudar, me dizendo como devo proceder para construir este algoritmo.
Att.


#2

ninguem se habilita?


#3

qual é o parâmetro para saber se o "pixel está corrompido"?


#4

Tem duas de cada imagem para comparar?

Ou existe um valor em pixels corrompidos que os identifique?

Mapas de pixel são sequencias que podem conter qualquer
valor e estes identificam a cor daquele pixel. Como identificar
um pixel que não deveria estar presente? Que cor não poderia
haver numa imagem?

Só se você entendesse que a imagem tem determinadas cores
e você procurasse por pixels que estão fora desse padrão. Mas
duvida que consiga automatizar isso. O que poderia fazer é
criar um software que identificasse quadros em que há pixels
muito fora do padrão geral da imagem, mostrasse esse quadro
ampliado (em Zoom) para um operador dizer se isso é uma
anomalia ou não.

Mas é um trabalho estatístico bastante complexo. Acho dificil
haver imagens com esse nível de contraste.


#5

Só mais uma coisa.

O processo de recuperação deve deixar áreas vazias ou preenchidas com
um mesmo valor de cor em todos os pixels.

Essas áreas poderiam ser identificadas mas ainda assim acho que um
operador teria de confirmar se são falhas ou apenas planos de mesma
cor.

Ou o processo de recuperação coloca um valor fixo que possa ser identificado?


#6

O que acontece é o seguinte.. quanto a imagem que não esta em perfeito estado, acontece o seguinte parte dela vem em forma normal e o restante não foi recuperado corretamente,
esse pedaço da imagem que nao foi recuperado vei preenchido com cinza. Dai eu queria excluir todas a imagens que tivesse dessa forma.


#7

Por "recuperação de dados" você quis dizer "eu tinha um HD que pifou e tive de mandar o HD para um lugar que conseguiu recuperar mais ou menos as fotos do HD?"

Nesse caso, provavelmente você tem vários arquivos com pedaços faltando ou então alguns arquivos com coisas que vieram de outros arquivos.

Como arquivos de fotos normalmente são compactados (JPEG, PNG) então fatalmente haverá algum problema na descompactação dos arquivos corrompidos.

Uma forma de automatizar o processo é achar um programa que converta as imagens originais para algum outro formato e que retorne um código de erro se tiver algum problema na conversão. Tais programas normalmente são em linha de comando, procure por algo parecido com "jpg2png" ou coisa parecida.


#8

Isso mesmo que aconteceu.. eu usei o foremost e ele recuperou a cerca de 100.000 imagens uma perfeitas outras nem tanto.. eu queria excluir essas defeituosas.
Segue um exemplo de uma foto defeituosa.


#9

ao inves de tentar fazer um foguete chegar na lua, porque vc nao checa se seus motores estao funcionando primeiro?
vc mesmo disse que suas images estao corrompidas (algumas) ... com base nesse detalhe, antes de ficar imaginando um milhao de possibilidades com pixels, simplesmente tente abrir o arquivo ... caso o arquivo esteja mesmo corrompido, vc vai tomar excecao na cabeca ...


#10

Eu já realizei esse processo e conseguir eliminar algumas.
Os processos que ja realizei foram, eliminar as fotos menor que um tamanho x (Ex: fotos menor que 40K).
Segundo processo foi tentar abrir cada uma.. aquela imagem que gerar alguma exceção eu exclui ela.


#11
  1. Carregue um BufferedImage com a imagem em questão:

BufferedImage img = ImageIO.read(fileDaImage);
  1. Use o método getPixel() para obter a cor de um pixel:

Color cor = img.getPixel(x, y);
System.out.println(" A cor desse pixel é : r=" + color.getRed() + " g=" + color.getGreen() + " b=" + color.getBlue());

Agora vai de você criar uma lógica com isso. Você poderia, por exemplo, contar todos os pixels cinza e ver se eles tem uma proporção maior do que x% da sua imagem (para não eliminar uma imagem que casualmente tenha um único pixel cinza).

Certifique-se também que os pixels cinza da sua imagem tenham exatamente o mesmo valor em RGB, caso contrário, você terá que fazer uma função que, dado um valor de RGB, diga se ele se enquadra ou não na sua definição de cinza (geralmente tons de cinza são valores de RGB idênticos ou muito parecidos, sendo r=g=b=255 branco e r=g=b=0 preto).


#12

Essa imagem não abriu em qualquer editor de imagem que eu tenha aqui.


#13

ViniGodoy to usando linux e consigo abrir ela sem problemas.
Quando eu tento abrir ela com o

BufferedImage img = ImageIO.read(fileDaImage);

ela me gera um erro o mesmo que acontece quando eu tento abrir com o Gimp, uma vez que ela me gera um erro eu considero que a mesma não poderá estar em perfeitas condições e eu descarto ela.
O que ta pegando agora e que tem imagens que mesmo estando corrompida, ao tentar abrir ela não ta me gerando nenhum erro (o que é estranho visto que outras gera um erro).

Fiz uma implementação de acordo com o que vc me recomendou pegando os pixel.

File file = new File("/home/jweibedev/img.jpg");
        	BufferedImage bufi = ImageIO.read(file); 
        	Raster raster = bufi.getData();
        	Color color = null;
        	for(int i=0; i < raster.getHeight(); i++){
        		for(int j = 0; j < raster.getWidth(); j++){
        			color = new Color(bufi.getRGB(i, j));
        			System.out.println(color);
        		}
        	}

A saida da parte da imagem que esta em perfeita condição é:
java.awt.Color[r=39,g=31,b=10]
java.awt.Color[r=36,g=29,b=10]
java.awt.Color[r=37,g=30,b=12]
java.awt.Color[r=37,g=30,b=14]
java.awt.Color[r=35,g=28,b=12]
java.awt.Color[r=32,g=24,b=11]
java.awt.Color[r=29,g=21,b=8]
java.awt.Color[r=27,g=21,b=9]
java.awt.Color[r=24,g=21,b=12]

A saida da parte da imagem que esta corrompida (como eu disse acima esta vindo em cinza) é:
java.awt.Color[r=128,g=128,b=128]
java.awt.Color[r=128,g=128,b=128]
java.awt.Color[r=128,g=128,b=128]
java.awt.Color[r=128,g=128,b=128]

Sendo assim ViniGodoy quando eu tiver uma sáida de varios RGB ( java.awt.Color[r=128,g=128,b=128] ) consecutivos eu posso considerar que esta imagem não esta em perfeita condição?
Tirei um print da imagem!! Segue em anexo!


#14

se essa filtragem soh nao basta,

e ja que:

instale ImageMagic e escreva um script com identify que identifque todas as imagens que estejam com problemas

http://www.imagemagick.org/script/identify.php

vc deve ver algo do tipo (usando sua imagem acima)

"identify: Corrupt JPEG data: premature end of data segment `18188752.jpg'."

ou continue quebrando a cabeca escovando pixels


#15

Segundo o que você está descrevendo, creio que sim.

O que eu faria é o seguinte:

  1. Conte todos os pixels com valor 128,128,128
  2. Se o número de pixels for maior do que 5% (ou talvez até menos) do tamanho da imagem, descarte-a.

Isso se resume a um for simples:

public boolean isBadImage(BufferedImage bufi) {
   Color BAD = new Color(128,128,128);
   int maxBadPixels = (int)(bufi.getWidth() * bufi.getHeight() * 0.05);
   int badPixels = 0;
   for (int j = 0; j &lt; bufi.getHeight(); j++)
      for (int i = 0; i &lt; bufi.getWidth(); i++) {
         Color color = bufi.getRGB(i,j);
         if (color.equals(color.BAD)) {
            badPixels++;
            if (badPixels &gt; maxBadpixels)
               return true;
         }
      }
   return false;
}

Isso no fundo é uma análise extremamente simplória de histograma.


#16

ViniGodoy dessa forma deu certo!! Obrigado a todos pela ajuda! xD


#17