Built to order

Duplicate Photo Finder with Visual Similarity

PixelPrune is a desktop utility that finds duplicate photos by how they look, not by filename or byte-exact match — so burst shots, re-saved copies and lightly retouched variants are caught too. Each photo is reduced to a 64-bit perceptual hash (dHash); photos whose hashes differ by only a few bits are grouped as visual duplicates with a similarity score. Groups show side-by-side with the differing hash bits highlighted, the largest file is auto-marked to keep, and selected copies delete to the recycle bin — never silently. It ships with full source, documentation and the viva kit. Suitable

Duplicate Photo Finder with Visual Similarity — project thumbnail preview
More project photos (2)

The problem

Phone galleries silently accumulate duplicates: burst mode fires 20 shots to get one good one, WhatsApp forwards re-save the same image under new names, and "final_final_edit.jpg" sits next to the original. Byte-exact duplicate finders miss all of these — the files differ, the photos don't. PixelPrune works the way human eyes do: it shrinks each photo to 9×8 grayscale, compares each pixel with its right neighbour, and builds a 64-bit perceptual fingerprint (dHash). Two photos of the same scene produce fingerprints that differ in only a handful of bits even after cropping, re-compression or light retouching; two different scenes differ in roughly half. The Hamming distance between fingerprints becomes a similarity percentage, an adjustable threshold groups the library, and the compare view shows the pair side-by-side with the differing fingerprint bits outlined in amber. Deletion is deliberately conservative: the largest file per group is pre-marked "keep", the user ticks the rest, and everything goes to the recycle bin. The demo is a working web prototype of the desktop tool, running the real dHash pipeline on real photographs in the browser.

How it works

  1. The user selects folders; the scanner enumerates image files (JPG, PNG, HEIC, WebP) — nothing is uploaded, all hashing is local.
  2. Each photo is downscaled to 9×8 grayscale and each pixel is compared with its right neighbour to build a 64-bit dHash fingerprint.
  3. Pairwise Hamming distances are computed; photos within the threshold's bit budget are clustered into duplicate groups.
  4. Groups are ranked by similarity; the largest file in each group is marked KEEP and the reclaimable MB is totalled.
  5. The user reviews groups, opens the compare view for any pair to see the similarity score and differing hash bits.
  6. The user ticks unwanted copies; the delete bar shows the count and MB to be freed.
  7. Confirmed deletions move files to the recycle bin; the scan summary updates with the new library state.

Tech stack:

  • Python (desktop hashing engine + scanner)
  • dHash perceptual hashing (64-bit fingerprints)
  • Hamming-distance clustering
  • Tkinter / PyQt desktop UI (built-to-order app)
  • HTML5 · CSS3 · JavaScript (working web demo of the pipeline)
  • Canvas-based hash computation in the demo
  • Pillow (image loading and downscaling)
  • Git version control
Parameter Value
Fingerprint 64-bit dHash per photo
Comparison Hamming distance → similarity %
Default threshold 78% similarity (adjustable 60–98%)
Formats JPG, PNG, HEIC, WebP (design target)
Processing Fully local — no uploads
Delete safety Recycle bin + keep-one-per-group enforced
Library size 10,000+ photos supported (design target)
Demo Single-file web app running the real pipeline

Project features

  • [Perceptual hashing engine] 64-bit dHash fingerprints computed per photo — robust to re-save, resize and light retouching.
  • [Visual similarity grouping] Photos clustered by Hamming distance with a similarity percentage per group (e.g. 97% similar).
  • [Adjustable threshold slider] Lower values catch looser matches, higher values only near-identical shots — groups re-compute instantly.
  • [Side-by-side compare] Any pair opens large with both 64-bit fingerprints shown and differing bits highlighted.
  • [Smart keep suggestion] The largest file in each group is auto-marked KEEP, maximizing the space saved per deletion.
  • [Reclaimable-space accounting] Live MB totals per group and overall, so the payoff of cleanup is visible before deleting.
  • [Safe delete] Selected copies move to the recycle bin, never hard-erased; "keep at least one per group" is enforced.
  • [Folder-scoped scanning] Scan Pictures, Downloads or a phone DCIM folder, with subfolders included automatically.

What is included

  • Complete desktop application source code (Python)
  • Perceptual hashing + clustering engine
  • Scan results, compare and settings screens as designed
  • Working web demo running dHash on real photos in-browser
  • Sample 10-photo library (3 near-duplicate pairs + 4 unique)
  • Project report PDF (problem, dHash theory, clustering, complexity, testing)
  • PPT presentation for final review
  • Viva Q&A preparation document (perceptual vs cryptographic hashing, Hamming distance, threshold trade-offs)

