使用python opencv對(duì)目錄下圖片進(jìn)行去重的方法
版本:
平臺(tái):ubuntu 14 / I5 / 4G內(nèi)存
python版本:python2.7
opencv版本:2.13.4
依賴:
如果系統(tǒng)沒有python,則需要進(jìn)行安裝
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
使用感知哈希算法進(jìn)行圖片去重
原理:對(duì)每個(gè)文件進(jìn)行遍歷所有進(jìn)行去重,因此圖片越多速度越慢,但是可以節(jié)省手動(dòng)操作
感知哈希原理:
1、需要比較的圖片都縮放成8*8大小的灰度圖
2、獲得每個(gè)圖片每個(gè)像素與平均值的比較,得到指紋
3、根據(jù)指紋計(jì)算漢明距離
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)
為了節(jié)省操作,遍歷所有目錄,把想要去重的目錄遍歷一遍
#!/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對(duì)目錄下圖片進(jìn)行去重的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
numpy矩陣乘法中的multiply,matmul和dot的使用
本文主要介紹了numpy矩陣乘法中的multiply,matmul和dot的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02python 兩個(gè)數(shù)據(jù)庫postgresql對(duì)比
這篇文章主要介紹了python 兩個(gè)數(shù)據(jù)庫postgresql對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10用Python實(shí)現(xiàn)局域網(wǎng)控制電腦
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)局域網(wǎng)控制電腦,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Python字典推導(dǎo)式將cookie字符串轉(zhuǎn)化為字典解析
這篇文章主要介紹了Python字典推導(dǎo)式將cookie字符串轉(zhuǎn)化為字典解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Pytorch實(shí)現(xiàn)List?Tensor轉(zhuǎn)Tensor,reshape拼接等操作
這篇文章主要介紹了Pytorch實(shí)現(xiàn)List?Tensor轉(zhuǎn)Tensor,reshape拼接等操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11