日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spyder cv2 打开图片_谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎

發布時間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spyder cv2 打开图片_谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相似圖片

前情回顧:

圖片顏色直方圖

前期文章,我們分享了圖片的3D顏色直方圖,利用顏色直方圖是反映圖片的像素的分布狀態,當然不同的圖片,其顏色直方圖肯定有所不同,利用不同圖片的顏色直方圖的對比值,便可以很容易找到2張相似的圖片。

圖片的3D顏色直方圖:

既然要使用圖片的顏色直方圖來進行相似圖片的對比,首先需要對圖片進行直方圖的數據收集與保持

import pickleimport cv2import osclass RGBHistogram: def __init__(self, bins): self.bins = bins def describe(self, image): hist = cv2.calcHist([image], [0, 1, 2],None, self.bins, [0, 256, 0, 256, 0, 256]) hist = cv2.normalize(hist,hist) return hist.flatten()

代碼截圖

首先我們建立一個計算圖片 RGB空間的3D顏色直方圖函數,利用此函數來進行圖片直方圖的計算工作

我們依然使用cv2.calcHist函數來進行圖片直方圖的計算,關于此函數的具體參數定義,可以參考往期文章,這里我們一般搜索的圖片為彩色圖片,所以計算圖片的RGB空間直方圖

然后使用cv2.normalize opencv 圖片歸一化函數(歸一化數據。該函數分為范圍歸一化與數據值歸一化),通俗地講就是將矩陣的值通過某種方式變到某一個區間內,這樣可以有效的節約計算機空間來計算

