扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
简介:
本文介绍了图像检索的三种实现方式,均用python完成,其中前两种基于直方图比较,哈希法基于像素分布。
检索方式是:提前导入图片库作为检索范围,给出待检索的图片,将其与图片库中的图片进行比较,得出所有相似度后进行排序,从而检索结果为相似度由高到低的图片。由于工程中还包含Qt界面类、触发函数等其他部分,在该文档中只给出关键函数的代码。
开发系统:MacOS
实现方式:Qt + Python
方法一:自定义的直方图比较算法
a) 基本思路
遍历图片像素点,提取R\G\B值并进行对应的计数,得到原始直方图,但由于0-255的范围太大,因此每一个像素值的统计量均偏小,因此分别将R\G\B的256个像素值映射到0-31共32个像素值上,将像素值范围由256*3缩小到32*3。记录像素值采用的数据结构为一维数组,第1到32个值为R的像素直方图,第33到第64个值为G的像素统计,第65到96个值为B的像素统计。得到直方图后,计算待检索图的直方图和图片库中图像的直方图之间的相似性。
b) 具体实现
用到的函数:
遍历图片的像素点以计算直方图:calc_Hist(img)
尝试了两种方式,第一种是对图像遍历时逐个调用getpixel()来获取R,G,B的值,但发现这种方式的速度太慢。第二种采用的是内存读取,利用load()函数一次性读取图像的像素值,然后对像素值进行遍历,该方法的速度比逐个提取更快。
#统计直方图,用load()载入图片的像素pix,再分别读取每个像素点的R\G\B值进行统计(分别为0-255) #将256个颜色值的统计情况投影到32个,返回R\G\B投影后的统计值数组,共32*3=96个元素 def calc_Hist(img): ''' #120张图片,4.43s w,h = img.size pix = img.load() #载入图片,pix存的是像素 calcR = [0 for i in range(0,32)] calcG = [0 for i in range(0,32)] calcB = [0 for i in range(0,32)] for i in range(0,w): for j in range(0,h): (r,g,b) = pix[i,j] #print (r,g,b) calcR[r/8] += 1 calcG[g/8] += 1 calcB[b/8] += 1 calcG.extend(calcB) calcR.extend(calcG) return calcR ''' #120张图,3.49s w,h = img.size pix = img.load() #载入图片,pix存的是像素 calcR = [0 for i in range(0,256)] calcG = [0 for i in range(0,256)] calcB = [0 for i in range(0,256)] for i in range(0,w): for j in range(0,h): (r,g,b) = pix[i,j] #print (r,g,b) calcR[r] += 1 calcG[g] += 1 calcB[b] += 1 calcG.extend(calcB) calcR.extend(calcG) #256*3 #calc存放最终结果,32*3 calc = [0 for i in range(0,96)] step = 0 #calc的下标,0~95 start = 0 #每次统计的开始位置 while step < 96: for i in range(start,start+8): #8个值为1组,统计值相加,eg:色彩值为0~7的统计值全部转换为色彩值为0的统计值 calc[step] += calcR[i] start = start+8 step += 1 #print calc return calc
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流