最近公司開(kāi)發(fā)涉及到圖像相似度,記錄一下相關(guān)的算法,后期還會(huì)持續(xù)更新......
直方圖
方法描述:有兩幅圖像patch(當(dāng)然也可是整幅圖像),分別計(jì)算兩幅圖像的直方圖饲齐,并將直方圖進(jìn)行歸一化,然后按照某種距離度量的標(biāo)準(zhǔn)進(jìn)行相似度的測(cè)量咧最。
方法的思想:基于簡(jiǎn)單的向量相似度來(lái)對(duì)圖像相似度進(jìn)行度量捂人。
優(yōu)點(diǎn):直方圖能夠很好的歸一化,比如256個(gè)bin條矢沿,那么即使是不同分辨率的圖像都可以直接通過(guò)其直方圖來(lái)計(jì)算相似度滥搭,計(jì)算量適中。比較適合描述難以自動(dòng)分割的圖像捣鲸。
缺點(diǎn):直方圖反應(yīng)的是圖像灰度值得概率分布瑟匆,并沒(méi)有圖像的空間位置信息在里面,因此栽惶,常常出現(xiàn)誤判愁溜;從信息論來(lái)講,通過(guò)直方圖轉(zhuǎn)換外厂,信息丟失量較大冕象,因此單一的通過(guò)直方圖進(jìn)行匹配顯得有點(diǎn)力不從心。
圖像模板匹配
(包括多種算法汁蝶,例如平均絕對(duì)差算法(MAD)渐扮、絕對(duì)誤差和算法(SAD)、誤差平方和算法(SSD)、平均誤差平方和算法(MSD)墓律、歸一化積相關(guān)算法(NCC)意荤、序貫相似性檢測(cè)算法(SSDA)、hadamard變換算法(SATD)只锻,具體可以參考該blog:https://blog.csdn.net/KYJL888/article/details/81480494)
一般而言,源圖像與模板圖像patch尺寸一樣的話紫谷,可以直接使用上面介紹的圖像相似度測(cè)量的方法齐饮;如果源圖像與模板圖像尺寸不一樣,通常需要進(jìn)行滑動(dòng)匹配窗口(從左到右)笤昨,掃面?zhèn)€整幅圖像獲得最好的匹配patch祖驱。
在OpenCV中對(duì)應(yīng)的函數(shù)為:matchTemplate():函數(shù)功能是在輸入圖像中滑動(dòng)窗口尋找各個(gè)位置與模板圖像patch的相似度。
PSNR峰值信噪比
PSNR(Peak Signal to Noise Ratio)瞒窒,一種全參考的圖像質(zhì)量評(píng)價(jià)指標(biāo)捺僻。
簡(jiǎn)介:https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
PSNR是最普遍和使用最為廣泛的一種圖像客觀評(píng)價(jià)指標(biāo),然而它是基于對(duì)應(yīng)像素點(diǎn)間的誤差崇裁,即基于誤差敏感的圖像質(zhì)量評(píng)價(jià)匕坯。由于并未考慮到人眼的視覺(jué)特性(人眼對(duì)空間頻率較低的對(duì)比差異敏感度較高,人眼對(duì)亮度對(duì)比差異的敏感度較色度高拔稳,人眼對(duì)一個(gè)區(qū)域的感知結(jié)果會(huì)受到其周圍鄰近區(qū)域的影響等)葛峻,因而經(jīng)常出現(xiàn)評(píng)價(jià)結(jié)果與人的主觀感覺(jué)不一致的情況。PSNR算法簡(jiǎn)單巴比,檢查的速度也很快术奖。但是其呈現(xiàn)的差異值有時(shí)候和人的主觀感受不成比例。
SSIM結(jié)構(gòu)相似性
也是一種全參考的圖像質(zhì)量評(píng)價(jià)指標(biāo)轻绞,它分別從亮度采记、對(duì)比度、結(jié)構(gòu)三方面度量圖像相似性政勃。
SSIM取值范圍[0,1]唧龄,值越大,表示圖像失真越小.
在實(shí)際應(yīng)用中稼病,可以利用滑動(dòng)窗將圖像分塊选侨,令分塊總數(shù)為N,考慮到窗口形狀對(duì)分塊的影響然走,采用高斯加權(quán)計(jì)算每一窗口的均值援制、方差以及協(xié)方差,然后計(jì)算對(duì)應(yīng)塊的結(jié)構(gòu)相似度SSIM芍瑞,最后將平均值作為兩圖像的結(jié)構(gòu)相似性度量晨仑,即平均結(jié)構(gòu)相似性MSSIM
分別為x,y的均值,
分別為x,y的方差以及協(xié)方差。c1與c2用來(lái)維持穩(wěn)定的常數(shù)洪己。
感知哈希算法
具體可見(jiàn)新更新的感知哈希算法(http://www.reibang.com/p/ad7131f7999b)
(perceptual hash algorithm)
http://blog.csdn.net/fengbingchun/article/details/42153261
感知哈希算法(perceptual hash algorithm)妥凳,它的作用是對(duì)每張圖像生成一個(gè)“指紋”(fingerprint)字符串,然后比較不同圖像的指紋答捕。結(jié)果越接近逝钥,就說(shuō)明圖像越相似。
實(shí)現(xiàn)步驟:
- 縮小尺寸:將圖像縮小到8*8的尺寸拱镐,總共64個(gè)像素艘款。這一步的作用是去除圖像的細(xì)節(jié),只保留結(jié)構(gòu)/明暗等基本信息沃琅,摒棄不同尺寸/比例帶來(lái)的圖像差異
- 簡(jiǎn)化色彩:將縮小后的圖像哗咆,轉(zhuǎn)為64級(jí)灰度,即所有像素點(diǎn)總共只有64種顏色益眉;
- 計(jì)算平均值:計(jì)算所有64個(gè)像素的灰度平均值晌柬;
- 比較像素的灰度:將每個(gè)像素的灰度,與平均值進(jìn)行比較郭脂,大于或等于平均值記為1年碘,小于平均值記為0;
- 計(jì)算哈希值:將上一步的比較結(jié)果朱庆,組合在一起盛泡,就構(gòu)成了一個(gè)64位的整數(shù),這就是這張圖像的指紋娱颊。組合的次序并不重要傲诵,只要保證所有圖像都采用同樣次序就行了;
- 得到指紋以后箱硕,就可以對(duì)比不同的圖像拴竹,看看64位中有多少位是不一樣的。在理論上剧罩,這等同于”漢明距離”(Hamming distance,在信息論中栓拜,兩個(gè)等長(zhǎng)字符串之間的漢明距離是兩個(gè)字符串對(duì)應(yīng)位置的不同字符的個(gè)數(shù))。如果不相同的數(shù)據(jù)位數(shù)不超過(guò)5惠昔,就說(shuō)明兩張圖像很相似幕与;如果大于10,就說(shuō)明這是兩張不同的圖像镇防。
尺度不變特征轉(zhuǎn)換(Scale-invariant feature transform或SIFT)算法
SIFT算子是把圖像中檢測(cè)到的特征點(diǎn)用一個(gè)128維的特征向量進(jìn)行描述啦鸣,因此一幅圖像經(jīng)過(guò)SIFT算法后表示為一個(gè)128維的特征向量集,該特征向量集具有對(duì)圖像縮放来氧,平移诫给,旋轉(zhuǎn)不變的特征香拉,對(duì)于光照、仿射和投影變換也有一定的不變中狂。
SIFT算法的流程分別為:
i. 尺度空間極點(diǎn)檢測(cè)凫碌;
ii. 關(guān)鍵點(diǎn)精確定位;
iii. 關(guān)鍵點(diǎn)的方向確定胃榕;
iv. 特征向量的生成盛险。
具體可以看看該博客:
https://blog.csdn.net/lhanchao/article/details/52345845
*哈希算法包括均值哈希、感知哈希和差值哈希勋又,OpenCV均提供算法枉层,支持多種語(yǔ)言,另外還有一個(gè)javaCV功能也是很強(qiáng)大赐写。
以上內(nèi)容參考自:阮一峰
http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html