Como posso detectar fotos melhoradas?


8

Eu tenho uma coleção de fotos JPEG, cada uma com 500 a 600 pixels no lado mais longo. Como posso detectar quais foram ampliadas algoritmicamente a partir de uma foto substancialmente menor?

Um mercado on-line exige que cada vendedor faça upload de fotos dos produtos que vende, e essas fotos devem ter pelo menos 500 pixels de largura ou 500 pixels de altura, porque as fotos dos produtos com poucos detalhes causam uma experiência ruim aos compradores. Já posso dizer se um vendedor está tentando contornar esse requisito adicionando uma borda de cor sólida, como estender o plano de fundo branco padrão com mais branco. Ultimamente, porém, os vendedores começaram a contornar isso, aumentando as fotos antigas tiradas antes da publicação do requisito de 500 pixels. Qual é uma boa maneira de determinar se as fotos foram ampliadas com interpolação mais próxima, bilinear ou bicúbica?


Só para esclarecer, você está perguntando sobre a detecção completamente automatizada, sem qualquer avaliação pelo globo ocular humano?
Junkyardsparkle

4
Para um teste automatizado, o stackoverflow provavelmente fornecerá uma resposta
Renan Le Caro

@ Renan Mesmo um teste manual usando uma sequência de filtros GIMP poderia funcionar para uma verificação pontual das imagens de um determinado vendedor.
Damian Yerrick 12/02

1
Acho que a pergunta que precisamos fazer é por que você se importa? Faz uma grande diferença para a resposta ...
James Snell

@JamesSnell Fotos ruins repelem os compradores. Veja, por exemplo, as orientações do eBay .
Damian Yerrick

Respostas:


9

Faça um CÃO farejar o borrão nas fotos.

Se você for penalizar por fotos ampliadas digitalmente, também poderá penalizar por fotos fora de foco. As bordas e os detalhes desfocados em ambos causam a mesma experiência ruim aos espectadores, independentemente de serem causados ​​por um original pequeno ou um foco ruim. O que você quer fazer é detectar a desfocagem, que é a ausência de altas frequências espaciais.

Tente fazer a diferença entre uma imagem e uma cópia borrada de si mesma. Se uma imagem já estiver embaçada, um desfoque Gaussiano de 1 pixel não mudará a imagem tanto quanto se ela fosse nítida. Portanto, haverá mais diferença entre uma imagem nítida e uma versão borrada do que entre uma imagem borrada e uma versão borrada adicional. Na visão computacional, essa técnica é chamada de " diferença de gaussianos " (DOG).

  1. Abra a imagem no GIMP ou em outro editor de fotos em camadas.
  2. Duplique a camada.
  3. Aplique um Gaussian Blur com um raio de 1 pixel nesta nova camada.
  4. Mude o modo de camada para "Diferença". A imagem ficará preta, exceto pelas bordas.
  5. Repita as etapas 1 a 4 para obter uma imagem nítida conhecida de assunto, composição e tamanho semelhantes.
  6. Compare a intensidade das bordas nas duas imagens de diferença. Você pode observar isso ou usar um histograma.

Eu apenas tentei isso em uma foto de 400x480 pixels e na mesma coisa que havia sido reduzida para 200x240 (50%) e depois ampliada para 400x480 (200%), e as bordas da foto aumentada foram visivelmente mais fracas. Não será conclusivo em um aumento moderado como 140%, mas ocorrerá casos flagrantes.

Várias bibliotecas de visão computacional incluem meios para calcular a diferença de gaussianos em uma imagem. O mesmo acontece com muitos editores gráficos de imagens. Versões recentes do GIMP, por exemplo. inclua uma macro DOG que automatize as etapas 2 a 4: Filtros> Detecção de borda> Diferença de Gaussians e defina os raios para 1,0 e 0,0.

Perguntas relacionadas em outros sites do Stack Exchange:

O DOG não pega o vizinho mais próximo, mas você pode fazer isso procurando um padrão de linhas e colunas idênticas ao vizinho imediato, na parte superior ou esquerda.

  1. Abra a imagem.
  2. Duplique a camada.
  3. Desloque a nova camada um pixel para cima ou para a esquerda.
  4. Mude o modo de camada para "Diferença".
  5. Procure um padrão de linhas em branco.

1
E se a imagem em escala superior tiver uma máscara de nitidez muito forte aplicada?
Por favor, leia meu perfil

1
A máscara de nitidez @mattdm aumenta o contraste, não cria conteúdo de imagem de alta frequência.
Matt Grum

@mattdm USM é um filtro de alto impulso: x + amt*(x - GB(x, r)). A combinação de USM e ampliação aumentará apenas os médios (freqs espaciais médios), não os altos, porque os altos não existem. DOG (x, 1, 0) isola os altos.
Damian Yerrick 13/02/2015

1

Não creio que isso seja possível no sentido geral. Existem muitos algoritmos de aumento de escala possíveis, com uma assinatura que pode ser difícil de detectar sem ambiguidade, sem o conhecimento do conteúdo da imagem (como exemplo extremo, uma área aumentada de cor uniforme ainda é uma cor uniforme ...).

