Images & Videos

Find Duplicate & Similar Images and Videos

7 algorithms, each working differently. Pick the right one for your files and Sakarto automatically groups every duplicate — even resized, re-compressed, or edited copies. 100% local, no uploads, results appear live.

JPEG, PNG, GIF, WebP, BMP MP4, WebM, MOV, MKV 100% Local Live Results 7 Algorithms

How It Works

  1. 📂
    1. Pick a Folder
    Select any folder. Subfolders included automatically. Or drag & drop.
  2. 2. Scan Runs
    Each file gets a fingerprint inside your browser. No data leaves your machine.
  3. 🔍
    3. Groups Appear Live
    Duplicate groups show up as they're found — no waiting for the full scan.
  4. 🗑️
    4. Move or Delete
    Select files from any group and move, delete, or compare side-by-side.
🔒
100% Private. All fingerprinting runs inside your browser using OffscreenCanvas and Web Workers. Open DevTools → Network tab during any scan and you'll see zero outbound requests. Your files, filenames, and hashes never leave your device.

📊 Quick Pick — Which Algorithm Should I Use?

Not sure where to start? Here's the short version. Detailed explanations of every algorithm follow below.

Quick guide to choosing the right image duplicate detection algorithm
I want to find…Best algorithmWhy
Exact or near-exact copies, fastest possible scanaHashSimplest algorithm, fastest of all 7, excellent for exact copies and resized versions
Same photo in different formats (JPEG → PNG → WebP)pHash or wHashFrequency-domain hash is stable across format conversions and minor edits
Re-compressed or heavily JPEG-artifacted copiesBlockHashBlock averaging absorbs compression noise better than pixel-level methods
Brightness-adjusted or exposure-corrected versionsdHashEncodes brightness gradients (direction), not absolute values — unaffected by exposure shifts
Same scene or colour palette, social media re-uploadsColor SignatureOnly algorithm that compares actual colour (YUV) — not just luminance
Rotated, cropped, or perspective-warped copiesORBOnly algorithm that uses local keypoint features — handles geometric transformations
Large library, best speed/quality balancewHashWavelet transform gives pHash-quality results at faster speed

All 7 Algorithms — How They Work

Every algorithm follows the same pipeline: load → normalize → fingerprint → compare. What differs is the fingerprint step. Understanding that step helps you pick the right algorithm and interpret your results.

🎨
Color Sig

Color Sig Algorithm

The only algorithm that compares actual colour, not just brightness. It divides each image into a 24×24 regional grid and measures the YUV (luminance + chrominance) values in every cell. Two images match if their colour distribution across all regions is close enough at the current threshold. This means a bright-red photo will never match a bright-green one, even if their brightness patterns are identical — something all hash-based algorithms would get wrong.

Step 1
Resize to 288×288
Image drawn onto a fixed canvas so all inputs are comparable regardless of original resolution.
Step 2
Convert to YUV
Each pixel converted to Y (luma), U and V (chroma) — capturing both brightness and colour information.
Step 3
Divide into 24×24 grid
576 regional cells. Average YUV value computed for each cell.
Step 4
Compare total distance
Sum of YUV differences across all 576 cells. Below threshold = duplicate.
aHash

aHash Algorithm

The fastest algorithm in Sakarto. Shrinks the image to 16×16, converts to grayscale, and compares each of the 256 pixels against the overall mean brightness. Pixels brighter than average become 1, darker become 0 — producing a 256-bit binary fingerprint. Two files are compared by counting how many bits differ (Hamming distance). The whole process takes under a millisecond per image. Fast Mode makes JPEG scanning 5–10× faster by reading the embedded EXIF thumbnail instead of decoding the full image.

Step 1
Resize to 16×16
All images become a tiny 256-pixel grayscale sketch — resolution-independent.
Step 2
Compute mean
Average brightness across all 256 pixels.
Step 3
Threshold each pixel
1 if brighter than mean, 0 if darker → 256-bit hash.
Step 4
Hamming distance
Count differing bits between two hashes. ≤ threshold = duplicate.
🟦
BlockHash

BlockHash Algorithm

