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())然后返回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 打开图片_谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 警务移动安全管理终端,助力广东省公安厅移
- 下一篇: 互盾科技:不是井里没有水,而是你挖的不够