最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)圖像檢索的三種(直方圖/OpenCV/哈希法)

 更新時(shí)間:2019年08月08日 14:37:36   作者:Mengwei_Ren  
這篇文章主要介紹了python實(shí)現(xiàn)圖像檢索的三種(直方圖/OpenCV/哈希法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

簡(jiǎn)介:

本文介紹了圖像檢索的三種實(shí)現(xiàn)方式,均用python完成,其中前兩種基于直方圖比較,哈希法基于像素分布。
檢索方式是:提前導(dǎo)入圖片庫(kù)作為檢索范圍,給出待檢索的圖片,將其與圖片庫(kù)中的圖片進(jìn)行比較,得出所有相似度后進(jìn)行排序,從而檢索結(jié)果為相似度由高到低的圖片。由于工程中還包含Qt界面類(lèi)、觸發(fā)函數(shù)等其他部分,在該文檔中只給出關(guān)鍵函數(shù)的代碼。

開(kāi)發(fā)系統(tǒng):MacOS
實(shí)現(xiàn)方式:Qt + Python

方法一:自定義的直方圖比較算法

a) 基本思路

遍歷圖片像素點(diǎn),提取R\G\B值并進(jìn)行對(duì)應(yīng)的計(jì)數(shù),得到原始直方圖,但由于0-255的范圍太大,因此每一個(gè)像素值的統(tǒng)計(jì)量均偏小,因此分別將R\G\B的256個(gè)像素值映射到0-31共32個(gè)像素值上,將像素值范圍由256*3縮小到32*3。記錄像素值采用的數(shù)據(jù)結(jié)構(gòu)為一維數(shù)組,第1到32個(gè)值為R的像素直方圖,第33到第64個(gè)值為G的像素統(tǒng)計(jì),第65到96個(gè)值為B的像素統(tǒng)計(jì)。得到直方圖后,計(jì)算待檢索圖的直方圖和圖片庫(kù)中圖像的直方圖之間的相似性。

b) 具體實(shí)現(xiàn)

用到的函數(shù):

  • split_Img()
  • calc_Hist(img)
  • calc_Similar(h1,h2)
  • calc_Similar_Split(h1,h2)

遍歷圖片的像素點(diǎn)以計(jì)算直方圖:calc_Hist(img)

嘗試了兩種方式,第一種是對(duì)圖像遍歷時(shí)逐個(gè)調(diào)用getpixel()來(lái)獲取R,G,B的值,但發(fā)現(xiàn)這種方式的速度太慢。第二種采用的是內(nèi)存讀取,利用load()函數(shù)一次性讀取圖像的像素值,然后對(duì)像素值進(jìn)行遍歷,該方法的速度比逐個(gè)提取更快。

#統(tǒng)計(jì)直方圖,用load()載入圖片的像素pix,再分別讀取每個(gè)像素點(diǎn)的R\G\B值進(jìn)行統(tǒng)計(jì)(分別為0-255)
#將256個(gè)顏色值的統(tǒng)計(jì)情況投影到32個(gè),返回R\G\B投影后的統(tǒng)計(jì)值數(shù)組,共32*3=96個(gè)元素
def calc_Hist(img):
  '''
  #120張圖片,4.43s
  w,h = img.size
  pix = img.load() #載入圖片,pix存的是像素
  calcR = [0 for i in range(0,32)]
  calcG = [0 for i in range(0,32)]
  calcB = [0 for i in range(0,32)]
  for i in range(0,w):
    for j in range(0,h):
      (r,g,b) = pix[i,j]
      #print (r,g,b)
      calcR[r/8] += 1
      calcG[g/8] += 1
      calcB[b/8] += 1
  calcG.extend(calcB)
  calcR.extend(calcG)

  return calcR
  '''
  #120張圖,3.49s

  w,h = img.size
  pix = img.load() #載入圖片,pix存的是像素
  calcR = [0 for i in range(0,256)]
  calcG = [0 for i in range(0,256)]
  calcB = [0 for i in range(0,256)]
  for i in range(0,w):
    for j in range(0,h):
      (r,g,b) = pix[i,j]
      #print (r,g,b)
      calcR[r] += 1
      calcG[g] += 1
      calcB[b] += 1
  calcG.extend(calcB)
  calcR.extend(calcG) #256*3

  #calc存放最終結(jié)果,32*3
  calc = [0 for i in range(0,96)]
  step = 0 #calc的下標(biāo),0~95
  start = 0 #每次統(tǒng)計(jì)的開(kāi)始位置
  while step < 96:
    for i in range(start,start+8): #8個(gè)值為1組,統(tǒng)計(jì)值相加,eg:色彩值為0~7的統(tǒng)計(jì)值全部轉(zhuǎn)換為色彩值為0的統(tǒng)計(jì)值
      calc[step] += calcR[i]
    start = start+8
    step += 1
  #print calc 
  return calc 

