图片去重

摘要:
需求分析针对海量图片去重通常是如下思路根据某种方法提取图片特征或者说指纹根据提取出来的特征计算图片间的距离根据距离调整阈值判断图片是否相似1、提取指纹常用的有如下方法:ahashphashdhashahash将图片灰度将图片resize为(w,h)大小取图片均值mean将图片中每个像素值与mean比较,大于为1否则为0得(w,h)大小的图片指纹phash将图片灰度对灰度后的图片取DCT变换对DCT
需求分析

针对海量图片去重通常是如下思路

  1. 根据某种方法提取图片特征或者说指纹
  2. 根据提取出来的特征计算图片间的距离
  3. 根据距离调整阈值判断图片是否相似

1、提取指纹

常用的有如下方法:

  1. ahash
  2. phash
  3. dhash

ahash

  1. 将图片灰度
  2. 将图片resize为(w, h)大小
  3. 取图片均值mean
  4. 将图片中每个像素值与mean比较,大于为1否则为0
  5. 得(w, h)大小的图片指纹

phash

  1. 将图片灰度
  2. 对灰度后的图片取DCT变换
  3. 对DCT变换后的图片取左上角(w, h)大小的区域,即为新的图片
  4. 对图取mean
  5. 将图中每个元素与mean比较,大于为1否则为0
  6. 得(w, h)大小的图片指纹

dhash

  1. 将图片resize成(w, h+1, h)大小
  2. 将图片灰度
  3. 对于图像中的每一行,相邻的两个元素后面的减去前面的元素,若大于则为1否则为0
  4. 得到(w, h)大小的图片指纹

二、实现代码如下:

import os
import traceback
from PIL import Image
import numpy as np
from scipy.fftpack import dct
from scipy.spatial.distance import pdist


class ImgHash():
    def __init__(self, path, hash_size=(8, 8)):
        self.hash_size = hash_size
        self.img = np.asarray(Image.open(path))
        self.gray = self.img2gray(self.img)

    @staticmethod
    def img2gray(img):
        r = img[:, :, 0]
        g = img[:, :, 1]
        b = img[:, :, 2]
        gray = 0.2989*r + 0.5807*g + 0.1140*b
        return gray

    def ahash(self):
        img = np.resize(self.gray, new_shape=self.hash_size)
        mean = np.mean(img)
        hashed = (img > mean).astype(int)
        return hashed

    def phash(self):
        img = dct(x=self.gray)[:self.hash_size[0], :self.hash_size[1]]
        mean = np.mean(img)
        hashed = (img > mean).astype(int)
        return hashed

    def dhash(self):
        new_shape = (self.hash_size[0], self.hash_size[1]+1, self.img.shape[-1])
        img = np.resize(self.img, new_shape)
        img = self.img2gray(img)
        hashed = (img[:, 1:] - img[:, :new_shape[1]-1] > 0).astype(int)
        return hashed

参考:

免责声明:文章转载自《图片去重》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇git日志的查看与修改8、jeecg 笔记之 自定义word 模板导出(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

vue可调整大小和可拖动的组件---vue-draggable-resizable

border:位置:调整大小=“onResize”:{{width}};{{高度}}<importVueDraggableResizablefrom'vue-dragable-resizeable'导出默认值{data:height:methods:y){this.x=xthis.y=y}}}<...

无法将您的Kindle连接到Wi-Fi网络怎么办-kindle无法连接wifi-kindle无法连接手机热点

问题描述:当连接到Wi-Fi或移动热点时,Kindle会弹出提示:如果我无法将您的Kindle连接到Wi-Fi网络,该怎么办。步骤1:通过USB数据线将Kindle连接到计算机。2.连接后,我电脑的磁盘将像一个USB闪存驱动器,Kindle磁盘将出现在其中。3.进入Kindle磁盘。在Kindle磁盘下,右键单击创建一个名为WIFI_NO_NET_PROBE...

微信分享之分享图片/分享图标不能显示

微信分享的分享图标/图片无法显示,主要是由于以下几个问题:1.确保分享界面调用成功,分享路径正确。2.确保共享图片的路径不使用中文或全半角字符。3.确保副本不包含敏感字符,如红包和收据。当共享接口未能成功加载时,将发生错误。在页面的前面使用隐藏的div来放置要制作缩略图的图片。记住,不能直接隐藏图片。style=“display:noen”,如果没有,则使用...

转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试

XDMAIP使用部分教程分LINUX篇和WINDOWS篇两个部分。通过实战,面向应用,提供给大家XILINXFPGAPCIE应用解决方案。本教程以MK7160FA作为样机测试。这是一款高性价比的FPGA开发板。而M_AXI_LITE挂载的BRAM是需要进行BAR空间操作,所以地址设置为0x80000000...

flutter vscode+第三方安卓模拟器

1.首先打开夜曲模拟器2.Win+R,选择cmd,在第三方模拟器安装目录的bin目录下输入夜曲模拟器,然后运行命令:nox_Adb.execonnect127.0.0.1:620013。打开项目终端的vscode并建立连接:adbconnect127.00.1:62001(夜神模拟器的默认端口)4。查看连接:adbdevices或不使用第三方模拟器:1.打开...

开源跳板机jumpserver的安装部署和使用详细教程及踩坑经验

安装篇jumpserver需要依赖于mysql数据库,python开发工具的支持,所以需要安装一系列软件。按照提示进行所有流程的安装,安装完成之后访问http://ip:8000端口即可登录到jumpserver。因为jumpserver会在被管理的后端主机上通过此处指定的管理用户来添加指定的用户和sudo权限:配置sudo授权,用于添加sudo授权。...