图像检索系统 - 基于SIFT特征和颜色直方图的相似性搜索

本代码实现了一个简单的图像检索系统,利用SIFT特征和颜色直方图来描述图像,并使用PCA降维,最后通过KNN算法进行相似性搜索。

代码说明:

import cv2
import numpy as np
import os
from sklearn.decomposition import PCA

# 图像集文件夹路径
IMAGE_FOLDER_PATH = './100/'

# 需要检索的图片路径
QUERY_IMAGE_PATH = './01.jpg'

# KNN参数
KNN_K = 3

# 颜色直方图参数
HISTOGRAM_SIZE = [4, 4, 4]
# HISTOGRAM_SIZE = [8, 8, 8]
# PCA参数
PCA_COMPONENTS = 5
# PCA_COMPONENTS = 300

def read_images(image_folder_path):
    '''
    读取并返回图像集
    :param image_folder_path: 图像集文件夹路径
    :return: 图像集列表
    '''
    images = []
    for file_name in os.listdir(image_folder_path):
        if file_name.endswith('.jpg'):
            file_path = os.path.join(image_folder_path, file_name)
            images.append(cv2.imread(file_path))
    return images


def extract_sift_features(image):
    '''
    提取图像SIFT特征
    :param image: 输入图像
    :return: 特征向量
    '''
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sift = cv2.xfeatures2d.SIFT_create()
    keypoints, descriptors = sift.detectAndCompute(gray_image, None)
    return descriptors


def compute_color_histogram(image, histogram_size):
    '''
    计算图像颜色直方图特征向量
    :param image: 输入图像
    :param histogram_size: 直方图尺寸
    :return: 特征向量
    '''
    histogram = cv2.calcHist([image], [0, 1, 2], None, histogram_size, [0, 256, 0, 256, 0, 256])
    histogram = cv2.normalize(histogram, None).flatten()
    return histogram


def run_pca(features, components):
    '''
    使用PCA方法进行特征降维
    :param features: 待降维特征
    :param components: 保留主成分数量
    :return: 降维后的特征
    '''
    pca = PCA(n_components=components)
    pca.fit(features)
    reduced_features = pca.transform(features)
    return reduced_features


# 读取图像集
image_set = read_images(IMAGE_FOLDER_PATH)

# 提取SIFT和颜色直方图特征
sift_features = []
color_histograms = []
for image in image_set:
    sift_features.append(extract_sift_features(image))
    color_histograms.append(compute_color_histogram(image, HISTOGRAM_SIZE))

# 转换特征向量形状
sift_features = np.vstack(sift_features)
color_histograms = np.vstack(color_histograms)


# # 对SIFT特征进行PCA降维
# sift_features = run_pca(sift_features, PCA_COMPONENTS)

# 对SIFT特征进行PCA降维
sift_features = run_pca(sift_features, PCA_COMPONENTS)
query_sift_features = run_pca(query_sift_features, PCA_COMPONENTS)


# 读取要查询的图像
query_image = cv2.imread(QUERY_IMAGE_PATH)

# 提取SIFT和颜色直方图特征
query_sift_features = extract_sift_features(query_image)
query_color_histogram = compute_color_histogram(query_image, HISTOGRAM_SIZE)

# 调整特征向量形状
query_sift_features = query_sift_features.reshape((1, -1))

# 对SIFT特征进行PCA降维
query_sift_features = run_pca(query_sift_features, PCA_COMPONENTS)

# 计算待查询图像的SIFT和颜色直方图特征与图像集中所有图像的距离
sift_distances = np.linalg.norm(sift_features - query_sift_features, axis=1)
color_histogram_distances = np.linalg.norm(color_histograms - query_color_histogram, axis=1)

# 合并SIFT和颜色直方图特征的距离结果
distances = sift_distances + color_histogram_distances

# 对距离结果进行排序,并获取前K个相似的图像索引
sorted_index = np.argsort(distances)[:KNN_K]

# 显示结果
for i in sorted_index:
    cv2.imshow(f'Result-{i}', image_set[i])
cv2.waitKey(0)
cv2.destroyAllWindows()

n_components=128 must be between 0 and min(n_samples, n_features)=1 with svd_solver='full'
如何解决这个问题内容:这个问题的原因是PCA方法中保留的主成分数量超过了样本数量或特征数量的最小值。解决方法是调整PCA_COMPONENTS参数的值,使其不超过样本数量或特征数量的最小值。也可以尝试使用其他的PCA方法或降维方法,如Kernel PCA或t-SNE。

代码功能:

  1. 读取图像集: 从指定的文件夹路径读取所有jpg格式的图像。
  2. 提取特征: 对每张图像提取SIFT特征和颜色直方图特征。
  3. PCA降维: 对SIFT特征和颜色直方图特征分别进行PCA降维,减少特征维度,加快计算速度。
  4. 计算距离: 计算待查询图像的SIFT特征和颜色直方图特征与图像集中所有图像的距离。
  5. 相似性搜索: 使用KNN算法找出与待查询图像最相似的K张图像。
  6. 显示结果: 显示找到的K张相似图像。

代码使用:

  1. 确保已经安装了OpenCV和Scikit-learn库。
  2. 将代码中的IMAGE_FOLDER_PATHQUERY_IMAGE_PATH修改为实际的图像文件夹路径和待查询图像路径。
  3. 运行代码,即可进行图像检索。

代码改进:

  1. 可以使用其他特征提取方法,例如HOG特征、SURF特征等。
  2. 可以使用其他距离计算方法,例如余弦距离等。
  3. 可以使用其他降维方法,例如Kernel PCA、t-SNE等。
  4. 可以使用其他相似性搜索方法,例如最近邻搜索、聚类搜索等。

代码注意事项:

  1. PCA_COMPONENTS参数的值需要根据实际情况进行调整,不能超过样本数量或特征数量的最小值。
  2. 如果出现n_components=128 must be between 0 and min(n_samples, n_features)=1 with svd_solver='full'错误,则需要调整PCA_COMPONENTS参数的值或尝试使用其他的PCA方法。
  3. 本代码仅供参考,实际应用中需要根据具体需求进行调整。

代码示例:

# 图像集文件夹路径
IMAGE_FOLDER_PATH = './images/'

# 需要检索的图片路径
QUERY_IMAGE_PATH = './query.jpg'

# 运行代码
# ...

运行结果:

代码运行后,将显示与待查询图像最相似的K张图像。

总结:

本代码实现了一个简单的图像检索系统,结合SIFT特征和颜色直方图,利用PCA降维,并使用KNN算法进行相似性搜索。该系统可以帮助用户快速找到与待查询图像相似的图像。

图像检索 - 基于SIFT特征和颜色直方图的相似性搜索

原文地址: https://www.cveoy.top/t/topic/nXgX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录