1、基於低頻的均值雜湊
一張就是乙個二維訊號,它包含了不同頻率的成分。如下圖所示,亮度變化小的區域是低頻成分,它描述大範圍的資訊。而亮度變化劇烈的區域(比如物體的邊緣)就是高頻的成分,它描述具體的細節。或者說高頻可以提供詳細的資訊,而低頻可以提供乙個框架。
而一張大的,詳細的有很高的頻率,而小缺乏影象細節,所以都是低頻的。所以我們平時的下取樣,也就是縮小的過程,實際上是損失高頻資訊的過程。
均值雜湊演算法主要是利用的低頻資訊,其工作過程如下:
(1)縮小尺寸:去除高頻和細節的最快方法是縮小,將縮小到8x8的尺寸,總共64個畫素。不要保持縱橫比,只需將其變成8*8的正方形。這樣就可以比較任意大小的,摒棄不同尺寸、比例帶來的差異。
(2)簡化色彩:將8*8的小轉換成灰度影象。
(3)計算平均值:計算所有64個畫素的灰度平均值。
(4)比較畫素的灰度:將每個畫素的灰度,與平均值進行比較。大於或等於平均值,記為1;小於平均值,記為0。
(5)計算hash值:將上一步的比較結果,組合在一起,就構成了乙個64位的整數,這就是這張的指紋。組合的次序並不重要,只要保證所有都採用同樣次序就行了。(我設定的是從左到右,從上到下用二進位制儲存)。
計算乙個的hash指紋的過程就是這麼簡單。剛開始的時候覺得這樣就損失了的很多資訊了,居然還能有效。簡單的演算法也許存在另一種美。如果放大或縮小,或改變縱橫比,結果值也不會改變。增加或減少亮度或對比度,或改變顏色,對hash值都不會太大的影響。最大的優點:計算速度快!
這時候,比較兩個的相似性,就是先計算這兩張的hash指紋,也就是64位0或1值,然後計算不同位的個數(漢明距離)。如果這個值為0,則表示這兩張非常相似,如果漢明距離小於5,則表示有些不同,但比較相近,如果漢明距離大於10則表明完全不同的。
//均值hash演算法
string hashvalue(mat &src)
else
//2,將縮小到8x8的尺寸,總共64個畫素,去除的細節
resize(img, img, size(8, 8));
/*3,計算平均值。*/
for (int i = 0; i < 8; ++i)
} /* 4,計算雜湊值,將每個畫素的灰度,與平均值進行比較。大於或等於平均值記為1,小於平均值記為0*/
for (int i = 0; i<64; ++i)
else
}return rst;
}
2、增強版:phash均值雜湊雖然簡單,但受均值的影響非常大。例如對影象進行伽馬校正或直方圖均衡就會影響均值,從而影響最終的hash值。存在乙個更健壯的演算法叫phash。它將均值的方法發揮到極致。使用離散余弦變換(dct)來獲取的低頻成分。
離散余弦變換(dct)是種影象壓縮演算法,它將影象從畫素域變換到頻率域。然後一般影象都存在很多冗餘和相關性的,所以轉換到頻率域之後,只有很少的一部分頻率分量的係數才不為0,大部分係數都為0(或者說接近於0)。下圖的右圖是對lena圖進行離散余弦變換(dct)得到的係數矩陣圖。從左上角依次到右下角,頻率越來越高,由圖可以看到,左上角的值比較大,到右下角的值就很小很小了。換句話說,影象的能量幾乎都集中在左上角這個地方的低頻係數上面了。
phash的工作過程如下:
(1)縮小尺寸:phash以小開始,但大於8*8,32*32是最好的。這樣做的目的是簡化了dct的計算,而不是減小頻率。
(2)簡化色彩:將轉化成灰度影象,進一步簡化計算量。
(3)計算dct:計算的dct變換,得到32*32的dct係數矩陣。
(4)縮小dct:雖然dct的結果是32*32大小的矩陣,但我們只要保留左上角的8*8的矩陣,這部分呈現了中的最低頻率。
(5)計算平均值:如同均值雜湊一樣,計算dct的均值。
(6)計算hash值:這是最主要的一步,根據8*8的dct矩陣,設定0或1的64位的hash值,大於等於dct均值的設為」1」,小於dct均值的設為「0」。組合在一起,就構成了乙個64位的整數,這就是這張的指紋。
結果並不能告訴我們真實性的低頻率,只能粗略地告訴我們相對於平均值頻率的相對比例。只要的整體結構保持不變,hash結果值就不變。能夠避免伽馬校正或顏色直方圖被調整帶來的影響。
與均值雜湊一樣,phash同樣可以用漢明距離來進行比較。(只需要比較每一位對應的位置並算計不同的位的個數)
//phash演算法
string phashvalue(mat &src)
else
/* 2,縮放尺寸*/
resize(img, img, size(32, 32));
/* 3,離散余弦變換,dct係數求取*/
dct(img, dst);
/* 4,求取dct係數均值(左上角8*8區塊的dct係數)*/
for (int i = 0; i < 8; ++i)
} /* 5,計算雜湊值。*/
for (int i = 0; i<64; ++i)
else
}return rst;
}
感知機原理及python實現
感知機python實現 給定乙個資料集 t yi 輸入空間中任意一點x0 到超平面s的距離為 1 w yi w x0 b 這裡 w 是 w的l2 範數 假 設超平面 s的誤分 點集合為 m,那麼 所有誤分 點到超平 面s的總 距離為 1 w xi myi w xi b 在不考慮 1 w 的情 況下得...
感知雜湊演算法
感知雜湊演算法是一類雜湊演算法的總稱,其作用在於生成每張影象的 指紋 fingerprint 字串,比較不同影象的指紋資訊來判斷影象的相似性。結果越接近影象越相似。感知雜湊演算法包括均值雜湊 ahash 感知雜湊 phash 和dhash 差異值雜湊 ahash速度較快,但精確度較低 phash則反...
感知雜湊演算法
感知雜湊演算法 perceptual hash algorithm 它的作用是對每張生成乙個 指紋 fingerprint 字串,然後比較不同的指紋。結果越接近,就說明越相似。缺點 的內容不能更改。hash演算法原理 第一步,縮小尺寸。將縮小到8 8的尺寸,總共64個畫素。這一步的作用是去除的細節,...