基于SIFT和颜色直方图的图像检索
基于SIFT和颜色直方图的图像检索
本代码使用SIFT特征、颜色直方图和PCA降维技术实现图像检索。
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()
# 错误处理
try:
# 读取要查询的图像
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()
except Exception as e:
print(f'Error: {e}')
代码功能:
- 读取图像集: 从指定文件夹读取所有jpg格式的图像。
- 提取特征: 使用SIFT算法提取图像特征,并计算颜色直方图。
- 降维: 使用PCA算法对SIFT特征进行降维。
- 计算距离: 计算待查询图像的SIFT特征和颜色直方图特征与图像集中所有图像的距离。
- 排序: 对距离结果进行排序,获取前K个最相似的图像。
- 显示结果: 显示检索到的图像。
- 错误处理: 使用try-except语句捕获可能出现的异常,并打印错误信息。
代码优化:
- 代码注释: 添加详细的注释,解释代码逻辑。
- 可读性: 使用规范的代码风格,提高代码可读性。
- 错误处理: 添加错误处理机制,避免程序崩溃。
- 搜索引擎优化: 添加标题、描述和关键词,方便搜索引擎收录。
使用说明:
- 将代码保存为python文件。
- 修改
IMAGE_FOLDER_PATH和QUERY_IMAGE_PATH为您的图像路径。 - 运行代码,程序将显示与查询图像最相似的K个图像。
注意:
- 本代码需要安装OpenCV和scikit-learn库。
- 您可以根据需要调整
HISTOGRAM_SIZE和PCA_COMPONENTS参数。 - 如果您的图像格式不是jpg,请修改代码中的
if file_name.endswith('.jpg')条件。
原文地址: https://www.cveoy.top/t/topic/nXhc 著作权归作者所有。请勿转载和采集!