首页 > 其他分享 >使用OpenCV实现以图搜图

使用OpenCV实现以图搜图

时间:2024-03-26 13:34:00浏览次数:20  
标签:搜图 image cv2 OpenCV 以图 哈希 图像 query path

使用OpenCV实现以图搜图

什么是以图搜图?

以图搜图,简单来说,就是通过搜索图像的文本或视觉特征,帮助用户找到与这张图片相似或相关的其他图形图像资料。

感知哈希算法

感知哈希算法(Perceptual Hashing Algorithm,简称PHA或PHash)是一种用于检测非结构化数据(如图像、视频、音频)相似性的技术。其原理是利用数据的频谱特征来描述对象,并通过一定的数学方法计算出一个哈希码(Hash String),以此来表示该对象的特征。当数据的频谱特征发生变化时,其对应的哈希码也会相应改变。

算法实现步骤

感知哈希算法实现步骤主要包括以下几步:

  1. 缩小尺寸:将图像缩小到一定的尺寸,比如8x8,总共64个像素。这一步的目的是去除图像的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图像差异。
  2. 简化色彩:将缩小后的图像转为灰度图,即所有像素点都转换为灰度值。简化色彩有助于突出图像的主要特征,降低计算的复杂度。
  3. 计算平均值:计算所有像素的灰度平均值。这个平均值将作为后续比较像素灰度的基准。
  4. 比较像素灰度:将每个像素的灰度值与平均值进行比较。如果像素的灰度值大于或等于平均值,则记录为1,否则记录为0。
  5. 计算哈希值:将上一步的比较结果组合在一起,形成一个固定长度的哈希值。这个哈希值就是图像的“指纹”,代表了图像的主要特征。
  6. 对比图片指纹:在生成了每个图像的哈希值(即指纹)之后,就可以开始对比不同的图片指纹了。通常,会计算两个指纹之间的差异度,例如,通过比较两个哈希值中不同位的数量。如果差异度低于某个预设的阈值,就认为这两张图片是相似的;如果差异度高于阈值,则认为它们是不同的图片。

效果

要搜索的图片:
在这里插入图片描述
搜索的图片库:
在这里插入图片描述
匹配出3个最接近的图片:
在这里插入图片描述

源码

import glob
import cv2
import numpy as np
import matplotlib.pyplot as plt


# ------------------ 辅助函数 ------------------

def resize_and_grayscale(image, size=(8, 8)):
    """将图像缩放并转换为灰度图。"""
    resized = cv2.resize(image, size)
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
    return gray


def compute_hash(image, size=(8, 8)):
    """计算图像的感知哈希值。"""
    gray = resize_and_grayscale(image, size)
    mean = np.mean(gray)
    binary = (gray > mean).astype(int)
    return binary.flatten()


def compute_hamming_distance(hash1, hash2):
    """计算两个哈希值之间的汉明距离。"""
    xor = np.bitwise_xor(hash1, hash2)
    return np.sum(xor)


def load_images_from_folder(folder, extensions=('jpg', 'jpeg', 'gif', 'png', 'bmp')):
    """从指定文件夹加载图像,并返回图像文件名和哈希值的列表。"""
    images = []
    for ext in extensions:
        images.extend(glob.glob(f'{folder}/*.{ext}'))
    hashes = {img_path: compute_hash(cv2.imread(img_path)) for img_path in images}
    return hashes


# ------------------ 主程序 ------------------

def main():
    # 设置检索图像路径
    query_image_path = "img_2.png"
    query_image = cv2.imread(query_image_path)
    if query_image is None:
        print(f"Error: Unable to load query image {query_image_path}")
        return

    query_hash = compute_hash(query_image)
    print(f"检索图像的感知哈希值为:\n{query_hash}")

    # 加载指定文件夹下的所有图像及其哈希值
    image_hashes = load_images_from_folder('img')

    # 找出最相似的图像
    distances = [(compute_hamming_distance(query_hash, image_hash), image_path)
                 for image_path, image_hash in image_hashes.items()]
    sorted_distances = sorted(distances)

    # 绘制结果
    fig, axs = plt.subplots(1, 4, figsize=(12, 4))
    axs[0].imshow(cv2.cvtColor(query_image, cv2.COLOR_BGR2RGB))
    axs[0].set_axis_off()
    axs[0].set_title("Query Image")

    for i, (distance, image_path) in enumerate(sorted_distances[:3], start=1):
        image = cv2.imread(image_path)
        axs[i].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
        axs[i].set_axis_off()
        axs[i].set_title(f"Result {i} - Distance: {distance}")

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    main()