Limitations & prerequisites

  • Similarity is visual, not semantic — two different photos of the same sunset may group at low thresholds; the slider and compare view exist for exactly this.
  • Heavy edits (major crops, filters changing most pixels) raise the Hamming distance and may escape the default threshold.
  • HEIC support depends on platform codecs on the buyer's machine.
  • The demo runs in-browser on a 10-photo sample; the desktop build scales to full libraries with an indexed hash cache.
  • Face-aware "same person" grouping is not included — this is pixel-similarity dedup, not face recognition.

Frequently Asked Questions

How is this different from finding byte-identical files?

Cryptographic hashes (MD5/SHA) change completely when one pixel changes. Perceptual hashing (dHash) changes by only a few bits for visually similar photos, so burst shots and re-saved copies are caught.

What does the similarity percentage mean?

It's (64 − Hamming distance) / 64: a 97% pair differs in ~2 of 64 fingerprint bits. The compare view shows exactly which bits differ.

Will it delete photos by itself?

Never. The user ticks copies explicitly, the largest file per group is pre-marked keep, and deletions go to the recycle bin.

Why did two different photos get grouped?

At low thresholds, visually similar scenes (two beach sunsets) can group. Raise the threshold or review the pair in Compare — the differing-bits view makes the call obvious.

Does it upload my photos anywhere?

No — hashing and clustering run entirely on the local machine (and in the demo, entirely in the browser).

Is this project suitable for a final-year project?

Yes — for Computer Science and IT programs. It demonstrates image processing, hashing, distance metrics, clustering and careful destructive-action UX in one working tool. Suitable for B.E./B.Tech final-year projects in Computer Science and IT.

Components & software requirements
  • Python (desktop hashing engine + scanner)
  • dHash perceptual hashing (64-bit fingerprints)
  • Hamming-distance clustering
  • Tkinter / PyQt desktop UI (built-to-order app)
  • HTML5 · CSS3 · JavaScript (working web demo of the pipeline)
  • Canvas-based hash computation in the demo
  • Pillow (image loading and downscaling)
  • Git version control
Delivery information

Built-to-order project. Delivery timeline is shared after order confirmation based on current queue.

Support terms

Complete documentation, setup guide, and viva preparation included. Support for setup and explanation provided.

Download abstract (PDF)

Related guides

All guides
Illustration of JWT authentication: a brass key handing a glowing sealed token to a server rack and a laptop login screen, linked by a chain motif.B.E./B.Tech Computer Science and IT students adding login and protected APIs to their final-year web projects

JWT Authentication for Students: Tokens, Signatures, Refresh Flows and a Node.js Implementation

How does JWT login actually work? When a user logs in, the server issues a signed token in three parts — header, payload, signature. The client sends it back as an Authorization: Bearer header, and the server verifies the signature instead of looking up a session. This guide decodes a real token by hand, walks through the full login and refresh flow, and builds a working Node.js implementation with bcrypt password hashing, token rotation, and storage rules that survive a viva.

Read guide
Illustration of SQL versus NoSQL: neat filing-cabinet table rows on one side against flexible nested document cards on the other, joined by dotted lines.B.E./B.Tech Computer Science and IT students choosing and designing the database for their final-year project

SQL vs NoSQL for Final-Year Projects: Which Database Should You Pick?

MySQL or MongoDB for your final-year project? SQL databases store data in related tables with enforced schemas, joins and transactions — the right default when your data is structured and money or records must stay consistent. NoSQL document stores trade the rigid schema for flexible, nested documents that ship faster when your data shape keeps changing. This guide compares them with a worked hospital-appointment example in both, a decision table, and rules matched to common project archetypes.

Read guide
Editorial illustration of shipping containers transforming into glowing software windows beside a laptop showing container layers, in blue and teal tones.B.E./B.Tech Computer Science and IT final-year students shipping web/backend projects

Docker for Student Projects: Images, Containers and Compose from Zero

End ‘it works on my machine’ failures: learn what Docker images and containers actually are, write lean Dockerfiles that exploit layer caching, persist data with volumes, orchestrate app-plus-database with Compose, and package an evaluator-proof submission — with the debugging table for every error you will definitely meet.

Read guide
Get a quotation