欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python Opencv計算圖像相似度過程解析

 更新時間:2019年12月03日 16:44:23   作者:c_G-17  
這篇文章主要介紹了python Opencv計算圖像相似度過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了python Opencv計算圖像相似度過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、相關概念

一般我們人區(qū)分誰是誰,給物品分類,都是通過各種特征去辨別的,比如黑長直、大白腿、櫻桃唇、瓜子臉。王麻子臉上有麻子,隔壁老王和兒子很像,但是兒子下巴漲了一顆痣和他媽一模一樣,讓你確定這是你兒子。
還有其他物品、什么桌子帶腿、鏡子反光能在里面倒影出東西,各種各樣的特征,我們通過學習、歸納,自然而然能夠很快識別分類出新物品。

而沒有學習訓練過的機器就沒辦法了。

但是圖像是一個個像素點組成的,我們就可以通過不同圖像之間這些差異性就判斷兩個圖的相似度了。其中顏色特征是最常用的,(其余常用的特征還有紋理特征、形狀特征和空間關系特征等)
其中又分為

  • 直方圖
  • 顏色集
  • 顏色矩
  • 聚合向量
  • 相關圖

1、直方圖

在Python中利用opencv中的calcHist()方法獲取其直方圖數據,返回的結果是一個列表,使用matplotlib,畫出了這兩張圖的直方圖數據圖

