python圖像去重及相似度估計(jì)

數(shù)據(jù)不足,于是就從網(wǎng)上找了個(gè)爬蟲的代碼,爬了一些數(shù)據(jù)下來(lái),不甚欣喜,然后就開始篩選,篩著篩著發(fā)現(xiàn)有的圖片長(zhǎng)的好像哦,然后就按照大小排了序,我的媽呀,一排排都是一樣樣的,這必須先把重復(fù)的圖像都去掉啊。
查了一下,可以用md5算法來(lái)做,感覺(jué)這個(gè)思路挺巧妙的,md5本身是來(lái)做校驗(yàn)的,在一定程度上,可以說(shuō)是唯一的,所以可以通過(guò)計(jì)算每一個(gè)圖像的md5值,如果相同就認(rèn)為是一樣的,就移除。

import hashlib
def remove_same_piture_by_get_md5(path):
    img_list = os.listdir(path)
    print(img_list)
    md5_list =[]
    for filename in img_list:
        m = hashlib.md5()
        mfile = open(os.path.join(path,filename), "rb")
        m.update(mfile.read())
        mfile.close()
        md5_value = m.hexdigest()
        #print(md5_value)
        if (md5_value in md5_list):
            os.remove(os.path.join(path,filename))
        else:
            md5_list.append(md5_value)
            print('total %s images'%len(md5_list))

在處理視頻序列的時(shí)候,發(fā)現(xiàn)由于幀率很高,很多圖像都是相似的,那么相似的圖像重復(fù)標(biāo)注,太累了,所以就想找個(gè)相似性度量的方式去除一部分。
初步想法. 簡(jiǎn)單粗暴的隔幾幀抽一張,確實(shí)是又快又好。但是覺(jué)得,對(duì)一個(gè)程序猿來(lái)說(shuō),是不是要用點(diǎn)更好大上的算法。然后就搜了一下。
最后選了兩種
1.感知哈希算法
思路很簡(jiǎn)單,就是給每一幅圖提取特征(這個(gè)特征是64位的二進(jìn)制數(shù)值,然后比較這些特征的不同,有多少位不同就定義成不同的文件)
具體步驟:
1.將圖像resize成8*8的灰度縮略圖,計(jì)算縮略圖均值。
2.將縮略圖的值與均值比較,大的為1,小的為0。得到定義的圖像哈希值。

  1. 比較圖像的哈希值,如果有五位不同,就認(rèn)為是不同的,否則相同。
    2.基于結(jié)構(gòu)相似度的
    其實(shí)還有基于灰度直方圖的,自己覺(jué)得不太靠譜,就沒(méi)用。還有基于sift的,感覺(jué)很難算,折中選了用結(jié)構(gòu)相似度的,這個(gè)的話直接調(diào)用了 skimage.measure 中的 compare_ssim。又是一鍵解決。然后,自己思考了一下,比較相似度的話,只要和前面五張比就好了,太多的意義不大,反倒是增加了損耗。還是要增加約束。
def remove_simillar_picture_by_perception_hash(path):
    img_list = os.listdir(path)
    hash_dic = {}
    hash_list = []
    count_num = 0
    for img_name in img_list:
        try:
            img = cv2.imread(os.path.join(path, img_name))
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            count_num+=1
            print(count_num)
        except:
            continue


        img = cv2.resize(img,(8,8))

        avg_np = np.mean(img)
        img = np.where(img>avg_np,1,0)
        hash_dic[img_name] = img
        if len(hash_list)<1:
            hash_list.append(img)
        else:
            for i in hash_list:
                flag = True
                dis = np.bitwise_xor(i,img)

                if np.sum(dis) < 5:
                    flag = False
                    os.remove(os.path.join(path, img_name))
                    break
            if flag:
                hash_list.append(img)

def remove_simillar_image_by_ssim(path):
    img_list = os.listdir(path)
    img_list.sort()
    hash_dic = {}
    save_list = []
    count_num = 0
    for i in range(len(img_list)):
        try:
            img = cv2.imread(os.path.join(path, img_list[i]))
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            img = cv2.resize(img,(256, 256))
            count_num+=1
        except:
            continue
        if count_num==1:
            save_list.append(img_list[i])
            continue
        elif len(save_list) <5:
            flag = True
            for j in range(len(save_list)):
                com_img = cv2.imread(os.path.join(path,save_list[j]))
                com_img = cv2.cvtColor(com_img,cv2.COLOR_BGR2GRAY)
                com_img = cv2.resize(com_img,(256,256))
                sim = compare_ssim(img,com_img)
                if sim > 0.4:
                    os.remove(os.path.join(path,img_list[i]))
                    flag = False
                    break
            if flag:
                save_list.append(img_list[i])
        else:
            for save_img in save_list[-5:]:
                com_img = cv2.imread(os.path.join(path,save_img))
                com_img = cv2.cvtColor(com_img, cv2.COLOR_BGR2GRAY)
                com_img = cv2.resize(com_img, (256, 256))
                sim = compare_ssim(img,com_img)
                if sim > 0.4:
                    os.remove(os.path.join(path,img_list[i]))
                    flag = False
                    break
            if flag:
                save_list.append(img_list[i])

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容