直方圖比較 calc_Similar(h1,h2)

采用的公式是: 

其中N為顏色級(jí)數(shù),Sim越靠近1則兩幅圖像的相似度越高。

c) 問(wèn)題和改進(jìn)

簡(jiǎn)單實(shí)現(xiàn)直方圖比較后,檢索的結(jié)果并不好,和預(yù)期相比誤差較大。分析原因,直方圖比較主要依靠整幅圖像的色彩統(tǒng)計(jì)來(lái)進(jìn)行比較,而對(duì)像素的位置并沒(méi)有很好的記錄,因此會(huì)造成誤判。

同時(shí)增加calc_Similar_Split(h1,h2)函數(shù),加入分塊比較的部分,計(jì)算方法是:對(duì)每個(gè)小塊調(diào)用calc_Similar(h1,h2),累加計(jì)算結(jié)果,最后除以16取平均值。

測(cè)試發(fā)現(xiàn)效果顯著提升,基于顏色相似的同時(shí)保留了形狀信息。

函數(shù)如下:

#該函數(shù)用于統(tǒng)一圖片大小為256*256,并且分割為16個(gè)塊,返回值是16個(gè)局部圖像句柄的數(shù)組
def split_Img(img, size = (64,64)):
  img = img.resize((256,256)).convert('RGB')
  w,h = img.size
  sw,sh = size
  return [img.crop((i,j,i+sw,j+sh)).copy() for i in xrange(0,w,sw) for j in xrange(0,h,sh)]

#計(jì)算兩個(gè)直方圖之間的相似度,h1和h2為直方圖,zip表示同步遍歷
def calc_Similar(h1,h2):
  return sum(1 - (0 if g==s else float(abs(g-s))/max(g,s)) for g,s in zip(h1,h2)) / len(h1)

方法二:openCV庫(kù)的直方圖比較算法實(shí)現(xiàn)

openCV開(kāi)源庫(kù)已經(jīng)集成了直方圖提取、直方圖均衡化以及直方圖比較的功能,調(diào)用方便。為了進(jìn)一步了解直方圖比較的各類(lèi)實(shí)現(xiàn)方法,利用openCV重新進(jìn)行了實(shí)驗(yàn)。

a) 基本思路

對(duì)圖片庫(kù)中每個(gè)圖片提取直方圖并均衡化,然后調(diào)用cv庫(kù)函數(shù)進(jìn)行直方圖比較,結(jié)果進(jìn)行排序,并顯示。

b) 具體實(shí)現(xiàn)

首先調(diào)用cv2.imread()讀取圖像,然后調(diào)用cv2.calcHist()計(jì)算直方圖,cv2.normalize()均衡化后進(jìn)入比較階段,調(diào)用cv2.compareHist(),比較待檢索圖和圖片庫(kù)圖像之間的直方圖差異,然后調(diào)用DisplayTotalPics()進(jìn)行顯示。

關(guān)鍵代碼如下:

results = {} #記錄結(jié)果
reverse = True #correlation/intersection方法reverse為true,另外兩種為false

imgCV = cv2.imread(self.testImg.encode('utf-8'))
#self.testImg為待匹配圖片
testHist = cv2.calcHist([imgCV],[0,1,2],None,[8,8,8],[0,256,0,256,0,256])
#提取直方圖
testHist = cv2.normalize(testHist,testHist,0,255,cv2.NORM_MINMAX).flatten()
#均衡化

#計(jì)算self.testImg和其他圖片的直方圖差異,INTERSECTION方法效果比較好
for (k, hist) in self.index_cv.items(): 
#self.index_cv保存的是圖片庫(kù)中圖片的直方圖信息
  d = cv2.compareHist(testHist,hist, cv2.cv.CV_COMP_INTERSECT)
  results[k] = d
  #對(duì)結(jié)果排序,以v即上面的d作為關(guān)鍵字
  results = sorted([(v, k) for (k, v) in results.items()], reverse = reverse) 
  end = time.time()
  print 'OpenCV Time:'
  print end-start     
