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

python Opencv計(jì)算圖像相似度過(guò)程解析

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

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

一、相關(guān)概念

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

而沒(méi)有學(xué)習(xí)訓(xùn)練過(guò)的機(jī)器就沒(méi)辦法了。

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

  • 直方圖
  • 顏色集
  • 顏色矩
  • 聚合向量
  • 相關(guān)圖

1、直方圖

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

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亮度等級(jí)的圖片。灰度圖具有存儲(chǔ)小,其亮度值就是256色調(diào)色板索引號(hào),從整幅圖像的整體和局部的色彩以及亮度等級(jí)分布特征來(lái)看,灰度圖描述與彩色圖的描述是一致的特點(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各通道的信息。

(一):?jiǎn)瓮ǖ缊D,

俗稱(chēng)灰度圖,每個(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),是通過(guò)對(duì)紅(R)、綠(G)、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來(lái)得到各式各樣的顏色的,RGB即是代表紅、綠、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類(lèi)視力所能感知的所有顏色,是目前運(yùn)用最廣的顏色系統(tǒng)之一??傊?,每一個(gè)點(diǎn)由三個(gè)值表示。

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

1.3 圖像指紋和漢明距離

圖像指紋:

和人的指紋一樣,是身份的象征,而圖像指紋簡(jiǎn)單點(diǎn)來(lái)講,就是將圖像按照一定的哈希算法,經(jīng)過(guò)運(yùn)算后得出的一組二進(jìn)制數(shù)字。

漢明距離:

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

簡(jiǎn)單點(diǎn)說(shuō),漢明距離就是一組二進(jìn)制數(shù)據(jù)變成另一組數(shù)據(jù)所需的步驟數(shù),顯然,這個(gè)數(shù)值可以衡量?jī)蓮垐D片的差異,漢明距離越小,則代表相似度越高。漢明距離為0,即代表兩張圖片完全一樣。

1.3.1 平均哈希

此算法是基于比較灰度圖每個(gè)像素與平均值來(lái)實(shí)現(xiàn)的

一般步驟:

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

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

ret = Hamming_distance(hash1,hash2)


# 輸入灰度圖,返回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(hash1, hash2):
  num = 0
  for index in range(len(hash1)):
    if hash1[index] != hash2[index]:
      num += 1
  return num

1.3.2 感知哈希及d哈希

感知哈希算法(pHash)

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

一般步驟:

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

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.
最后比對(duì)兩張圖片的指紋,獲得漢明距離即可。

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

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

相關(guān)文章

  • pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例

    pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例

    這篇文章主要介紹了pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 使用Python轉(zhuǎn)換Markdown文件為Word文檔

    使用Python轉(zhuǎn)換Markdown文件為Word文檔

    Markdown格式的文章轉(zhuǎn)換成Word文檔能夠幫助作者制作更復(fù)雜的文檔,同時(shí)確保內(nèi)容的一致性和美觀性,本文將使用Python實(shí)現(xiàn)Markdown轉(zhuǎn)Word,感興趣的可以了解下
    2024-11-11
  • Python 結(jié)巴分詞實(shí)現(xiàn)關(guān)鍵詞抽取分析

    Python 結(jié)巴分詞實(shí)現(xiàn)關(guān)鍵詞抽取分析

    這篇文章主要介紹了Python 結(jié)巴分詞實(shí)現(xiàn)關(guān)鍵詞抽取分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Python進(jìn)程使用內(nèi)存后不釋放的解決

    Python進(jìn)程使用內(nèi)存后不釋放的解決

    這篇文章主要介紹了Python進(jìn)程使用內(nèi)存后不釋放的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Python數(shù)據(jù)提取-lxml模塊

    Python數(shù)據(jù)提取-lxml模塊

    這篇文章主要介紹了Python數(shù)據(jù)提取-lxml模塊,lxml模塊和xpath語(yǔ)法的關(guān)系,lxml模塊的使用場(chǎng)景、lxml模塊的安裝、谷歌瀏覽器xpath?helper插件的安裝和使用等相關(guān)內(nèi)容介紹,需要的朋友可以參考一下
    2022-01-01
  • python基礎(chǔ)之迭代器與生成器

    python基礎(chǔ)之迭代器與生成器

    這篇文章主要為大家介紹了python迭代器與生成器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • python 截取XML中bndbox的坐標(biāo)中的圖像,另存為jpg的實(shí)例

    python 截取XML中bndbox的坐標(biāo)中的圖像,另存為jpg的實(shí)例

    這篇文章主要介紹了python 截取XML中bndbox的坐標(biāo)中的圖像,另存為jpg的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • 一文教你用python編寫(xiě)Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃

    一文教你用python編寫(xiě)Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃

    迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑,這篇文章主要給大家介紹了關(guān)于利用python編寫(xiě)Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 基于keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator)

    基于keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator)

    這篇文章主要介紹了keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • pyqt5教程QGraphicsScene及QGraphicsView使用基礎(chǔ)

    pyqt5教程QGraphicsScene及QGraphicsView使用基礎(chǔ)

    這篇文章主要為大家介紹了pyqt5教程中QGraphicsScene及QGraphicsView使用基礎(chǔ),有序要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論

卫辉市| 阳泉市| 巴南区| 玛多县| 曲阜市| 乐都县| 灵寿县| 沾化县| 康保县| 荥阳市| 县级市| 泰顺县| 徐水县| 黄山市| 昌宁县| 武山县| 黄浦区| 晋宁县| 赤壁市| 彝良县| 西安市| 泸州市| 新乐市| 肥东县| 江津市| 沂水县| 通化县| 登封市| 舞阳县| 常宁市| 淳安县| 武冈市| 平昌县| 棋牌| 安溪县| 灵石县| 五常市| 永登县| 金门县| 鄂托克旗| 吴忠市|