图片分类在计算机领域并不是一个新鲜的话题了,相对于传统计算机视觉(CV)方法解决这类问题,深度学习的效果反而更好。但是我们依然需要了解传统做法,说不定在未来研究时可以提供不一样的灵感。

图像描述符

要实现图像分类,首先我们需要提取我们图像库里已有图像的特征,这个过程称为描述图像。图像描述符定义了我们如何量化图像,而其输出可以看作图像本身的抽象。图像描述符的选取可以有很多,可以以颜色,形状为基准或者质地为基准。关于图像描述符更多更详细的介绍将在后面的文章中说明。在本文中,我们使用颜色中的颜色直方图作为图像描述符。

相似度指标

如何判断目标图像和图像库里的某一个图像是否是一类?我们可以通过比较二者的图像描述符来判断。而这个比较方法我们称之为相似度指标,即用来判断两者是否相似的标准。关于相似度指标更多更详细的介绍将在后面的文章中说明。

代码及简单解释

导入必要的库,如果导入失败可以pip安装或者自行搜索导入教程。

import imutils
import cv2
from imutils.paths import list_images
import argparse
import numpy as np
import os

这个是颜色直方图的类,在这里简单介绍一下颜色直方图calcHist()。颜色直方图可以将显示图片中各像素数值区间内像素的数量。例如,我们将bin设为2,那么意味着我们将像素范围[0,255]等比例分为2份[0,127];[128,255]。然后计算图片里属于[0,127]的像素的个数和属于[128,255]的像素的个数。像素数值的大小反映了亮暗程度,各个通道RGB的像素又分别代表了颜色的深浅。于是两幅整体颜色相近的图片的颜色直方图是类似的。
在实际应用时我们也应该注意一点,不同图像的像素数量可能不同,于是我们可以使用归一化normalize(),将数量换成比例。例如[100,300],经过归一化后变为[0.25,0.75]。这样就可以比较不同大小的图像的颜色直方图。

class ColorHistogram:def __init__(self,bins):self.bins=binsdef 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()

初始化,bin选择32。我们要注意bin的选择会影响数据量的多少,对于小数据集来说,bin选取较大时构建颜色直方图的时间似乎并没有增长太多。但是对于后续比较相似度时,bin的大小将会明显影响计算的时间。而且可以肯定的是,bin选取越大对于分类的准确性是有提升的。但是提升的幅度可能在到达某一点后就大幅减少,此时再通过堆计算量来提升那一两个百分点其实是没有必要的,尤其是对于专注于应用的同学。

ap=argparse.ArgumentParser()
ap.add_argument("-d","--dataset",required=True)
ap.add_argument("-i","--image",required=True)
args=vars(ap.parse_args())index={}
desc=ColorHistogram([32,32,32])for imagePath in list_images(args["dataset"]):k=imagePath[imagePath.rfind("/")+1:]image=cv2.imread(imagePath)features=desc.describe(image)index[k]=features

读取我们的图像库,我的图像库里有从网上下载的20张图片,分别包括海洋,树林和沙漠。
定义我们的分类的类,这里面chi2_distance()就是本文使用的相似度指标。我们在这里面对目标图像的图像描述符和图像库的各个图像的图像描述符基于相似度指标来计算相似度,并将其按小到大的顺序排列。

class Classif:def __init__(self,index):self.index=indexdef classif(self,iFeature):results={}for (k,features) in self.index.items():d=self.chi2_distance(features,iFeature)results[k]=dresults=sorted([(v,k) for (k,v) in results.items()])return resultsdef 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

读取我们的目标图片,提取图像描述符并进行分类。分类结束后,我们提取图像库中相似度最高的五张图像进行展示。

image=cv2.imread(args["image"])
cv2.imshow("Image",image)Features=desc.describe(image)clas=Classif(index)
results=clas.classif(Features)montage=np.zeros((100*5,200,3),dtype="uint8")for j in range(0,5):(score,imageName)=results[j]path=os.path.join(args["dataset"],imageName)result=cv2.imread(path)result=cv2.resize(result,(200,100))if j<5:montage[j*100:(j+1)*100,:]=resultcv2.imshow("Result",montage)
cv2.waitKey(0)