self.DisplayTotalPics(results)

c) 問(wèn)題與解決

openCV中的compareHist函數(shù)中提供了4中比較方法:
1.相關(guān)系數(shù)標(biāo)準(zhǔn)(method=CV_COMP_CORREL) 值越大,相關(guān)度越高,最大值1,最小值0
2.卡方系數(shù)標(biāo)準(zhǔn)(method=CV_COMP_CHISQR) 值越小,相關(guān)度越高,無(wú)上限,最小值0
3.相交系數(shù)標(biāo)準(zhǔn)(method=CV_COMP_INTERSECT)值大,相關(guān)度越高,最大9.455319,最小0
4.巴氏系數(shù)的標(biāo)準(zhǔn)(method=CV_COMP_BHATTACHARYYA) 值小,相關(guān)度越高,最大值1,最小值0

測(cè)試后選擇的是method = cv2.cv.CV_COMP_INTERSECT

另外,該方法的速度很快,完全基于圖像的色彩分布,但在一些情況下精度并不高。

方法三:平均哈希值比較算法實(shí)現(xiàn)

用到的函數(shù):getKey(),getCode(),cmpCode()

a) 基本思路

平均哈希值的比較算法是基于像素分布的,比較對(duì)象是灰度圖的圖像指紋。圖像指紋的計(jì)算通過(guò)比較每個(gè)圖的像素值和平均像素值來(lái)計(jì)算,然后計(jì)算圖像指紋之間的漢明距離,排序后得到相似圖像。

b) 具體實(shí)現(xiàn)

具體方法是:計(jì)算進(jìn)行灰度處理后圖片的所有像素點(diǎn)的平均值,然后遍歷灰度圖片每一個(gè)像素,如果大于平均值記錄為1,否則為0,這一步通過(guò)定義函數(shù)getCode(img)完成。接著計(jì)算編碼之間的漢明距離,即一組二進(jìn)制數(shù)據(jù)變?yōu)榱硪唤M數(shù)據(jù)所需的步驟數(shù),漢明距離越小,說(shuō)明圖像指紋的相似度越高。計(jì)算漢明距離可以通過(guò)簡(jiǎn)單的遍歷和計(jì)數(shù)來(lái)完成,函數(shù)為compCode(code1,code2),其中code1和code2為getCode得到的圖像指紋。

關(guān)鍵函數(shù)代碼如下:

#獲取排序時(shí)的關(guān)鍵值(即漢明距離)    
def getKey(x): 
  return int(x[1])

#由灰度圖得到2值“指紋”,從而計(jì)算漢明距離
def getCode(img):
  w,h = img.size
  pixel = []
  for i in range(0,w):
    for j in range(0,h):
      pixel_value = img.getpixel((i,j))
      pixel.append(pixel_value) #加入pixel數(shù)組
  avg = sum(pixel)/len(pixel) #計(jì)算像素平均值

  cp = [] #二值數(shù)組
  for px in pixel:
    if px > avg:
      cp.append(1)
    else:
      cp.append(0)
  return cp

#計(jì)算兩個(gè)編碼之間的漢明距離
def compCode(code1,code2):
  num = 0
  for index in range(0,len(code1)):
    if code1[index] != code2[index]:
      num+=1
  #print num
  #print '\n'
  return num 

c) 問(wèn)題與優(yōu)化

