Você está na página 1de 2

dhash é uma biblioteca Python que gera um "hash de diferença" para uma determinada imagem -

um hash perceptivo baseado no algoritmo dHash de Neal Krawetz nesta entrada do blog "Hacker
Factor".

A biblioteca está no Python Package Index (PyPI) e funciona no Python 3 e no Python 2.7. Para
instalá-lo, inicie um prompt de comando, ative seu ambiente virtual se você estiver usando um e
digite:

pip install dhash

O algoritmo para criar um hash de diferença é muito simples:

Converter a imagem em escala de cinza


Reduza o tamanho para uma miniatura de 9x9 (tamanho = 8 significa uma imagem de 8 + 1 por 8 +
1)
Produza um "hash de linha" de 64 bits: 1 bit significa que a intensidade do pixel está aumentando na
direção x, 0 significa que está diminuindo
Faça o mesmo para produzir um "hash da coluna" de 64 bits na direção y
Combine os dois valores para produzir o valor final do hash de 128 bits

O padrão da biblioteca é produzir um tamanho 8 dhash, mas você pode substituí-lo facilmente,
passando size = N como um argumento de palavra-chave para a maioria das funções. Por exemplo,
você pode produzir um dhash de 512 bits mais preciso (mas mais lento para trabalhar)
especificando size = 16.

Descobri que o dhash é ótimo para detectar perto de duplicatas (no Jetsetter, encontramos dupes
usando um dhash tamanho 8 com um delta máximo de 2 bits). Mas, devido à simplicidade do
algoritmo, não é bom encontrar imagens semelhantes ou imagens duplicadas, mas cortadas - você
precisará de uma impressão digital de imagem mais sofisticada, se quiser. No entanto, o dhash é
bom para encontrar duplicatas exatas e quase duplicatas, por exemplo, a mesma imagem com
iluminação ligeiramente alterada, alguns pixels de corte ou photoshopping muito leve.

Para usar a biblioteca dhash, você precisa da ligação do ImageMagick da varinha ou da biblioteca
Pillow (PIL) instalada. Escolha um e fique com ele - eles produzirão valores dhash ligeiramente
diferentes devido a diferenças nos algoritmos de conversão e redimensionamento da escala de cinza.

Se você tiver as duas bibliotecas instaladas, o dhash usará o wand por padrão. Para substituir isso e
forçar o uso do Pillow / PIL, chame dhash.force_pil () antes de usar a biblioteca.

Para produzir um valor dhash usando varinha:

import dhash
from wand.image import Image

with Image(filename='dhash-test.jpg') as image:


row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))
To produce a dhash value using Pillow:

import dhash
from PIL import Image

image = Image.open('dhash-test.jpg')
row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))

Para produzir diretamente o valor do hash como um número inteiro de 128 bits, use
dhash_int (imagem, tamanho = N). Para formatar o valor do hash de várias maneiras, use as
funções format_ *:

>>> row, col = (13962536140006260880, 9510476289765573406)


>>> dhash.format_bytes(row, col)
b'\xc1\xc4\xe4\xa4\x84\xa0\x80\x90\x83\xfb\xff\xcc\x00@\x83\x1e'
>>> dhash.format_hex(row, col)
'c1c4e4a484a0809083fbffcc0040831e'

Para calcular o número de bits diferente (distância de hamming) entre dois hashes, você pode
usar o get_num_bits_different(hash1, hash2) helper function:

>>> import dhash


>>> dhash.get_num_bits_different(0x4bd1, 0x5bd2)
3

You can also use dhash to generate the difference hash for a specific image from the command
line:

Você também pode gostar