使用python opencv對目錄下圖片進行去重的方法
版本:
平臺:ubuntu 14 / I5 / 4G內(nèi)存
python版本:python2.7
opencv版本:2.13.4
依賴:
如果系統(tǒng)沒有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
使用感知哈希算法進行圖片去重
原理:對每個文件進行遍歷所有進行去重,因此圖片越多速度越慢,但是可以節(jié)省手動操作
感知哈希原理:
1、需要比較的圖片都縮放成8*8大小的灰度圖
2、獲得每個圖片每個像素與平均值的比較,得到指紋
3、根據(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對目錄下圖片進行去重的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
numpy矩陣乘法中的multiply,matmul和dot的使用
本文主要介紹了numpy矩陣乘法中的multiply,matmul和dot的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02python 兩個數(shù)據(jù)庫postgresql對比
這篇文章主要介紹了python 兩個數(shù)據(jù)庫postgresql對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10Pytorch實現(xiàn)List?Tensor轉Tensor,reshape拼接等操作
這篇文章主要介紹了Pytorch實現(xiàn)List?Tensor轉Tensor,reshape拼接等操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11