【图像】imagededup照片去重(感知哈希,汉明距离)
代碼使用:
Imagededup 官方地址 https://idealo.github.io/imagededup/
顯示一張給定照片的重復(fù)子集:
返回重復(fù)文件的列表:
duplicates = phasher.find_duplicates_to_remove(encoding_map=encodings) # 后面可以將 duplicates 從舊目錄移至新目錄,完成去重操作 for i in range(len(duplicates)):shutil.move(oldPath + '/' + duplicates[i], newPath + '/' + duplicates[i])更多實(shí)例見:
https://blog.csdn.net/weixin_43886133/article/details/114113027
https://www.cnblogs.com/xiaodai0/p/11646646.html
算法流程:
(1)首先對(duì)原始圖像進(jìn)行編碼(生成64位0或1值),可選算法如下:
(2)對(duì)編碼后的照片,兩兩計(jì)算漢明距離(不同位的個(gè)數(shù):1011101 與 1001001 之間的漢明距離是 2)。如果這個(gè)值為0,則表示這兩張圖片非常相似,如果漢明距離小于5,則表示有些不同,但比較相近,如果漢明距離大于10則表明完全不同的圖片。
(3)設(shè)置閾值(0-64),提取出針對(duì)某張照片的重復(fù)照片。
哈希算法細(xì)節(jié):
-
均值哈希
1)縮小尺寸:去除高頻和細(xì)節(jié)的最快方法是縮小圖片,將圖片縮小到8x8的尺寸,總共64個(gè)像素。不要保持縱橫比,只需將其變成8*8的正方形。這樣就可以比較任意大小的圖片,摒棄不同尺寸、比例帶來的圖片差異。
2)簡化色彩:將8*8的小圖片轉(zhuǎn)換成灰度圖像。
3)計(jì)算平均值:計(jì)算所有64個(gè)像素的灰度平均值。
4)比較像素的灰度:將每個(gè)像素的灰度,與平均值進(jìn)行比較。大于或等于平均值,記為1;小于平均值,記為0。
5)計(jì)算hash值:將上一步的比較結(jié)果,組合在一起,就構(gòu)成了一個(gè)64位的整數(shù),這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。(我設(shè)置的是從左到右,從上到下用二進(jìn)制保存)。
注:均值哈希算法主要是利用圖片的低頻信息。一張圖片就是一個(gè)二維信號(hào),它包含了不同頻率的成分。亮度變化小的區(qū)域是低頻成分,它描述大范圍的信息。而亮度變化劇烈的區(qū)域(比如物體的邊緣)就是高頻的成分,它描述具體的細(xì)節(jié)。詳細(xì)的圖片有很高的頻率,而小圖片缺乏圖像細(xì)節(jié),所以都是低頻的。所以我們平時(shí)的下采樣,也就是縮小圖片的過程,實(shí)際上是損失高頻信息的過程。
-
感知哈希
均值哈希雖然簡單,但受均值的影響非常大。例如對(duì)圖像進(jìn)行伽馬校正或直方圖均衡就會(huì)影響均值,從而影響最終的hash值。存在一個(gè)更健壯的算法叫pHash。它將均值的方法發(fā)揮到極致。使用離散余弦變換(DCT)來獲取圖片的低頻成分。
離散余弦變換(DCT)是種圖像壓縮算法,它將圖像從像素域變換到頻率域。然后一般圖像都存在很多冗余和相關(guān)性的,所以轉(zhuǎn)換到頻率域之后,只有很少的一部分頻率分量的系數(shù)才不為0,大部分系數(shù)都為0(或者說接近于0)。下圖的右圖是對(duì)lena圖進(jìn)行離散余弦變換(DCT)得到的系數(shù)矩陣圖。從左上角依次到右下角,頻率越來越高,由圖可以看到,左上角的值比較大,到右下角的值就很小很小了。換句話說,圖像的能量幾乎都集中在左上角這個(gè)地方的低頻系數(shù)上面了。
1)縮小尺寸:pHash以小圖片開始,但圖片大于88,3232是最好的。這樣做的目的是簡化了DCT的計(jì)算,而不是減小頻率。
2)簡化色彩:將圖片轉(zhuǎn)化成灰度圖像,進(jìn)一步簡化計(jì)算量。
3)計(jì)算DCT:計(jì)算圖片的DCT變換,得到32*32的DCT系數(shù)矩陣。
4)縮小DCT:雖然DCT的結(jié)果是3232大小的矩陣,但我們只要保留左上角的88的矩陣,這部分呈現(xiàn)了圖片中的最低頻率。
5)計(jì)算平均值:如同均值哈希一樣,計(jì)算DCT的均值。
6)計(jì)算hash值:這是最主要的一步,根據(jù)8*8的DCT矩陣,設(shè)置0或1的64位的hash值,大于等于DCT均值的設(shè)為”1”,小于DCT均值的設(shè)為“0”。組合在一起,就構(gòu)成了一個(gè)64位的整數(shù),這就是這張圖片的指紋。
結(jié)果并不能告訴我們真實(shí)性的低頻率,只能粗略地告訴我們相對(duì)于平均值頻率的相對(duì)比例。只要圖片的整體結(jié)構(gòu)保持不變,hash結(jié)果值就不變。能夠避免伽馬校正或顏色直方圖被調(diào)整帶來的影響。
與均值哈希一樣,pHash同樣可以用漢明距離來進(jìn)行比較。(只需要比較每一位對(duì)應(yīng)的位置并算計(jì)不同的位的個(gè)數(shù))
猜你喜歡:👇🏻
?【圖像】jpg與jpeg的區(qū)別
?【圖像】一個(gè)像素占幾個(gè)字節(jié)?多少比特?
?【圖像】插值方法原理(最近鄰,雙線性,雙三,蘭索斯)
總結(jié)
以上是生活随笔為你收集整理的【图像】imagededup照片去重(感知哈希,汉明距离)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言数组如何把一串数字存入数组_C语言
- 下一篇: 【Python】函数默认参数怎么改变?