谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎
gaoyangw 2024-12-08 13:44 15 浏览 0 评论
前情回顾:
前期文章,我们分享了图片的3D颜色直方图,利用颜色直方图是反映图片的像素的分布状态,当然不同的图片,其颜色直方图肯定有所不同,利用不同图片的颜色直方图的对比值,便可以很容易找到2张相似的图片。
图片的3D颜色直方图:
既然要使用图片的颜色直方图来进行相似图片的对比,首先需要对图片进行直方图的数据收集与保持
import pickle
import cv2
import os
class 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] = features
with 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 np
import os
import pickle
import cv2
class 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, :] = result
else:
tageB[(j - 3) * 166:((j - 3) + 1) * 166, :] = result
cv2.imshow("Results 1-3 ", tageA)
cv2.imshow("Results 4-6 ", tageB)
cv2.waitKey(0)
遍历前6个数据,获取图片保存的路径地址与每个图片相似度的置信度
把前3个图片数据保存到tageA中,后3个图片数据保存到tageB中,最后便可以成功展示我们检索到的6张相似图片
这里程序成功的找到了相似图片,小编这里复制了3张图片,程序能够完美找到图片
相关推荐
- 美国站群16C8C多a利于网站seo优化建站的优势
-
站群服务器有什么优势?1、有丰富的IP资源站群服务器拥有丰富的IP资源,尤其是百度对于独享IP更为友好,并且网站内容也有利于收录,因此这也是可以更好的做站群优化,让网站排名更好。2、稳定性高它采用先...
- 如何布局资料,引导AI抓取信息以实现推荐和广告投放
-
通过布局文章和资料引导元宝、豆包、DeepSeek等AI工具抓取信息以实现推荐和广告投放,从技术逻辑和实际案例来看是可行的。以下是具体分析及实施方案:...
- 软文SEO作用
-
软文SEO,即搜索引擎优化软文,是指通过优化文章的内容、关键词布局等因素,使其更容易被搜索引擎收录并排名靠前的一种文章形式。龙新网编辑告诉您软文SEO的作用主要体现在以下几个方面:一、提升网站排名软文...
- 小微企业找外包做网络营销合适吗?
-
#小微企业找外包做网络营销合适吗?#小微企业找外包做网络营销,可以是一个合适的选择,但必须谨慎、策略清晰。以下是详细分析:...
- 做销售硬气一点,没必要舔客户
-
大家做生意卖产品,不管是国学老师也好,知识博主也罢,一律不要去跪舔客户。...
- 元器件电商客户运营04-潜在客户
-
在元器件电商领域,客户运营不仅需要关注现有客户,更要积极拓展潜在客户群体,这是企业获取新客户、实现增长的关键环节。本文将深入探讨元器件电商如何通过制造“羊毛”机会、持续广告刺激以及定期投入产出分析等策...
- 新版Google PMax广告指南免费领,仅限前50名!速来~
-
在过往较长的一段时期内,我投入了大量时间进行深入研究和测试,发现这种形式的广告还是极具潜力且回报率非常可观的——GooglePerformanceMax(PMax)广告。...
- 全网营销推广必备!这130个网站你用过几个?附效率提升技巧
-
嘿,各位互联网营销推广的小伙伴们!今天给大家整理了130个超实用的网站,涵盖了学习平台、推广平台、引流平台、数据分析平台等多个方面,绝对是干货满满,快来看看吧!...
- 开发一个特色网站需要哪些技术加持
-
1、前端开发前端开发是使用HTML、CSS和JavaScript等前端语言进行网页开发的技术。通过编写这些代码,可以实现网页的布局和用户界面(UI)。...
- 应用软件开发与网站开发区别
-
1、操作理论不同网站开发是制作一些专业性强的网站,比如说动态网页。ASP、PHP、JSP网页。主要用到的开发技术是web开发。网站是必须要在浏览器上打开的,依附于浏览器才会生存。它不但需要根据软件开发...
- 如何用Google站长工具确认外贸网站的外链
-
外贸公司网站要快速排名,其中一个重要的工作是做外链,那么当我们找外包公司做好外链之后,如何确认:做好的外链是否被Google认可?我们做好一些外链之后,如何确认到底有哪些?我们自己网站一共有多少外链?...
- 高级SEO人员需了解的八大搜索引擎命令
-
一般情况下,站长们通常都比较喜欢直接用站长工具或爱站的一些SEO工具去分析网站数据,而直接用命令去搜索引擎的搜索框查询的相对比较少,但这些常用的指令大家也可以熟悉和了解一下:1、SiteSite是最常...
- SEO 干货!网站快速收录的 3 个实用技巧,新手站长必看
-
各位SEO新手们,是不是经常遇到这样的烦恼:网站都辛辛苦苦做了一两个月了,可搜索引擎就像完全不知道它存在一样,迟迟不收录?要知道,网站不收录,咱们做的关键词优化、内容更新等所有工作都相当于白忙活!...
- 豆包网页版的“视频生成”和豆包APP的“照片动起来”有什么不同
-
在视频制作方面,豆包网页版和电脑版提供了“视频生成”功能,而豆包APP提供了“照片动起来”功能,那么二者有什么不同呢?操作平台o豆包网页版和电脑版的“视频生成”:在电脑上操作,通过访问豆包官方网站,...
- 适合新手的电子画册制作工具全攻略
-
第一次做电子画册,担心不会设计?别怕!2025年这些工具让零基础也能轻松上手。无需PS技能,不用学习复杂排版,跟着这篇攻略,10分钟就能做出专业感满满的电子画册!...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 网站开发 (47)
- 网络推广哪个平台好 (47)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 广州seo (47)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)
- 百度收录批量查询工具 (48)
- 网站服务器 (53)