Cv.normalize(InputArry src,InputOutputArray dst,double alpha=1, double beta=0,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())
  • · src 輸入數組;
  • · dst 輸出數組,數組的大小和原數組一致;
  • · alpha 1,用來規范值,2.規范范圍,并且是下限;
  • · beta 只用來規范范圍并且是上限;//為0時則為值歸一化,否則為范圍歸一化
  • · norm_type 歸一化選擇的數學公式類型;
  • · dtype 當為負,輸出在大小深度通道數都等于輸入,當為正,輸出只在深度與輸入不同,不同的地方由dtype決定;
  • · mark 掩碼。選擇感興趣區域,選定后只能對該區域進行操作。
  • 然后返回flatten數組形式的3D圖片直方圖

    收集圖片直方圖數據:

    建立好了圖片直方圖函數,便可以收集我們的圖片直方圖的數據,這里跟我們首先需要神經網絡類似,需要有前期的"預訓練模型"

    index = {}desc = RGBHistogram([8, 8, 8])list_images = []for root, dirs, files in os.walk("images"): for file in files: list_images.append(os.path.join(root, file))for imagePath in list_images: k = imagePath[imagePath.rfind("/") + 1:] image = cv2.imread(imagePath) features = desc.describe(image) index[k] = featureswith open("index.cpickle", "wb") as f: f.write(pickle.dumps(index))

    index{} 字典用來保存圖片的路徑與圖片直方圖數據

    for root, dirs, files in os.walk,首先使用os.walk 函數遍歷整個圖片的文件夾來獲取圖片的相對路徑地址

    我們按照imagePath[imagePath.rfind("/") + 1:]圖片的路徑作為key , 圖片的features = desc.describe(image)直方圖數據作為value組成一個index字典用來保存圖片的數據

    待獲取了圖片的字典數據后,我們使用f.write(pickle.dumps(index))

    保存圖片的直方圖數據,以便后期進行搜索使用,當然這部分數據可以保存到自己的服務器上,當用戶搜索相識圖片時,前端獲取用戶的圖片數據,服務器進行相識圖片檢索,然后返回前端檢索到的圖片數據進行圖片的展示。

    代碼截圖

    以上我們搜集了圖片的直方圖數據,并保存了數據,這點跟我們前期講解的神經網絡的預訓練模型類似,下一步當然是進行"神經網絡的預測"進行圖片的檢測

    相關圖片的搜索:

    想要進行圖片的相識圖片搜索工作,首先保證前面幾個步驟已經完成,且保存了自己的數據,接下來當然是接受用戶的輸入圖片,進行圖片的相識性搜索

    import numpy as npimport osimport pickleimport cv2class RGBHistogram: def __init__(self, bins): self.bins = bins def describe(self, image): hist = cv2.calcHist([image], [0, 1, 2], None, self.bins, [0, 256, 0, 256, 0, 256]) hist = cv2.normalize(hist,hist) return hist.flatten()

    首先我們建立圖片直方圖的函數,這里這個函數主要是把用戶傳遞過來的圖片進行圖片直方圖的操作,函數的具體含義參考以上文章內部

    代碼截圖

    然后我們新建一個搜索函數,主要處理輸入直方圖與數據庫直方圖的對比

    class Searcher: def __init__(self, index): self.index = index def search(self, queryFeatures): results = {} for (k, features) in self.index.items(): d = self.chi2_distance(features, queryFeatures) results[k] = d results = sorted([(v, k) for (k, v) in results.items()]) return results def chi2_distance(self, histA, histB, eps = 1e-10): d = 0.5 * np.sum([((a - b) ** 2) / (a + b + eps) for (a, b) in zip(histA, histB)]) return d

    首先我們加載index數據庫,這里保存了圖片的直方圖數據

    然后遍歷所有index的數據for (k, features) in self.index.items():計算每個數據庫中的圖片直方圖與輸入圖片直方圖的卡方距離

    卡方距離

    卡方距離越小,說明2張圖片越相似

    利用sorted 函數sorted([(v, k) for (k, v) in results.items()])

    對圖片卡方距離進行排序,以便最小的距離值排列在最前面

    代碼截圖

    初始化數據

    queryImage = cv2.imread("queries/11.png")cv2.imshow("Query", queryImage)desc = RGBHistogram([8, 8, 8])queryFeatures = desc.describe(queryImage)index = pickle.loads(open("index.cpickle", "rb").read())searcher = Searcher(index)results = searcher.search(queryFeatures)montageA = np.zeros((166 * 3, 400, 3), dtype="uint8")montageB = np.zeros((166 * 3, 400, 3), dtype="uint8")

    首先接受用戶傳遞的圖片

    desc = RGBHistogram([8, 8, 8])

    queryFeatures = desc.describe(queryImage)

    使用以上函數計算用戶圖片的顏色直方圖

    index = pickle.loads(open("index.cpickle", "rb").read())

    searcher = Searcher(index)

    初始化顏色直方圖搜索引擎數據,主要是打開服務器上的圖片直方圖數據進行圖片的搜索

    results = searcher.search(queryFeatures)

    進行圖片的相似性檢索

    tageA = np.zeros((166 * 3, 400, 3), dtype="uint8")

    tageB = np.zeros((166 * 3, 400, 3), dtype="uint8")

    初始化2個標簽,用來展示我們搜索到的相似圖片,這里我們方便查看設置了6張圖片的展示

    每個圖片resize 到400*166

    當然你完全可以只展示一張最相似的圖片

    代碼截圖

    我們檢索了所有數據庫中的圖片,結果已經存放在results數組中,由于我們sorted了數組,所以最小值的前六個數組當然在數組最前面,我們只需要提取前6個數據即可

    for j in range(0, 6):(score, imageName) = results[j]path = os.path.join(imageName)result = cv2.imread(path)if j < 3:tageA[j * 166:(j + 1) * 166, :] = resultelse:tageB[(j - 3) * 166:((j - 3) + 1) * 166, :] = resultcv2.imshow("Results 1-3", tageA)cv2.imshow("Results 4-6", tageB)cv2.waitKey(0)

    遍歷前6個數據,獲取圖片保存的路徑地址與每個圖片相似度的置信度

    把前3個圖片數據保存到tageA中,后3個圖片數據保存到tageB中,最后便可以成功展示我們檢索到的6張相似圖片

    代碼截圖

    這里程序成功的找到了相似圖片,小編這里復制了3張圖片,程序能夠完美找到圖片

    相似圖片

    總結

    以上是生活随笔為你收集整理的spyder cv2 打开图片_谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。