如何查找重复的图像

Posted

技术标签:

【中文标题】如何查找重复的图像【英文标题】:How to find duplicate images 【发布时间】:2021-05-15 00:41:16 【问题描述】:

使用下表我需要找到重复的图像记录。该查询用于查找记录但不准确的结果。在获取重复的图像记录之后,我们只想获取那些 FM_NAME_EN、LASTNAME_EN、RLN_TYPE、RLN_FM_NM_EN、RLN_L_NM_EN、GENDER、AGE 和 PHOTO 相同的记录。 使用的表有如下列

 CREATE TABLE [dbo].[ERoll](
    [AC_NO] [int] NULL,
    [PART_NO] [int] NULL,
    [SLNOINPART] [int] NULL,
    [FM_NAME_EN] [nvarchar](250) NULL,
    [LASTNAME_EN] [nvarchar](250) NULL,
    [RLN_TYPE] [nvarchar](1) NULL,
    [RLN_FM_NM_EN] [nvarchar](250) NULL,
    [RLN_L_NM_EN] [nvarchar](250) NULL,
    [EPIC_NO] [nvarchar](25) NULL,
    [GENDER] [nvarchar](1) NULL,
    [AGE] [int] NULL,
    [PHOTO] [image] NULL
);

上表中的一些记录有重复的图像。那么我们如何找到重复的图像记录

只有 50% 的记录正确通过以下查询:

SELECT e.AC_NO, e.PART_NO, e.SLNOINPART, e.FM_NAME_EN, e.LASTNAME_EN, 
    e.RLN_FM_NM_EN, e.RLN_L_NM_EN, e.RLN_TYPE, e.GENDER, e.AGE
FROM S21_EROLL_MANAGEMENT_PROD.dbo.ERoll e
JOIN (
    select FM_NAME_EN, LASTNAME_EN, RLN_FM_NM_EN, RLN_L_NM_EN, RLN_TYPE, GENDER, AGE, hashbytes('md5', cast([PHOTO] as varbinary)) PHOTO ,count(*) PHOTO_COUNT
    from S21_EROLL_MANAGEMENT_PROD.dbo.ERoll
    group by FM_NAME_EN, LASTNAME_EN, RLN_FM_NM_EN, RLN_L_NM_EN, RLN_TYPE, GENDER, AGE, hashbytes('md5', cast([PHOTO] as varbinary)) 
    having count(*) > 1
) d ON e.FM_NAME_EN = d.FM_NAME_EN and e.LASTNAME_EN = d.LASTNAME_EN and e.RLN_FM_NM_EN=d.RLN_FM_NM_EN 
    and e.RLN_L_NM_EN = d.RLN_L_NM_EN and e.RLN_TYPE = d.RLN_TYPE and e.GENDER = d.GENDER and e.AGE = d.AGE
order by AC_NO, PART_NO, SLNOINPART

【问题讨论】:

GROUP BY、HAVING、COUNT()。 您需要提供minimal reproducible example,其中包含示例数据和预期结果。 使用varbinary(max) 【参考方案1】:

使用 GROUP BY、HAVING、COUNT() :

select hashbytes('md5', cast([imagecolumn] as varbinary(max))),count(*)
from yourtable
group by hashbytes('md5', cast([imagecolumn] as varbinary(max)))
having count(*) > 1

【讨论】:

好像我已经用这个作为内部查询了,但实际问题你不明白。对于照片,我们使用图像数据类型。所以在这种情况下,您无法使用查询获取数据。我们需要将图像转换为 varbinary 以查找重复图像。 再次查询是错误的,如果您在组中使用照片字段,那么它不会显示重复的图像。您在照片上设置了 group by,这是错误的。 varbinary(max) 我认为这是重点 @Charlieface 这是一个错字【参考方案2】:

我猜你可以试试找这样的重复照片

SELECT HASHBYTES('SHA2_256', cast(photo as varbinary(max))) from dbo.ERoll

【讨论】:

【参考方案3】:

使用窗口函数:

select e.*
from (select e.*
             count(*) over (partition by FM_NAME_EN, LASTNAME_EN, RLN_FM_NM_EN, RLN_L_NM_EN, RLN_TYPE, GENDER, AGE, hashbytes('md5', cast([PHOTO] as varbinary))) as cnt
      from S21_EROLL_MANAGEMENT_PROD.dbo.ERoll e
     ) e
where cnt > 1;

【讨论】:

以上是关于如何查找重复的图像的主要内容,如果未能解决你的问题,请参考以下文章

在图像中查找重复的图案/图像

text Lightroom - 查找重复的图像

sh 查找文件/图像重复

如果分辨率更改,则查找相似图像[重复]

我正在尝试查找位图图像的高度和宽度,我环顾了网络,但没有找到任何答案[重复]

使用VP树和OpenCV构建一个图像哈希搜索引擎