您好,登錄后才能下訂單哦!
這篇文章主要介紹了python Opencv計(jì)算圖像相似度過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
一、相關(guān)概念
一般我們?nèi)藚^(qū)分誰是誰,給物品分類,都是通過各種特征去辨別的,比如黑長直、大白腿、櫻桃唇、瓜子臉。王麻子臉上有麻子,隔壁老王和兒子很像,但是兒子下巴漲了一顆痣和他媽一模一樣,讓你確定這是你兒子。
還有其他物品、什么桌子帶腿、鏡子反光能在里面倒影出東西,各種各樣的特征,我們通過學(xué)習(xí)、歸納,自然而然能夠很快識(shí)別分類出新物品。
而沒有學(xué)習(xí)訓(xùn)練過的機(jī)器就沒辦法了。
但是圖像是一個(gè)個(gè)像素點(diǎn)組成的,我們就可以通過不同圖像之間這些差異性就判斷兩個(gè)圖的相似度了。其中顏色特征是最常用的,(其余常用的特征還有紋理特征、形狀特征和空間關(guān)系特征等)
其中又分為
1、直方圖
在Python中利用opencv中的calcHist()方法獲取其直方圖數(shù)據(jù),返回的結(jié)果是一個(gè)列表,使用matplotlib,畫出了這兩張圖的直方圖數(shù)據(jù)圖
import cv2 import numpy from matplotlib import pyplot if __name__ == '__main__': imgobj1 = cv2.imread('pho.jpg') imgobj2 = cv2.imread('ph2.jpg') hist1 = cv2.calcHist([imgobj1], [0], None, [256], [0.0, 255.0]) hist2 = cv2.calcHist([imgobj2], [0], None, [256], [0.0, 255.0]) pyplot.plot(range(256), hist1, 'r') pyplot.plot(range(256), hist2, 'b') pyplot.show() cv2.imshow('img1',imgobj1) cv2.imshow('img2',imgobj2) cv2.waitKey(0)
1.2 灰度圖及作用
灰度圖是只含有黑白顏色,和0~255亮度等級(jí)的圖片。灰度圖具有存儲(chǔ)小,其亮度值就是256色調(diào)色板索引號(hào),從整幅圖像的整體和局部的色彩以及亮度等級(jí)分布特征來看,灰度圖描述與彩色圖的描述是一致的特點(diǎn)。因此很多真彩色圖片的分析,第一步就是轉(zhuǎn)換為灰度圖,然后再進(jìn)行分析。
真彩色,因?yàn)槭?4位,2(^8) * 2(^8)* 2(^8) = 16777216種顏色,需要調(diào)色板16777216 * 4byte字節(jié)的空間也就是64MB的調(diào)色板空間,所以真彩色是不用調(diào)色板的。
例如視頻目標(biāo)跟蹤和識(shí)別時(shí),第一步就是要轉(zhuǎn)換為灰度圖?,F(xiàn)有的成熟分析算法多是基于灰度圖像的,灰度圖像綜合了真彩色位圖的RGB各通道的信息。
(一):單通道圖,
俗稱灰度圖,每個(gè)像素點(diǎn)只能有有一個(gè)值表示顏色,它的像素值在0到255之間,0是黑色,255是白色,中間值是一些不同等級(jí)的灰色。(也有3通道的灰度圖,3通道灰度圖只有一個(gè)通道有值,其他兩個(gè)通道的值都是零)。
(二):三通道圖,每個(gè)像素點(diǎn)都有3個(gè)值表示 ,所以就是3通道。也有4通道的圖。例如RGB圖片即為三通道圖片,RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過對紅(R)、綠(G)、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色,是目前運(yùn)用最廣的顏色系統(tǒng)之一??傊?,每一個(gè)點(diǎn)由三個(gè)值表示。
直方圖判斷相似度,如上圖,就算重合度即可
1.3 圖像指紋和漢明距離
圖像指紋:
和人的指紋一樣,是身份的象征,而圖像指紋簡單點(diǎn)來講,就是將圖像按照一定的哈希算法,經(jīng)過運(yùn)算后得出的一組二進(jìn)制數(shù)字。
漢明距離:
假如一組二進(jìn)制數(shù)據(jù)為101,另外一組為111,那么顯然把第一組的第二位數(shù)據(jù)0改成1就可以變成第二組數(shù)據(jù)111,所以兩組數(shù)據(jù)的漢明距離就為1
簡單點(diǎn)說,漢明距離就是一組二進(jìn)制數(shù)據(jù)變成另一組數(shù)據(jù)所需的步驟數(shù),顯然,這個(gè)數(shù)值可以衡量兩張圖片的差異,漢明距離越小,則代表相似度越高。漢明距離為0,即代表兩張圖片完全一樣。
1.3.1 平均哈希
此算法是基于比較灰度圖每個(gè)像素與平均值來實(shí)現(xiàn)的
一般步驟:
import cv2 import numpy as np img1 = cv2.imread("/absPath.png") img2 = cv2.imread("./x.png") #調(diào)整到8*8 img1 = cv2.resize(img1,(8,8)) img2 = cv2.resize(img2,(8,8)) #轉(zhuǎn)化為灰度圖 gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) #獲取哈希 hash2 = getHash(gray1) hash3 = getHash(gray2) ret = Hamming_distance(hash2,hash3) # 輸入灰度圖,返回hash def getHash(image): avreage = np.mean(image) #計(jì)算像素平均值 hash = [] for i in range(image.shape[0]): for j in range(image.shape[1]): if image[i, j] > avreage: hash.append(1) else: hash.append(0) return hash # 計(jì)算漢明距離 def Hamming_distance(hash2, hash3): num = 0 for index in range(len(hash2)): if hash2[index] != hash3[index]: num += 1 return num
1.3.2 感知哈希及d哈希
感知哈希算法(pHash)
平均哈希算法過于嚴(yán)格,不夠精確,更適合搜索縮略圖,為了獲得更精確的結(jié)果可以選擇感知哈希算法,它采用的是DCT(離散余弦變換)來降低頻率的方法
一般步驟:
dHash算法
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率幾乎相同的情況下的效果要更好,它是基于漸變實(shí)現(xiàn)的。
步驟:
縮小圖片:收縮到9*8的大小,以便它有72的像素點(diǎn)
轉(zhuǎn)化為灰度圖
計(jì)算差異值:dHash算法工作在相鄰像素之間,這樣每行9個(gè)像素之間產(chǎn)生了8個(gè)不同的差異,一共8行,則產(chǎn)生了64個(gè)差異值
獲得指紋:如果左邊的像素比右邊的更亮,則記錄為1,否則為0.
最后比對兩張圖片的指紋,獲得漢明距離即可。
dHash:
#差值感知算法 def dhash(image1,image2): image1 = cv2.resize(image1,(9,8)) image2 = cv2.resize(image2,(9,8)) gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) #切換至灰度圖 gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) hash2 = dhashcaulate(gray1) hash3 = dhashcaulate(gray2) return Hamming_distance(hash2,hash3) def dhashcaulate(gray): hash_str = '' for i in range(8): for j in range(8): if gray[i, j] > gray[i, j + 1]: hash_str = hash_str + '1' else: hash_str = hash_str + '0' return hash_str
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。