Instead of comparing individual pixels, BlockHash divides a 64×64 canvas into 16 equal-sized blocks (4×4 grid, each block is 16×16 pixels) and averages the brightness in each block. The average of all blocks becomes the threshold, and each block above average becomes 1 — producing a 16-bit hash. Block averaging is excellent at absorbing JPEG compression noise and encoding artifacts that would cause pixel-level algorithms to produce false negatives. A heavily re-compressed JPEG that looks nearly identical to the original will still produce matching block hashes.

Step 1
Resize to 64×64
Larger canvas than aHash preserves more block-level detail.
Step 2
Divide into 16 blocks
Each 16×16 block gets its brightness averaged — noise absorbed.
Step 3
Block median threshold
Blocks above median → 1, below → 0. Produces 16-bit hash.
Step 4
Hamming distance
Compare 16-bit hashes. Very fast — only 16 bits to compare.
📐
dHash

dHash Algorithm

dHash doesn't compare absolute brightness — it compares the direction of brightness change between adjacent pixels. The image is resized to 17×16 (one extra column), converted to grayscale, then each of the 256 pixel pairs is compared: is the left pixel brighter than the pixel to its right? This encodes horizontal brightness gradients. The key insight: two photos of the same scene taken at different exposures will have the same brightness gradient pattern even though their absolute values are very different. dHash is uniquely robust to exposure and brightness edits.

Step 1
Resize to 17×16
Extra column allows 256 left-right pixel comparisons.
Step 2
Convert to grayscale
Colour discarded — only brightness direction matters.
Step 3
Compare adjacent pairs
Left > right → 1, left ≤ right → 0. Encodes gradient directions.
Step 4
Hamming distance
256-bit comparison. Exposure shifts don't change the gradient pattern.
🔬
pHash

pHash Algorithm

pHash uses the same mathematical foundation as JPEG compression — the Discrete Cosine Transform (DCT). The image is resized to 32×32, converted to grayscale, and a separable 2D DCT is applied. The result is transformed to the frequency domain. The top-left 8×8 sub-region contains the low-frequency coefficients — the "big picture" structure of the image. These 64 values are compared against their mean to produce a 64-bit hash. Low-frequency encoding is highly stable: JPEG compression, format conversion, mild sharpening, slight colour grading, and minor editing all change high-frequency detail while barely touching the low-frequency structure.

Step 1
Resize to 32×32
Larger than other hashes — more input data for DCT accuracy.
Step 2
Separable 2D DCT
Rows then columns — same math as JPEG. Converts to frequency domain.
Step 3
Extract 8×8 LL band
Top-left 64 coefficients = low-frequency "essence" of the image.
Step 4
Mean threshold → 64-bit hash
Values above mean → 1. Hamming distance used for comparison.
🌊
wHash

wHash Algorithm

wHash uses the Haar Wavelet Transform instead of DCT. The image is resized to 16×16, then a Haar transform is applied row-wise and then column-wise. This decomposes the image into a multi-scale representation — a 2×2 block in the top-left represents the lowest frequencies (the "thumbnail"), while other blocks capture finer detail at different scales. The top-left 8×8 LL sub-band is extracted and thresholded against its mean to produce a 64-bit hash. Wavelet transforms are computationally cheaper than DCT, making wHash faster than pHash while producing very similar quality. It also handles local edits slightly better because the wavelet representation captures spatial structure at multiple scales.

Step 1
Resize to 16×16
Smaller than pHash — wavelet works well at this scale.
Step 2
Haar wavelet rows
Each row: averages (low freq) and differences (high freq).
Step 3
Haar wavelet columns
Apply to transformed rows — produces 4 sub-bands (LL, LH, HL, HH).
Step 4
LL sub-band → 64-bit hash
Top-left 8×8 thresholded against mean. Hamming distance comparison.
🎯
ORB

ORB Algorithm

ORB (Oriented FAST and Rotated BRIEF) uses OpenCV.js loaded as WebAssembly — a completely different approach from all other algorithms. Instead of producing one global hash, ORB finds up to 500 distinctive visual landmarks (keypoints) in each image — corners, blobs, and edges — and computes a compact 32-byte descriptor for each. Two images are compared by matching their keypoints spatially using Hamming distance + Lowe's ratio test, which filters out ambiguous matches. ORB is the only algorithm that handles rotation, cropping, and perspective distortion. The threshold for ORB is inverted: higher = stricter (more matching keypoints required). For videos, 3 frames are extracted and the frame with the most keypoints is used for comparison.