import cv2
import numpy
from matplotlib import pyplot
if __name__ == '__main__':
  imgobj1 = cv2.imread('pho.jpg')
  imgobj2 = cv2.imread('ph1.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亮度等級的圖片?;叶葓D具有存儲小,其亮度值就是256色調色板索引號,從整幅圖像的整體和局部的色彩以及亮度等級分布特征來看,灰度圖描述與彩色圖的描述是一致的特點。因此很多真彩色圖片的分析,第一步就是轉換為灰度圖,然后再進行分析。

真彩色,因為是24位,2(^8) * 2(^8)* 2(^8) = 16777216種顏色,需要調色板16777216 * 4byte字節(jié)的空間也就是64MB的調色板空間,所以真彩色是不用調色板的。

例如視頻目標跟蹤和識別時,第一步就是要轉換為灰度圖?,F有的成熟分析算法多是基于灰度圖像的,灰度圖像綜合了真彩色位圖的RGB各通道的信息。

(一):單通道圖,

俗稱灰度圖,每個像素點只能有有一個值表示顏色,它的像素值在0到255之間,0是黑色,255是白色,中間值是一些不同等級的灰色。(也有3通道的灰度圖,3通道灰度圖只有一個通道有值,其他兩個通道的值都是零)。

(二):三通道圖,每個像素點都有3個值表示 ,所以就是3通道。也有4通道的圖。例如RGB圖片即為三通道圖片,RGB色彩模式是工業(yè)界的一種顏色標準,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一。總之,每一個點由三個值表示。

直方圖判斷相似度,如上圖,就算重合度即可

1.3 圖像指紋和漢明距離

圖像指紋:

和人的指紋一樣,是身份的象征,而圖像指紋簡單點來講,就是將圖像按照一定的哈希算法,經過運算后得出的一組二進制數字。

漢明距離:

假如一組二進制數據為101,另外一組為111,那么顯然把第一組的第二位數據0改成1就可以變成第二組數據111,所以兩組數據的漢明距離就為1

簡單點說,漢明距離就是一組二進制數據變成另一組數據所需的步驟數,顯然,這個數值可以衡量兩張圖片的差異,漢明距離越小,則代表相似度越高。漢明距離為0,即代表兩張圖片完全一樣。

1.3.1 平均哈希

此算法是基于比較灰度圖每個像素與平均值來實現的

一般步驟:

  • 縮放圖片,一般大小為8*8,64個像素值。
  • 轉化為灰度圖
  • 計算平均值:計算進行灰度處理后圖片的所有像素點的平均值,直接用numpy中的mean()計算即可。
  • 比較像素灰度值:遍歷灰度圖片每一個像素,如果大于平均值記錄為1,否則為0.
  • 得到信息指紋:組合64個bit位,順序隨意保持一致性。
  • 最后比對兩張圖片的指紋,獲得漢明距離即可。
import cv2
import numpy as np

img1 = cv2.imread("/absPath.png")
img2 = cv2.imread("./x.png")

#調整到8*8
img1 = cv2.resize(img1,(8,8))
img2 = cv2.resize(img2,(8,8))

#轉化為灰度圖
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

#獲取哈希
hash1 = getHash(gray1)
hash2 = getHash(gray2)

ret = Hamming_distance(hash1,hash2)


# 輸入灰度圖,返回hash
def getHash(image):
  avreage = np.mean(image) #計算像素平均值
  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
# 計算漢明距離
def Hamming_distance(hash1, hash2):
  num = 0
  for index in range(len(hash1)):
    if hash1[index] != hash2[index]:
      num += 1
  return num

1.3.2 感知哈希及d哈希

感知哈希算法(pHash)

平均哈希算法過于嚴格,不夠精確,更適合搜索縮略圖,為了獲得更精確的結果可以選擇感知哈希算法,它采用的是DCT(離散余弦變換)來降低頻率的方法

一般步驟:

  • 縮小圖片:32 * 32是一個較好的大小,這樣方便DCT計算
  • 轉化為灰度圖
  • 計算DCT:利用Opencv中提供的dct()方法,注意輸入的圖像必須是32位浮點型,所以先利用numpy中的float32進行轉換
  • 縮小DCT:DCT計算后的矩陣是32 * 32,保留左上角的8 * 8,這些代表的圖片的最低頻率
  • 計算平均值:計算縮小DCT后的所有像素點的平均值。
  • 進一步減小DCT:大于平均值記錄為1,反之記錄為0.
  • 得到信息指紋:組合64個信息位,順序隨意保持一致性。
  • 最后比對兩張圖片的指紋,獲得漢明距離即可。

dHash算法

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率幾乎相同的情況下的效果要更好,它是基于漸變實現的。

步驟:

縮小圖片:收縮到9*8的大小,以便它有72的像素點

轉化為灰度圖

計算差異值:dHash算法工作在相鄰像素之間,這樣每行9個像素之間產生了8個不同的差異,一共8行,則產生了64個差異值
獲得指紋:如果左邊的像素比右邊的更亮,則記錄為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)
  hash1 = dhashcaulate(gray1)
  hash2 = dhashcaulate(gray2)
  return Hamming_distance(hash1,hash2)
 
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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python中的進程分支fork和exec詳解

    Python中的進程分支fork和exec詳解

    這篇文章主要介紹了Python中的進程分支fork和exec詳解,本文用實例講解fork()的使用,并講解了exec相關的8個方法等內容,需要的朋友可以參考下
    2015-04-04
  • python爬蟲基礎之urllib的使用

    python爬蟲基礎之urllib的使用

    這篇文章主要介紹了python爬蟲基礎之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python實現打地鼠游戲

    Python實現打地鼠游戲

    這篇文章主要為大家詳細介紹了Python利用Pygame模塊實現簡單打地鼠游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • python環(huán)境路徑配置以及命令行運行腳本

    python環(huán)境路徑配置以及命令行運行腳本

    這篇文章主要為大家詳細介紹了python環(huán)境路徑配置以及命令行運行腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python PyMuPDF實現PDF與圖片和PPT相互轉換

    Python PyMuPDF實現PDF與圖片和PPT相互轉換

    能夠用來對PDF文檔進行操作的Python包有好幾個,如提取內容的PdfPlumber、PDFMiner,可以用來對PDF文件進行修改操作的PyPDF2等等,如果只是需要簡單地對PDF文件實現合并、拆分、書簽操作,使用PyPDF2就足以滿足。但如果想對PDF文件進行一些底層操作,基本上只有PyMuPDF了
    2022-12-12
  • pyhanlp安裝介紹和簡單應用

    pyhanlp安裝介紹和簡單應用

    這篇文章主要介紹了pyhanlp安裝介紹和簡單應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • 如何使用 Pylint 來規(guī)范 Python 代碼風格(來自IBM)

    如何使用 Pylint 來規(guī)范 Python 代碼風格(來自IBM)

    本文通過詳細的理論介紹和簡單易懂的實例全面介紹了 Python 代碼分析工具 Pylint。相信讀者看完后一定可以輕松地將 Pylint 運用到自己的開發(fā)工程中
    2018-04-04
  • python驗證碼識別教程之利用滴水算法分割圖片

    python驗證碼識別教程之利用滴水算法分割圖片

    這篇文章主要給大家介紹了關于python驗證碼識別教程之利用滴水算法分割圖片的相關資料,文章中通過示例代碼介紹的非常詳細,對大家的學習或者具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • Pandas使用stack和pivot實現數據透視的方法

    Pandas使用stack和pivot實現數據透視的方法

    筆者最近正在學習Pandas數據分析,將自己的學習筆記做成一套系列文章。本節(jié)主要記錄Pandas中使用stack和pivot實現數據透視。感興趣的小伙伴們可以參考一下
    2021-09-09
  • 用Python編寫一個簡單的FUSE文件系統(tǒng)的教程

    用Python編寫一個簡單的FUSE文件系統(tǒng)的教程

    這篇文章主要介紹了用Python編寫一個簡單的FUSE文件系統(tǒng)的教程,對于數據的備份很有幫助,需要的朋友可以參考下
    2015-04-04

最新評論