在django应用程序中,我将在models.py中的image
类下有一个所有类别的图像数据库。不幸的是,这些图像中的一些可能是彼此重复的,我想编写一个应用程序(部分)允许我标记这些重复的图像。作为这样的数据库设置的新手,在我的models.py
中实现这个的最佳方法是什么?
我的models.py
如下:
class duplicate(models.Model):
#some kind of code goes here?
#perhaps...
models.ImageField(upload_to='directory/') #not uploading a new image here- just want to link it to a database full of images somehow?
class image(models.Model):
image = models.ImageField(upload_to='directory/')
duplicate = models.ManyToManyField(duplicate, null=True) #is this the correct way to do this?
答案 0 :(得分:2)
您可以破解Model.save/delete方法将图像名称和校验和存储在数据库中,然后您可以使用一种方法来计算具有相同校验和的图像数量。
未经测试,只是为了让您开始朝着正确的方向前进:
class ImageAccounting(models.Model):
fk = models.IntegerField()
model_name = models.CharField(max_length=100)
md5 = models.CharField(max_length=32)
class SomeModel(models.Model)
...
image = models.ImageField(upload_to='somewhere')
...
def image_signature(self):
md5 = hashlib.md5(self.image.file.read()).hexdump()
model_name = self.__name__
return md5, model_name
def save(self, *args, *kwargs):
super(SomeModel, this).save(*args, **kwargs)
md5, model_name = self.image_signature()
try:
i = ImageAccounting.objects.get(fk=self.pk, md5=md5, model_name=model_name)
except ImageAccounting.DoesNotExist:
i = ImageAccounting(fk=self.pk, md5=md5, model_name=model_name)
i.save()
def delete(self, *args, **kwargs):
super(SomeModel, this).delete(*args, **kwargs)
md5, model_name = self.image_signature()
ImageAccounting.objects.filter(fk=self.pk, md5=md5, model_name=model_name)\
.delete()
def copies(self):
md5, _ = self.image_signature()
return ImageAccounting.objects.filter(md5=md5)
[更新]
并非所有的图像都会完全相同,但我真的很喜欢我们要去的地方。就我而言,我有一个充满图像的数据库,这些图像可能是彼此重复的(但不是相同的扫描,所以它们的校验和不同)。我需要一种方式来说,“这张图片看起来与我几个小时前看到的其他图像非常相似。我希望它们能够被链接起来并包含对原因的描述。”它不一定是自动化的,只是一种方式让我说“我一次上传的这两个图像是相关的”。如果你愿意的话,多个图像(类图像)的多种关系。 - mh00h
如果图像不是精确的重复,我们正在进入模糊数据库和计算机视觉领域。这些不是CS的简单主题,我担心完整的答案不适合这个空间,但它是可行的 - OpenCV有一个Python界面,它是一种受益于快速原型设计的项目由Python启用。
因此,我想要做的就是在我的数据库中标记已存在于数据库中的两个图像是彼此重复的。用户将手动将图像标记为彼此的副本。我只是不知道如何在我的模型中定义多对多关系。用户将会发现计算机不会发现重复项。 - mh00h
如果人类将图像分类为重复,则只需创建对称的递归关系。要创建recursive relationship - 与自身具有多对一关系的对象 - 使用models.ManyToManyField('self')
,则不需要中间模型:
duplicates = models.ManyToManyField('self', null=True)
答案 1 :(得分:1)
好吧,您可以使用一些lib进行图像处理:这些链接可能很有用: http://atodorov.org/blog/2013/05/17/linux-and-python-tools-to-compare-images