一般採用均值hass值+漢明距離的方法:即獲取全圖像素平均值,然後比較,獲得(0,1分佈),然後轉化爲16進制,計算每張圖與這些值得漢明距離 2)這裏優化了算法,取每行像素的平均值,然後對 import cv2 import matplotlib.pyplot as plt import os import numpy as np # 計算方差 def getss(list): # 計算平均值 avg = sum(list) / len(list) # 定義方差變量ss,初值爲0 ss = 0 # 計算方差 for l in list: ss += (l - avg) * (l - avg) / len(list) # 返回方差 return ss # 獲取每行像素平均值 def getdiff(img): # 定義邊長 Sidelength = 8 # 縮放圖像 img = cv2.resize(img, (Sidelength, Sidelength), interpolation=cv2.INTER_CUBIC) # 灰度處理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # avglist列表保存每行像素平均值 avglist = [] # 計算每行均值,保存到avglist列表 for i in range(Sidelength): avg = sum(gray[i]) / len(gray[i]) avglist.append(avg) # 返回avglist平均值 return avglist # 讀取測試圖片 path = 'D:\\JDNetDiskDownload\\data\\result' for dirpath, dirnames, filenames in os.walk(path): # 目錄路徑,目錄名稱,文件名稱(全稱) list = [] for filename in filenames: # 遍歷主文件夾下所有的文件名稱,此時filename代表文件名稱 path = dirpath + '\\' + filename print(filename) # print(type(dirpath + '\\'+filename)) # print(os.path.join(dirpath,filename)) # print(filename) # img = cv2.imread(path) img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED) # img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1) gtess = getss(getdiff(img)) list.append(gtess) print(list) for i in range(len(list)): # break print('i=', i) # print('i中的list長度:', len(list)) a = [] for j in range(i + 1, len(list) + 1): # 此處列表的長度是實時更新的,range不會隨列表元素變化進行更新變化進行實時更新 # print('j中的list=', len(list)) # print('a=', a) #print('j=', j) if len(list) <= j: print('超出範圍!!!!!!!!!!!!!!!') f=0 for c in range(len(a)): b = a[c] print('b====', b) print('前list:', list) del list[b-f] f=f+1 # -------------------------------------------------------------------------------- #查了一下午,終於知道哪有問題了,這裏仍涉及列表元素個數的問題,每次循環刪除一個元素,導致其列表長度減小了1,其元素的索引序號應該發生變化 print('刪除後的list:', list) break elif abs(list[i] - list[j]) < 10: print('有相同的!!') # 遍歷文件夾,刪除方差值與列表中的方差值相同的照片 # 遍歷文件夾,獲取其方差值 for filename in filenames: print(filename) path = dirpath + '\\' + filename img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED) gtess = getss(getdiff(img)) # 當檢索到的圖片方差值等於列表中某個方差時,刪除該圖片 if gtess == float(list[j]): os.remove(path) filenames.remove(filename) # del list[j] a.append(j) # 這裏是爲了將已經刪除目標文件的列表元素序號加入新列表中,後面進行一次刪除 # 若刪除一次目標文件就刪除一次元素,會出現元素檢索時跳項的問題 print('a===', a) print('刪除:', path) # print('list=', len(list)) # print('j=', j) break else: continue
jd 2018/8/12 將收集到的多方來源的圖片樣本進行圖片去重處理,刪除每個文件夾中一樣的圖片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.