Possivelmente, uma opção seria calcular uma métrica para a complexidade da imagem, como uma estimativa de entropia (por exemplo, consulte /programming/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-e-imagemagick ).

Se você fizer isso em um grande número de imagens, poderá gerar estatísticas para toda a coleção. Em seguida, você pode revisar manualmente as imagens discrepantes nessas estatísticas.

Infelizmente, isso sempre resultará em falsos positivos e as imagens que foram bem dimensionadas podem não ser capturadas (mas, se forem boas, isso importa?)


Gosto da última parte - se ninguém sabe, quem se importa? Lembra-me deste Xkcd . (Aviso: linguagem forte.)
Por favor, leia meu perfil

0

Eu adotaria uma abordagem híbrida. Eu acho que as outras idéias de usar uma Diferença de Gaussianas, verificar EXIF ​​ou outros metadados ou até FFT podem ser combinadas. Outra maneira possivelmente mais fácil é simplesmente pegar cada imagem, reduzir a escala, aumentar a escala novamente e comparar. Se eles são muito parecidos (usando algo como o Delta E , talvez), é provável que tenham sido aumentados (ou embaçados, como sugere outro post). Talvez você possa estabelecer um limite do número de testes aprovados ou reprovados? Se mais da metade dos testes forem aprovados, é bom, caso contrário, é ruim ou precisa de intervenção humana para verificar, ou algo assim.


0

Você deve conseguir fazer um bom trabalho descompactando parcialmente os próprios dados JPEG e fazendo algumas contagens triviais.

Os dados JPEG são criados executando uma transformação discreta de cosseno nos dados da imagem original, quantizando (jogando fora os dados de alta resolução) e, em seguida, percorrendo o bloco DCT resultante em um padrão em zigue-zague e embalando o fluxo de bits resultante com a codificação Huffman.

Se você reverter a codificação de Huffman e desfazer o zigue-zague, terá uma série de blocos 8x8 DCT, nos quais os dados de frequência mais baixa estão no canto superior esquerdo do bloco e as informações de frequência mais alta estão no canto inferior direito.

O que isso significa é que você pode literalmente olhar para os dados nesse formato intermediário e dizer se foram ampliados, porque todos os blocos de 8x8 terão valores diferentes de zero apenas no canto superior esquerdo (aproximadamente).


0

Na verdade você pode

Você não precisa de um cachorro para farejar a foto. Vamos para:

http://rest7.com/image_upscaled

Nesta página, você pode enviar sua imagem e obter dimensões originais , como esta:

{
  "is_upscaled": true,
  "current_width": "2000",
  "current_height": "928",
  "original_width": "1750",
  "original_height": "696",
  "accuracy": "82%",
  "accuracy_width": "82%",
  "accuracy_height": "82%",
  "success": 1
}

Às vezes, não adivinha a resolução original corretamente. Eu acho que depende do algoritmo de aumento de escala usado na foto. Também descobri que, se uma foto fosse aumentada e compactada em um formato JPEG com alta compressão (como 30%), os artefatos JPEG dificultariam a adivinhação desta página. Mas se as suas fotos forem de boa qualidade, aumentadas usando métodos populares (Lanczos, Bilinear), elas deverão ser bastante precisas.

Aqui estão 2 imagens de exemplo:

ORIGINAL

https: // i. pilha. imgur. com / iXYKV.png

(desculpe, eu não tenho reputação suficiente para postar mais de 2 links)

UPSCALED & CROPPED

insira a descrição da imagem aqui

Se você postar a foto cortada, esta página retornará:

{
  "is_upscaled": true,
  "current_width": "700",
  "current_height": "300",
  "original_width": 352.33333333333,
  "original_height": 151,
  "accuracy": "57%",
  "accuracy_width": "57%",
  "accuracy_height": "57%",
  "cropped": true,
  "success": 1
}

Então você pode ver que a imagem foi ampliada e cortada. Ele não informa o tamanho da imagem original antes do corte, já que não é possível obter informações sobre algo que foi excluído apenas dos pixels deixados intactos.


Esse site só funcionará desde que você possa confiar nos dados incorporados na imagem. Mas é trivialmente fácil modificar esses dados. E se eu estivesse tentando enganar um mercado por dinheiro, estaria alterando os dados deixados à direita e no centro.
Peter M

@ PeterM Não tenho muita certeza do que você quer dizer. Deseja cortar uma imagem? Este site ainda detectará que foi aumentado.
21717 Jack

Pergunte a si mesmo como ele sabe que a imagem foi cortada. Onde você acha que as informações estão armazenadas e informam qual era o tamanho da imagem original?
Peter M

@ Peter Bem, não sei exatamente como funciona, mas usei um pouco e posso dizer que analisa os pixels e detecta a resolução original com base nisso. Não analisa o formato do arquivo, mas os pixels em si. Portanto, a resolução original não é armazenada em nenhum lugar.
21717 Jack

@ Jack Quando "analisa os pixels", provavelmente usa algo como DOG.
Damian Yerrick
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.