Como posso saber exatamente o que mudou entre duas imagens?

28

Por exemplo, para uma conversa recente sobre compactação JPEG, eu queria comparar pixel por pixel o que mudou entre dois JPEGs (um com nível de compressão 100 e outro com nível de compactação 95).

Como faço para gerar bons mapas visuais do que mudou sem a programação tediosa de software personalizado?

cabbey
fonte
2
Não enviando isso como resposta, pois provavelmente não é uma solução viável para fotos, mas o GitHub (site de um programador) tem algumas maneiras interessantes de comparar imagens: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Tente clicar em "2 em 1", "Deslize", "Pele de cebola" e "Diferença".
Henrik N

Respostas:

35

Camadas do Photoshop + FTW. (Sim, você também pode usar o Gimp ou qualquer outro software de edição com as mesmas funções.)

Comece com a sua imagem base, no caso acima, usei a imagem 100 da qualidade jpeg.

  1. crie uma nova camada em cima dele
  2. cole a segunda imagem nessa camada
  3. defina o estilo da camada como "diferença" (veja a seta rosa esquerda na 1ª imagem abaixo)
  4. crie uma camada de efeito sobre isso (Camada> Nova camada de ajuste> Limite)
  5. defina o efeito como limiar (veja a seta rosa direita na 1ª imagem abaixo)
  6. defina o valor do limite como 1

Na imagem resultante, qualquer pixel diferente das duas imagens será branco. Você pode ajustá-lo para permitir que as coisas sejam "um pouco diferentes" alterando o valor limite.

Exemplo mostrando muita diferença entre os jpeg 92 e 100 do Lightroom. comparando jpeg 92 e 100 do LR com camadas do Photoshop

Exemplo que mostra nenhuma diferença entre 95 e 100. comparando os jpeg 95 e 100 do LR com as camadas do Photoshop

Não é apenas mostrar um binário "alterado ou não", e se você quisesse mais detalhes sobre o quanto ele mudou, digamos, por canal de cores?

  1. substitua a camada de ajuste de limite por uma camada de ajuste de curvas.
  2. editar a curva
  3. ativar o recorte de programa
  4. segure a alça branca de entrada abaixo do canto inferior direito e arraste-a para a esquerda, o mais longe que puder
  5. volte lentamente para a direita até que você não veja nenhum recorte (a imagem de visualização está toda preta)
  6. desative o recorte e salve a alteração da curva

Quanto mais brilhantes os pixels resultantes, mais eles são diferentes nessa cor. A desvantagem, porém, é que você acaba com muita lama cinza ... então, às vezes, é mais fácil limitá-lo para ver onde estão as diferenças. É por isso que eu construo ambos e alterno qual deles é visível.

visão mais descritiva da diferença

cabbey
fonte
Nova pergunta, mas como você faz a etapa 4, "criar uma camada de efeito sobre isso"? Não é possível encontrá-lo em qualquer lugar. Também se passaram sete anos e eu estou usando a versão mais recente para que eles também tenham mudado de nome?
Whitneyland
14

Se você usa o Photoshop, veja como eu faria isso:

Coloque os dois jpegs no mesmo arquivo psd, em duas camadas separadas. Eles devem se sobrepor exatamente, pois suas dimensões são as mesmas. (qual deles vai por cima não importa).

Defina o modo de mesclagem da camada como "Diferença". Você veria um resultado principalmente preto. Depende da diferença de qualidade entre as duas camadas originais, você pode ver mais ou menos o ruído.

insira a descrição da imagem aqui

Jin
fonte
A diferença por si só não ajuda muito quando você fica com um grande vazio preto como esse. :)
cabbey
Com certeza, comparando 100% a 95%, você provavelmente terá um preto sólido. Mas é isso que sua pergunta estava perguntando, não é? Na resposta do proprietário, você está alterando os valores dos originais que estão sendo comparados, o que faz com que eles não tenham mais as configurações de compactação originais.
611 Jin
Você obtém um preto praticamente sólido em praticamente qualquer comparação, porque as diferenças são muito pequenas. A camada limiar / curva após a diferença não faz nada com as configurações de compactação, apenas ajuda a visualizar os limites inferiores dessa sopa preta que a diferença preparou. (Eu não estou 100% de certeza que você entende por que, então eu poderia estar indo em uma direção diferente lá ....)
cabbey
@cabbey se você está pedindo uma operação pura em bits da diferença entre as duas imagens, então o modo de mesclagem "Diferença" por si só fornece isso. Quando você ajusta o limiar / curva, o resultado é mais óbvio a olho nu, mas não é uma representação precisa do que mudou. Quando você faz isso, não está mais comparando 100% a 95%.
611 Jin
Com certeza você é. O nível de compactação parou de importar, pois o segundo photoshop carregou a imagem do disco em seus buffers internos, agora é uma matriz de pixels descompactada na memória ... se esses pixels chegassem lá porque a imagem tinha um blob quadrado ou porque eles são um artefato do nível de compactação não é relevante.
Cabbey #
13

Todos os pacotes de processamento de imagens devem facilitar isso. Vou mostrar como fazer isso no Mathematica, se você tiver acesso a esse sistema. O Mathematica é uma linguagem de programação, mas é realmente fácil fazer esse tipo de manipulação; portanto, se você tiver acesso a ela (por exemplo, através de uma licença de universidade), recomendo que experimente!

Primeiro, importe a imagem:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Recomprima usando compressão JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Gráficos do Mathematica

Agora pegue a diferença dos valores de pixel, convertendo-os primeiro em números de ponto flutuante para garantir que os valores negativos sejam preservados.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Gráficos do Mathematica

Não há muito visível na imagem da diferença (a diferença é pequena) e os valores negativos são cortados em preto. Então, vamos redimensionar todos os valores para preencher todo o intervalo dinâmico (o mínimo será escalado para 0, o máximo para 1):

ImageAdjust[diff]

Gráficos do Mathematica

ImageDifferencedá a diferença absoluta das duas imagens e não produz números negativos. Essa é a operação que você provavelmente encontrará nos pacotes de processamento de imagens, especialmente os da GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Gráficos do Mathematica

Também podemos pegar um único canal RGB, por exemplo, o vermelho, e visualizar as diferenças positivas e negativas usando cores 'opostas':

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Gráficos do Mathematica

Aqui está a mesma coisa, com as diferenças amplificadas 5 vezes. Os artefatos JPEG são mais reconhecíveis agora.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Gráficos do Mathematica

A vantagem de usar uma linguagem de programação é que podemos automatizar isso facilmente e ver como a diferença muda para "níveis de compactação" entre 0,1 e 1,0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Gráficos do Mathematica

Szabolcs
fonte
É sempre bom ver uma opção com script / automatizada! :)
jrista
5

Você pode usar as ferramentas de linha de comando do Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

fornecerá o valor absoluto das diferenças para cada canal RGB.

mikael
fonte
0
  1. Abra uma das imagens no GIMP ou no Photoshop.
  2. Adicione a segunda imagem como uma nova camada em cima da primeira.
  3. Defina o modo de mesclagem da camada superior como "Diferença"

Na imagem resultante, as partes pretas mostram onde as imagens originais são idênticas e qualquer coisa mais clara mostra diferenças.

Dan
fonte
A diferença por si só não ajuda muito quando você fica com um grande vazio preto como esse. :)
cabbey
Você sempre pode ajustar os níveis na imagem resultante. Sempre que eu usei essa técnica que eu tinha fotos diferentes o suficiente para ser capaz de ver as alterações :)
Dan