Step 1
Detect FAST keypoints
OpenCV finds up to 500 corners/blobs in each image at 320×320.
Step 2
Compute BRIEF descriptors
32-byte binary descriptor per keypoint, orientation-normalized.
Step 3
Match keypoints
Hamming distance + Lowe's ratio test filters ambiguous matches.
Step 4
Count good matches
≥ threshold good matches = duplicate. Higher threshold = stricter (inverted).
⚠️
ORB threshold direction is inverted. For all other algorithms, lower = stricter. For ORB, higher = stricter (more matching keypoints required). ORB requires OpenCV.js to load before scanning — expect a 2–5 second delay on first use.

Complete Guide — How to Use Any Image & Video Duplicate Finder

Every algorithm page (Color Signature, aHash, BlockHash, dHash, pHash, wHash, ORB) works identically. This guide applies to all of them. Follow these steps to find, review, and clean up duplicate files safely.

🔒 Privacy First — Your Files Never Leave Your Device

Zero network activity after page load. Open DevTools → Network tab during any scan: zero outbound requests. No uploads, no cloud processing, no external APIs.
Web Worker + OffscreenCanvas. Image hashing runs in a background thread — your browser tab stays responsive during large scans. Fingerprints are computed entirely on your CPU.
Session-only file access. Folder permission is scoped to the specific folder you chose and expires when you close the tab. Nothing persists between sessions.

📋 Step-by-Step: Scanning a Folder

Step 1

Choose the Right Algorithm & Open the Page

Use the Quick Pick table above to select the algorithm that fits your use case. Each algorithm has its own page — click "Find Duplicates" on the card above. If you're unsure, start with Color Signature (colour-rich photos) or aHash (large folders where speed matters).

Step 2

Configure Scan Options

Before selecting a folder, check the toolbar options:

  • Fast Mode (on by default) — reads the embedded EXIF thumbnail instead of the full image for JPEG files. 5–10× faster with near-identical accuracy. Turn off only if your JPEGs lack EXIF thumbnails.
  • Scan Images — include JPEGs, PNGs, GIFs, WebPs, BMPs in the scan.
  • Scan Videos — include MP4, WebM, MOV, MKV files. Videos take longer (3 frames are sampled per file).
  • Queue Mode (on by default) — stages files for review before any move or delete action. Highly recommended.
Step 3

Select a Folder to Scan

Click 📂 Select Folder to Scan to open a native folder picker (Chrome / Edge). Or drag and drop a folder directly onto the page. All image and video files inside are collected recursively, including all subfolders. Files over 40 MB are silently skipped.

ℹ️
Firefox and Safari users can select individual files using a fallback input, but cannot select a whole folder or use Move/Delete. Use Chrome or Edge for the full experience.
Step 4

Watch the Scan Run

A progress bar shows how many files have been processed. Duplicate groups appear live as they're found — you don't need to wait for the scan to finish before reviewing early results.

Image hashing runs in a background Web Worker — you can switch tabs freely and images keep scanning. Video scanning pauses when the tab is hidden and resumes automatically when you return. Click Stop Scan at any time — results found so far remain visible.

Step 5

Adjust the Similarity Threshold

After (or during) the scan, use the Similarity Threshold slider to tune how strict the matching is. Releasing the slider instantly re-clusters all results using the new value — no re-scan needed. For ORB, note that the threshold direction is reversed: higher = stricter.

Low values (0–5) — Very strictOnly near-identical files match. Use for exact copies, lossless vs lossy exports, same file at different bitrates. Very few false positives.
Medium values (6–20) — Balanced (default: 10)Catches resized copies, different formats, minor adjustments, JPEG artifacts. Good starting point for most libraries.
High values (21–50) — LooseGroups images with broadly similar visual structure. More false positives — always review before deleting.
Step 6

Review Duplicate Groups

