python 找出图片中的差异点,python opencv对目录下图片进行去重的技巧
使用python opencv对目录下图片进行去重的方法
版本:
平台:ubuntu 14 / I5 / 4G内存
python版本:python2.7
opencv版本:2.13.4
依赖:
如果系统没有python,则需要进行安装
sudo apt-get install python
sudo apt-get install python-dev
sudo apt-get install python-pip
sudo pip install numpy mathplotlib
sudo apt-get install libcv-dev
sudo apt-get install python-opencv
使用感知哈希算法进行图片去重
原理:对每个文件进行遍历所有进行去重,因此图片越多速度越慢,但是可以节省手动操作
感知哈希原理:
1、需要比较的图片都缩放成8*8大小的灰度图
2、获得每个图片每个像素与平均值的比较,得到指纹
3、根据指纹计算汉明距离
5、如果得出的不同的元素小于5则为相同(相似?)的图片
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
import os,sys,types
def cmpandremove2(path):
dirs = os.listdir(path)
dirs.sort()
if len(dirs) <= 0:
return
dict={}
for i in dirs:
prepath = path + "/" + i
preimg = cv2.imread(prepath)
if type(preimg) is types.NoneType:
continue
preresize = cv2.resize(preimg, (8,8))
pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
premean = cv2.mean(pregray)[0]
prearr = np.array(pregray.data)
for j in range(0,len(prearr)):
if prearr[j] >= premean:
prearr[j] = 1
else:
prearr[j] = 0
print "get", prepath
dict[i] = prearr
dictkeys = dict.keys()
dictkeys.sort()
index = 0
while True:
if index >= len(dictkeys):
break
curkey = dictkeys[index]
dellist=[]
print curkey
index2 = index
while True:
if index2 >= len(dictkeys):
break
j = dictkeys[index2]
if curkey == j:
index2 = index2 + 1
continue
arr1 = dict[curkey]
arr2 = dict[j]
diff = 0
for k in range(0,len(arr2)):
if arr1[k] != arr2[k]:
diff = diff + 1
if diff <= 5:
dellist.append(j)
index2 = index2 + 1
if len(dellist) > 0:
for j in dellist:
file = path + "/" + j
print "remove", file
os.remove(file)
dict.pop(j)
dictkeys = dict.keys()
dictkeys.sort()
index = index + 1
def cmpandremove(path):
index = 0
flag = 0
dirs = os.listdir(path)
dirs.sort()
if len(dirs) <= 0:
return 0
while True:
if index >= len(dirs):
break
prepath = path + dirs[index]
print prepath
index2 = 0
preimg = cv2.imread(prepath)
if type(preimg) is types.NoneType:
index = index + 1
continue
preresize = cv2.resize(preimg,(8,8))
pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
premean = cv2.mean(pregray)[0]
prearr = np.array(pregray.data)
for i in range(0,len(prearr)):
if prearr[i] >= premean:
prearr[i] = 1
else:
prearr[i] = 0
removepath = []
while True:
if index2 >= len(dirs):
break
if index2 != index:
curpath = path + dirs[index2]
#print curpath
curimg = cv2.imread(curpath)
if type(curimg) is types.NoneType:
index2 = index2 + 1
continue
curresize = cv2.resize(curimg, (8,8))
curgray = cv2.cvtColor(curresize, cv2.COLOR_BGR2GRAY)
curmean = cv2.mean(curgray)[0]
curarr = np.array(curgray.data)
for i in range(0,len(curarr)):
if curarr[i] >= curmean:
curarr[i] = 1
else:
curarr[i] = 0
diff = 0
for i in range(0,len(curarr)):
if curarr[i] != prearr[i] :
diff = diff + 1
if diff <= 5:
print 'the same'
removepath.append(curpath)
flag = 1
index2 = index2 + 1
index = index + 1
if len(removepath) > 0:
for file in removepath:
print "remove", file
os.remove(file)
dirs = os.listdir(path)
dirs.sort()
if len(dirs) <= 0:
return 0
#index = 0
return flag
def main(argv):
if len(argv) <= 1:
print "command error"
return -1
if os.path.exists(argv[1]) is False:
return -1
path = argv[1]
'''
while True:
if cmpandremove(path) == 0:
break
'''
cmpandremove(path)
return 0
if __name__ == '__main__':
main(sys.argv)
为了节省操作,遍历所有目录,把想要去重的目录遍历一遍
#!/bin/bash
indir=$1
addcount=0
function intest()
{
for file in $1/*
do
echo $file
if test -d $file
then
~/similar.py $file/
intest $file
fi
done
}
intest $indir
以上这篇使用python opencv对目录下图片进行去重的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。
以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。
python 找出图片中的差异点,python opencv对目录下图片进行去重的技巧相关推荐
- python找出有向图的所有环,Python:有向图中的所有简单路径
我正在处理一个(数量)有向图,其中有no个循环,我需要找到任意两个节点之间的所有简单路径.一般来说,我不会担心执行时间,但我必须在非常多的时间步中对很多节点执行此操作-我正在处理基于时间的模拟.在 我 ...
- python找出数组重复_在Python中使用位数组查找数组的重复项
假设我们有n个不同数字组成的数组:n最多为32,000.该数组可能有重复的条目,我们不知道n的值是什么.现在,如果我们只有4 KB的内存,将如何显示数组中的所有重复项? 因此,如果输入类似于[2,6, ...
- 如何用 Python 找出某月的第一天
博客翻译自:https://www.mytecbits.com/internet/python/first-day-of-the-month Python 没有直接地方法获取某月的第一天,但只需要一些 ...
- 在哪里能收到python实例代码-Python找出最小的K个数实例代码
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复 ...
- Python找出列表中出现次数最多的元素三种方式
通过三种方式给大家介绍,具体详情如下所示: 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key,值为列表中 ...
- linux 端口tnpl,利用Python找出9个连续的空闲端口
这篇文章主要介绍了Python找出9个连续的空闲端口的方法,感兴趣的小伙伴们可以参考一下 一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为window ...
- python找出某个文件夹下某个后缀的文件
python找出某个文件夹下某个后缀的文件 import osdef find_files_with_suffix(folder_path, suffix):# 使用os模块获取文件夹中所有文件的路径 ...
- python找最长的单词,Python 找出英文单词列表(list)中最长单词链
这篇文章主要介绍了Python 找出英文单词列表(list)中最长单词链,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本文主要 ...
- Python -- 找出100以内的所有质数
Python – 找出100以内的所有质数 质数:除了1和本身没有其他因数 i=2 for i in range(2,100): # 取i从2开始,2 最小的质数for j in range(2,i) ...
最新文章
- SVM算法实现光学字符识别
- SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明
- Systemd:再一次的,回归第一进程
- d029: 求出2-100之间的所有质数(素数)
- 示例在同一台机器上使用RMAN克隆数据库
- 20190429 照片里面的GPS信息确实会暴露经纬度
- MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...
- [css] 写出几个初始化CSS的样式,并解释说明为什么要这样写
- python爬silverlight_Python创建Silverlight控件编写过程经验分享
- 大数据时代最值得关注的15大技术趋势
- django报错:ImproperlyConfigured和AppRegistryNotReady
- azure虚拟服务器,虚拟机系列
- english grammar in use 电子版_③ 采购笔记之节点与凭证、采购的进阶、采购合同要素。(电子版整理中)...
- 关于SCM供应链管理系统开发思路
- 制造行业mes使用说明书_mes系统操作手册完整版
- Android2018年最新前沿框架和技术
- 兼容iOS10 的一些整理
- Kotlin版注解处理器Annotation Processor
- 透过爷爷的一生,浅析选择的重要性
- Excel自动输入当前时间的公式
热门文章
- JavaScript性能优化【上】-- 内存管理、垃圾回收
- 【Python】蟒蛇绘制(三种方式+import用法)
- C do...while 循环
- 如何设置VSCode以提高生产力
- 微软hackathon_Hackathon报告:30小时内您可以编写什么代码? 非常多!
- python解决Net Frameword匹配问题及Failed building wheel for XXX
- 美女面试官问我Python如何优雅的创建临时文件,我的回答....
- clickhouse 获取几天前的日期
- Python队列完成多进程间通信
- Redis与python交互