MashiMaroLjc / Learn-to-identify-similar-images

Record my python script about Iearning to identify similar images
397 stars 174 forks source link

现在又有了一个新的whash算法,请问您可以改进用法加到您的项目中去么,只有一个简单源码 #8

Open William-ze opened 5 years ago

William-ze commented 5 years ago

from future import (absolute_import, division, print_function)

from PIL import Image import six import unittest

import imagehash import imagehash.tests as tests

class TestBasic(tests.TestImageHash):

def setUp(self):
    self.image = self.get_data_image()
    self.func = imagehash.whash

def test_whash(self):
    self.check_hash_algorithm(self.func, self.image)

def test_whash_length(self):
    self.check_hash_length(self.func, self.image, sizes=[2,4,8,16,32,64])

def test_whash_stored(self):
    self.check_hash_stored(self.func, self.image, sizes=[2,4,8,16,32,64])

class Test(unittest.TestCase): def setUp(self): self.image = self._get_white_image()

def _get_white_image(self, size=None):
    if size is None:
        size = (512, 512)
    return Image.new("RGB", size, "white")

def test_hash_size_2power(self):
    for hash_size in [4, 8, 16]:
        hash = imagehash.whash(self.image, hash_size=hash_size)
        self.assertEqual(hash.hash.size, hash_size**2)

def test_hash_size_for_small_images(self):
    default_hash_size = 8
    for image_size in [(1, 25), (7, 5)]:
        image = self._get_white_image(image_size)
        hash = imagehash.whash(image)
        self.assertEqual(hash.hash.size, default_hash_size**2)

def test_hash_size_not_2power(self):
    emsg = 'hash_size is not power of 2'
    for hash_size in [3, 7, 12]:
        with six.assertRaisesRegex(self, AssertionError, emsg):
            imagehash.whash(self.image, hash_size=hash_size)

def test_hash_size_is_less_than_image_scale(self):
    image = self._get_white_image((120, 200))
    emsg = 'hash_size in a wrong range'
    for hash_size in [128, 512]:
        with six.assertRaisesRegex(self, AssertionError, emsg):
            imagehash.whash(image, hash_size=hash_size, image_scale=64)

def test_custom_hash_size_and_scale(self):
    hash_size = 16
    hash = imagehash.whash(self.image, hash_size=hash_size, image_scale=64)
    self.assertEqual(hash.hash.size, hash_size**2)

def test_hash_size_more_than_scale(self):
    emsg = 'hash_size in a wrong range'
    with six.assertRaisesRegex(self, AssertionError, emsg):
        imagehash.whash(self.image, hash_size=32, image_scale=16)

def test_image_scale_not_2power(self):
    emsg = 'image_scale is not power of 2'
    for image_scale in [4, 8, 16]:
        with six.assertRaisesRegex(self, AssertionError, emsg):
            imagehash.whash(self.image, image_scale=image_scale+1)

if name == 'main': unittest.main()