结果



看起来不错,但很明显这个分类器对颜色很敏感,并不完全符合我们对于分类器的需求。我们也可以根据我们想要分类图片的特征来选取图像描述符,例如有些图片里物体的形状特征很明显。当然,后期我们也会介绍神经网络,深度学习的方法,这个是目前的主流。

“本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/kasami_/article/details/123834951。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”

基于传统CV实现图片分类(以图搜图)相关推荐

  1. 基于内容的图像检索引擎(以图搜图)

    基于内容的图像检索引擎(以图搜图) 本文介绍一些基于内容的图像检索技术(Content-Based Image Retrieval,CBIR)的搜索引擎(即以图搜图),这类搜索引擎基本上代表了图像检索 ...

  2. 使用AnalyticDB轻松实现以图搜图和人脸检索

    1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...

  3. 无法检索数据和目标数据的列信息_使用AnalyticDB轻松实现以图搜图和人脸检索...

    1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...

  4. 实战 | 多种方法实现以图搜图

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI 算法与图像处理 概述 以图搜图技术是日常生活中常用 ...

  5. 十大相似图片搜索网站(以图搜图)

    十大相似图片搜索网站(以图搜图) 2011-04-13 21:07:56|  分类: 默认分类 |  标签:以图搜图  图片搜索  搜图  百度搜图  搜索引擎  |举报|字号 订阅 下载LOFTER ...

  6. 图像匹配,基于深度学习DenseNet实现以图搜图功能

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图 ...

  7. 11款相似图片搜索引擎推荐,以图搜图将不再是难事

    你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始大图吗? 下面的十一款搜索引擎可以帮你实现,以图找图,以图搜图,以图片搜索相似的图片. 1.http://tineye.com/ ...

  8. 零基础实战行人重识别ReID项目-基于Milvus的以图搜图

    目录 第一阶段,ReID的基本概念 1.1 ReID定义 1.2 技术难点 1.3 常用数据集 1.4 评价指标 1.5 实现思路 1.6 具体方案 第二阶段:复现算法 2.1 PCB的骨干网络 2. ...

  9. 基于深度学习实现以图搜图功能

    前记: 深度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图像检索这一块儿,目前有谷歌的以图搜图,百度的以图搜图,而百度以图搜图的关键技术叫做"感 ...

最新文章

  1. Linux软件安装-----apache安装
  2. IMEI, ESN, MEID
  3. android怎样将bar的label居中_从iPhone换成Android手机之后,将是一种怎样的不同体验...
  4. Lucene学习总结之七:Lucene搜索过程解析
  5. scala学习笔记-集合操作(15)
  6. 2mysql_2.Mysql常用命令行大全
  7. spring aop实现原理_Spring 异步实现原理与实战分享
  8. mod_wsgi 的两种模式
  9. 索引sql server_维护SQL Server索引
  10. Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】...
  11. ModelMaker的教學網站
  12. 智能移动项目打包发布经验交流
  13. 数据可视化:Metabase
  14. 工程导论【职业能力与职业培养】
  15. PCB板制造工艺讲解,动图揭秘PCB板生产流程
  16. 情景分析是什么?我们该如何去理解这个概念?
  17. Vue学习----第三天_webpack(学习webpack看这一篇就够了1.8w字)【6.7】
  18. 【Only one connection receive subscriber allowed with】
  19. 浪潮AI的五个关键抉择
  20. 由113号元素鉨114号元素夫115号元素镆元素汞银金等元素构成的超导体

热门文章

  1. mysql 中 使用truncate table XXXX 的时候出现 DROP command denied to user 'xxx' for table ' YYY的问题解决
  2. SecureCRT乱码解决
  3. 大学生交友平台——结构化需求分析与建模
  4. 6.1 葡萄酒评论分析报告
  5. Windows中的“OLE”技术,是什么技术,它可以实现多个文件之间的住处传递和共享...
  6. YUV与RGB间的转换公式
  7. (ros/move_base)move介绍
  8. ftp爆破FunboxLunchbreaker
  9. 详解SEO搜索引擎优化
  10. 2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)