标签:搜图,image,cv2,OpenCV,以图,哈希,图像,query,path
From: https://blog.csdn.net/summerriver1/article/details/137025000

相关文章

  • OpenCV模板匹配(匹配图片中对应元素)
    OpenCV模板匹配(匹配图片中对应元素)模板匹配方法单个元素进行匹配并绘制矩形框效果代码模板匹配方法模板是被查找目标的图像,查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法,其语法如下:result=cv2.matchTemp......
  • opencv 灰度变换(灰度化)
    加权平均值法:D=(R*30+G*59+B*11)/100,其中RGB分别是红,绿,蓝颜色通道的像素值。取最大值法:D=max(R,G,B)平均值法:D=(R+G+B)/3importcv2importnumpyasnpimage=cv2.imread("C:/Users/wangyiyuan/Desktop/20200201172603_hocyy.jpg")h=np.shape(image)[0]w=np.shape(image)......
  • 开源计算机视觉库OpenCV详解
    OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。OpenCV最初由Intel开发,后来支持由WillowGarage和Itseez(被Intel收购)进行的维护和更新。这个库旨在为实时的计算机视觉应用提供一个高效的、易于使用的环境,并且是用C++编写的,尽管它提供了......
  • Windows VS2019+opencv配置
    本文是VS2019和opencv4.5.5版本1、配置环境变量(可能用户变量也需要配置)2、打开VS2019添加新属性表,分别为Debud和Release添加3、选择新建属性表的属性,进行下图步骤注意:debug模式和Release模式配置不一样,需要单独配置,debug模式附加依赖项比Release模式多了一个“d”,De......
  • 毕业设计——基于OpenCV的移动端人脸智能比对系统设计与实现
    本论文源码是基于OpenCV库实现的Android端的人脸识别及智能比对系统,如需完整源码,可以联系博主获取。一、论文综述随着移动互联网的快速发展和智能手机的普及,人脸识别技术作为生物识别技术的重要分支,其在移动端的应用逐渐受到广泛关注。人脸识别技术不仅具有非接触性、非强......
  • 开源计算机视觉库OpenCV详解
    开源计算机视觉库OpenCV是一个功能强大的工具,用于实现各种计算机视觉应用。以下是对OpenCV的详细解释和使用示例:一、功能概述OpenCV涵盖了广泛的计算机视觉领域,包括但不限于以下功能:图像处理:包括图像加载、保存、调整大小、旋转、裁剪、滤波、边缘检测等。OpenCV提供了丰富......
  • Ubuntu18.04 安装opencv(亲测有用)
    1、安装依赖环境sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakegitlibgtk2.0-devpkg-configlibavcodec-devlibavformat-devlibswscale-devsudoapt-getinstallpython-devpython-numpylibtbb2libtbb-devlibjpeg-devlibpng-devlibtiff-devl......
  • OpenCV4中的图像滤波函数定义,原理,以及区别(Python)
    图像滤波1.方框滤波方框滤波的滤波器为矩形,滤波器中的所有元素值均相等。定义如下:dst=boxFilter(src,ddepth,ksize,dst=None,anchor=None,normalize=None,borderType=None)src:输入图像。ddepth:处理后的目标图像的深度,若为-1,则深度与原始图像的深度相同。ks......
  • 在不知道相机内参的情况下,利用opencv库进行基于特征点匹配的极线校正
    defrectify_image(img1,img2):#初始化SIFT检测器sift=cv2.SIFT_create()#检测关键点和计算描述符kp1,des1=sift.detectAndCompute(img1,None)kp2,des2=sift.detectAndCompute(img2,None)#使用FLANN匹配器进行特征点匹配FLANN_INDEX_K......
  • Debug环境配置能编译、调试,而 Release 却不能编译,找不到opencv_world480d.lib,我的解决
    这个问题弄了好久,网上的查看了N多资料,看来问题各不相同,总是弄不好。终于弄好,总结如下几点:1、弄清楚版本号,我用的是VS2017,对应的应该是VC15。opencv_world480d.lib对应的opencv估计是不支持,其目录中只有一个VC16,奇怪的是DEBUG模式认这个手动,将opencv下的VC16改为VC15,......