Results are shown in numbered groups. Each group contains files the algorithm considers duplicates at the current threshold. Use these interactions:

  • Click a card to select it (blue border)
  • Ctrl+Click (Cmd on Mac) to add it to the compare list (purple border)
  • Click the 🔍 icon on hover to open a full-size preview with metadata
  • Hover a video card to auto-play the video clip
  • Right-click any card for a context menu (Copy / Move / Delete / Compare)
  • Click & drag on empty space to box-select multiple cards at once
  • Ctrl + drag to add to an existing selection without clearing it
Step 7

Compare Files Side-by-Side

Ctrl+Click two or more cards, then click ⚖️ Compare in the toolbar. A modal shows each file with its full metadata (dimensions, size, format, path) and a similarity percentage. For 3+ files, a full pairwise similarity matrix is shown. Each file in the modal has Copy Name, Move, and Delete buttons for quick actions.

Use Compare to decide which version to keep — check file size (larger is usually better quality), resolution, and format (lossless PNG or TIFF generally beats compressed JPEG).

Step 8

Move, Delete, or Copy Files

Select files and use the toolbar buttons. With Queue Mode on (recommended):

📋 Copy
Copy filename(s) to clipboard
📂 Move
Stage for move to a named subfolder
🗑️ Delete
Stage for permanent deletion
⚖️ Compare
View selected files side-by-side
Step 9

Queue Mode — Review Before You Commit

When Queue Mode is on, clicking Move or Delete stages files instead of acting immediately. Switch to the Move Queue or Delete Queue tab in the sidebar. Review staged files, remove any you change your mind about, then click Move All Files or Delete All Files to execute. The default Move destination is Sakarto-Duplicates, created inside the scanned directory — you can rename it before executing.

📊 What Each Algorithm Finds — and Doesn't

Which scenarios each of the 7 algorithms handles
ScenarioColor Sig.aHashBlockHashdHashpHashwHashORB
Exact byte-for-byte copies Best
Resized versions (different resolution)
Re-compressed / different format Best
Brightness / exposure adjusted Best
Colour-graded (hue/saturation changed)
Same colour palette / scene Best
Watermarked or lightly edited Best
Rotated or mirrored copies Best
Cropped or perspective-warped Best
Very large folder (speed priority) BestAvoid
Videos as well as images ⚠ Best-keypoint

💡 Tips for Best Results

💾
Back Up First
Always back up before deleting anything. Deleted files bypass the Recycle Bin and cannot be recovered through Sakarto.
Use Fast Mode for JPEG Libraries
Fast Mode reads EXIF thumbnails — 5–10× faster with near-identical accuracy. Only disable it if your JPEGs lack EXIF thumbnails.
🎚️
Start Strict, Then Loosen
Begin at the default threshold of 10. Review those results first. Only raise the slider if you want to catch more approximate matches.
⚖️
Compare Before Deleting
In the Compare modal, check file size and resolution. A larger file usually means better quality. Keep the highest-resolution or highest-bitrate version.
📂
Move, Don't Delete
Use Move to a "Sakarto-Duplicates" folder rather than deleting outright. Review moved files over a few days before permanently removing them.
🧪
Try Multiple Algorithms
If one algorithm produces too many false positives or misses obvious duplicates, try another. pHash and wHash are reliable all-rounders; ORB is the only option for rotated copies.

⚠️ Known Limitations

🔁
No undo for file deletion.
The File System Access API's remove() method bypasses the OS Recycle Bin entirely. Use Queue Mode — it exists for exactly this reason.
🎬
Video scanning pauses when you switch tabs.
Browsers throttle background video decoding. Image scanning (Web Worker) continues unaffected. Return to the tab to resume video scanning.
📱
Move and Delete require Chrome or Edge.
The File System Access API is only in Chrome 86+ and Edge 86+. Firefox and Safari can scan and display results but cannot move or delete files.
📊
Memory limit for very large folders.
All fingerprints are held in memory during the session. For 50,000+ files, consider scanning subfolders individually to avoid slowdowns on lower-RAM devices.
🎯
False positives are possible at loose thresholds.
No algorithm is perfect. Two different images can produce similar fingerprints — especially at threshold values above 20. Always use Compare to verify before deleting.

⌨️ Quick Reference — All Controls

