The Palos Publishing Company

Follow Us On The X Platform @PalosPublishing
Categories We Write About

Build a local image search tool

Here’s a complete guide to building a local image search tool using Python. The tool will allow users to search for images in a directory using image similarity (via feature extraction) or file names.


Requirements

Install the required libraries first:

bash
pip install opencv-python scikit-learn numpy pillow matplotlib

Python Script: Local Image Search Tool

python
import os import cv2 import numpy as np from sklearn.metrics.pairwise import cosine_similarity from PIL import Image import matplotlib.pyplot as plt # Directory containing your local images IMAGE_DIR = "images" # Supported image formats SUPPORTED_FORMATS = (".jpg", ".jpeg", ".png", ".bmp", ".tiff") def load_images(image_dir): images = {} for filename in os.listdir(image_dir): if filename.lower().endswith(SUPPORTED_FORMATS): path = os.path.join(image_dir, filename) image = cv2.imread(path) images[filename] = image return images def extract_features(image, size=(100, 100)): image = cv2.resize(image, size) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return image.flatten() def build_feature_database(images): feature_db = {} for name, img in images.items(): feature_db[name] = extract_features(img) return feature_db def search_similar_images(query_image_path, feature_db, top_k=5): query_image = cv2.imread(query_image_path) query_features = extract_features(query_image) similarities = {} for name, features in feature_db.items(): sim = cosine_similarity([query_features], [features])[0][0] similarities[name] = sim sorted_results = sorted(similarities.items(), key=lambda x: x[1], reverse=True) return sorted_results[:top_k] def show_images(result_list, images): plt.figure(figsize=(15, 5)) for i, (name, score) in enumerate(result_list): img = cv2.cvtColor(images[name], cv2.COLOR_BGR2RGB) plt.subplot(1, len(result_list), i + 1) plt.imshow(img) plt.title(f"{name}nScore: {score:.2f}") plt.axis("off") plt.show() def main(): print("Loading image database...") images = load_images(IMAGE_DIR) feature_db = build_feature_database(images) query_path = input("Enter path to query image: ") if not os.path.exists(query_path): print("Image not found.") return results = search_similar_images(query_path, feature_db) print("nTop Matches:") for name, score in results: print(f"{name} (Similarity: {score:.2f})") show_images(results, images) if __name__ == "__main__": main()

Features

  • Image content-based search using grayscale histogram vectors.

  • Top-k similarity ranking with cosine similarity.

  • Visual preview using matplotlib.

  • Easily expandable with more advanced models like ResNet for deeper features.


Optional Enhancements

  1. Add filename keyword search:

    python
    def search_by_filename(keyword, image_db): return {name: img for name, img in image_db.items() if keyword.lower() in name.lower()}
  2. Use deep learning features (e.g., from VGG16 or ResNet with torchvision or keras.applications) for higher accuracy in visual similarity.

  3. Web Interface using Flask or Streamlit.


Let me know if you’d like a Streamlit or Flask version to turn it into a GUI/web app.

Share this Page your favorite way: Click any app below to share.

Enter your email below to join The Palos Publishing Company Email List

We respect your email privacy

Categories We Write About