我們發(fā)現(xiàn)在數(shù)據(jù)量大時(shí),該方法的檢索速度較慢,因此我們將圖像指紋也作為圖像的屬性存在self.hashCode中,在importFolder時(shí)計(jì)算好,避免后續(xù)操作中的冗余重復(fù)計(jì)算。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python輪詢機(jī)制控制led實(shí)例

    python輪詢機(jī)制控制led實(shí)例

    這篇文章主要介紹了python輪詢機(jī)制控制led實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • 解決python 讀取excel時(shí) 日期變成數(shù)字并加.0的問(wèn)題

    解決python 讀取excel時(shí) 日期變成數(shù)字并加.0的問(wèn)題

    這篇文章主要介紹了python 讀取excel時(shí), 日期變成數(shù)字并加.0的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • python中Matplotlib繪制直線的實(shí)例代碼

    python中Matplotlib繪制直線的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python中Matplotlib繪制直線的實(shí)例代碼內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-07-07
  • 安裝出現(xiàn):Requirement?already?satisfied解決辦法

    安裝出現(xiàn):Requirement?already?satisfied解決辦法

    最近pip install的時(shí)候報(bào)錯(cuò),一大串Requirement already satisfied,所以下面這篇文章主要給大家介紹了關(guān)于安裝出現(xiàn):Requirement?already?satisfied的解決辦法,需要的朋友可以參考下
    2022-08-08
  • Python編程實(shí)現(xiàn)從字典中提取子集的方法分析

    Python編程實(shí)現(xiàn)從字典中提取子集的方法分析

    這篇文章主要介紹了Python編程實(shí)現(xiàn)從字典中提取子集的方法,結(jié)合實(shí)例形式對(duì)比分析了Python采用字典推導(dǎo)式與序列轉(zhuǎn)換實(shí)現(xiàn)字典提取子集的相關(guān)操作技巧與優(yōu)缺點(diǎn),需要的朋友可以參考下
    2018-02-02
  • Python中requests做接口測(cè)試的方法

    Python中requests做接口測(cè)試的方法

    Requests是一個(gè)很實(shí)用的Python HTTP客戶端庫(kù),編寫(xiě)爬蟲(chóng)和測(cè)試服務(wù)器響應(yīng)數(shù)據(jù)時(shí)經(jīng)常會(huì)用到,本文主要介紹了Python中requests做接口測(cè)試的方法,感興趣的可以了解一下
    2021-05-05
  • Python機(jī)器學(xué)習(xí)之實(shí)現(xiàn)模型持久化與加載

    Python機(jī)器學(xué)習(xí)之實(shí)現(xiàn)模型持久化與加載

    在實(shí)際的機(jī)器學(xué)習(xí)項(xiàng)目中,我們通常需要將訓(xùn)練好的模型保存到磁盤(pán),本文我們會(huì)介紹如何在Python中使用pickle和joblib庫(kù)將訓(xùn)練好的模型持久化到磁盤(pán),需要的可以參考一下
    2023-05-05
  • 關(guān)于Pytorch中模型的保存與遷移問(wèn)題

    關(guān)于Pytorch中模型的保存與遷移問(wèn)題

    在本篇文章中,筆者首先介紹了模型復(fù)用的幾種典型場(chǎng)景;然后介紹了如何查看Pytorch模型中的相關(guān)參數(shù)信息;接著介紹了如何載入模型、如何進(jìn)行追加訓(xùn)練以及進(jìn)行模型的遷移學(xué)習(xí)等,需要的朋友可以參考下
    2021-10-10
  • Python使用matplotlib繪制隨機(jī)漫步圖

    Python使用matplotlib繪制隨機(jī)漫步圖

    這篇文章主要為大家詳細(xì)介紹了使用Python生成隨機(jī)漫步數(shù)據(jù),使用matplotlib繪制隨機(jī)漫步圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 詳解Python中數(shù)據(jù)處理的方法總結(jié)及實(shí)現(xiàn)

    詳解Python中數(shù)據(jù)處理的方法總結(jié)及實(shí)現(xiàn)

    數(shù)據(jù)增強(qiáng)作為前處理的關(guān)鍵步驟,在整個(gè)計(jì)算機(jī)視覺(jué)中有著具足輕重的地位。本文為大家總結(jié)了Python中數(shù)據(jù)處理的方法及實(shí)現(xiàn),需要的可以參考一下
    2022-09-09

最新評(píng)論

巴楚县| 监利县| 贺州市| 喀喇| 文水县| 金坛市| 平乡县| 永胜县| 金华市| 博乐市| 海淀区| 张家界市| 靖远县| 金溪县| 汪清县| 中宁县| 佛冈县| 南充市| 蕉岭县| 安康市| 绥阳县| 隆子县| 邯郸县| 米泉市| 花垣县| 闽侯县| 富裕县| 兰州市| 巴东县| 洪洞县| 达尔| 三明市| 哈密市| 聊城市| 克拉玛依市| 界首市| 堆龙德庆县| 大理市| 鄂尔多斯市| 内乡县| 宽甸|