All toolbar buttons and interaction controls
Button / ActionWhat it does
🔄 New SearchReload and start a fresh scan
📋 Copy (N)Copy selected filenames to clipboard. N = count selected.
📂 Move (N)Move selected files or stage them in the Move Queue
🗑️ Delete (N)Delete selected files or stage them in the Delete Queue
✕ Deselect AllRemove selection from all cards
⚖️ Compare (N)Open compare modal for Ctrl+clicked files. Needs 2+.
🔇 VideosToggle mute/unmute for all video cards on the page
Queue Mode checkboxStage files for review before executing. Recommended on.
Fast Mode checkboxUse EXIF thumbnail for JPEG. Much faster. On by default.
Scan Images / Videos checkboxesInclude or exclude each media type from the scan
Similarity Threshold sliderControls matching strictness. Re-clusters instantly on release. ORB: higher = stricter (inverted).
Click cardSelect / deselect the file (blue border)
Ctrl + Click cardAdd / remove from compare list (purple border)
Click & drag (empty area)Box-select multiple cards at once
Ctrl + dragAdd to existing selection without clearing it
Right-click cardContext menu: Copy / Move / Delete / Compare
🔍 hover icon on cardOpen full-size preview with metadata and action buttons
Hover video cardAuto-play the video clip
📥 Download ListExport all duplicate groups as a plain-text report

⭐ What Users Say

4.8
★★★★★
Based on 241 reviews
★★★★★

"pHash found hundreds of re-compressed Instagram screenshots I'd been hoarding for years. Five minutes to scan 12,000 photos."

★★★★★

"The ORB algorithm is mind-blowing — found rotated scans I had no idea were duplicates. Nothing else catches those."

★★★★★

"I love that it explains what each algorithm actually does. Finally understand why pHash is better than aHash for my edited photos."

★★★★☆

"Color Signature is brilliant for photo collections. It found near-identical colour-palette shots I never would have caught manually."


Frequently Asked Questions

Which algorithm should I start with?
For most photo collections: Color Signature if colour matters, pHash or wHash as reliable all-rounders. For large folders where speed is the priority: aHash. For re-compressed or heavily artifacted copies: BlockHash. For exposure-adjusted copies: dHash. For rotated, cropped, or perspective-warped copies: ORB (but expect it to be slower).
Why are two obviously different photos being grouped together?
Lower the similarity threshold slider. At high thresholds, images with broadly similar brightness or colour structure can match even if they're different photos. If false positives persist at lower thresholds, try a more discriminating algorithm — pHash or Color Signature tend to produce fewer false positives than aHash.
I know two files are duplicates but they're not grouped. Why?
First, raise the threshold slightly. If that doesn't help: check aspect ratios — files where one is portrait and the other landscape are excluded by the aspect-ratio pre-check regardless of threshold. Also check if one image has been heavily cropped or rotated — only ORB handles geometric transformations. For rotated copies, switch to the ORB algorithm.
Why does video scanning pause when I switch tabs?
Browsers throttle background video decoding to conserve battery and CPU. The scanner detects tab visibility changes and pauses video processing automatically. It resumes the moment you return. Image hashing runs in a Web Worker and is unaffected by tab switching — images keep scanning at full speed in the background.
Can I recover files after deleting them?
No. Files deleted through Sakarto are permanently removed via the File System Access API's remove() method, which bypasses the OS Recycle Bin entirely. Always use Queue Mode: stage files, review them, then execute only when certain.
What file types are supported?
Images: JPEG, PNG, GIF, WebP, BMP. Videos: MP4, WebM, MOV, MKV. Files over 40 MB are skipped. HEIC/HEIF, SVG, RAW, and TIFF are not currently supported due to browser decoder limitations.
Does this work on Firefox or Safari?
Partially. Scanning, fingerprinting, result display, and the Compare modal all work. However, Move and Delete require the File System Access API (Chrome 86+ / Edge 86+ only). In Firefox and Safari you can scan, review, and use "Download List" to export results, then handle files manually in your OS file manager.
What is the difference between ORB threshold and other algorithm thresholds?
For Color Signature and all hash algorithms (aHash, BlockHash, dHash, pHash, wHash), a lower threshold = stricter matching (fewer, more certain duplicates). For ORB, the logic is inverted: higher threshold = stricter because the number represents how many keypoints must match — requiring more matching keypoints means a stricter match.