【图像处理】图像检索的三种python实现(直方图/OpenCV/哈希法)

本文介绍了使用Python进行图像检索的三种方法:自定义直方图比较、OpenCV库的直方图比较和平均哈希值比较。直方图比较涉及像素统计和色彩分布,而哈希法依赖于图像指纹和汉明距离。通过实验,作者发现OpenCV的compareHist函数速度快但精度有限,而平均哈希法在大量数据下速度较慢,可通过预计算提高效率。
摘要由CSDN通过智能技术生成

简介:

本文介绍了图像检索的三种实现方式,均用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) 具体实现

  • 用到的函数:
    split_Img()
    calc_Hist(img)
    calc_Similar(h1,h2)
    calc_Similar_Split(h1,h2)
  • 遍历图片的像素点以计算直方图: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 
  • 直方图比较 calc_Similar(h1,h2)
    采用的公式是:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值