jd 2018/8/12 將收集到的多方來源的圖片樣本進行圖片去重處理,刪除每個文件夾中一樣的圖片

一般採用均值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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章