{"id":39896581,"url":"https://github.com/knjcode/imgdupes","last_synced_at":"2026-01-18T15:08:19.908Z","repository":{"id":32467322,"uuid":"134734721","full_name":"knjcode/imgdupes","owner":"knjcode","description":"Identifying and removing near-duplicate images using perceptual hashing.","archived":false,"fork":false,"pushed_at":"2025-04-25T03:17:33.000Z","size":946,"stargazers_count":377,"open_issues_count":12,"forks_count":25,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-25T10:46:51.958Z","etag":null,"topics":["dedupe","deduplicate","image","perceptual-hashes","perceptual-hashing"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/knjcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-24T15:27:55.000Z","updated_at":"2025-09-10T14:37:01.000Z","dependencies_parsed_at":"2023-01-14T21:19:20.017Z","dependency_job_id":null,"html_url":"https://github.com/knjcode/imgdupes","commit_stats":null,"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/knjcode/imgdupes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knjcode%2Fimgdupes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knjcode%2Fimgdupes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knjcode%2Fimgdupes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knjcode%2Fimgdupes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/knjcode","download_url":"https://codeload.github.com/knjcode/imgdupes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knjcode%2Fimgdupes/sbom","scorecard":{"id":564584,"data":{"date":"2025-08-11","repo":{"name":"github.com/knjcode/imgdupes","commit":"ae571be5845014f995bd94eda3200f3e67e26136"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.2,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/19 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3.6.8-slim-stretch to python:3.6.8-slim-stretch@sha256:0d095570901e7cf0dac93ba4d0ee75ee2364715338b0396874589c9cc23343b6","Warn: pipCommand not pinned by hash: Dockerfile:13-24","Warn: pipCommand not pinned by hash: Dockerfile:13-24","Warn: pipCommand not pinned by hash: Dockerfile:27-30","Warn: pipCommand not pinned by hash: Dockerfile:45","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"46 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: GHSA-267x-w5hx-8hjr","Warn: Project is vulnerable to: GHSA-33h2-69j3-r336","Warn: Project is vulnerable to: GHSA-3448-vrgh-85xr","Warn: Project is vulnerable to: GHSA-5rpc-gwh9-q9fg","Warn: Project is vulnerable to: GHSA-634c-v2xv-ffpg","Warn: Project is vulnerable to: GHSA-6v6p-p97v-g2p7","Warn: Project is vulnerable to: GHSA-83rh-hx5x-q9p5","Warn: Project is vulnerable to: GHSA-8849-5h85-98qw","Warn: Project is vulnerable to: GHSA-89rj-5ggj-3p9p","Warn: Project is vulnerable to: GHSA-8w3x-457r-wg53","Warn: Project is vulnerable to: GHSA-9g8h-pjm4-q92p","Warn: Project is vulnerable to: GHSA-c7gp-2pch-qh2v","Warn: Project is vulnerable to: GHSA-cvhw-2593-5j2q","Warn: Project is vulnerable to: GHSA-fffj-9qwg-qmh5","Warn: Project is vulnerable to: GHSA-fm39-cw8h-3p63","Warn: Project is vulnerable to: GHSA-fr58-2xhv-qp3w","Warn: Project is vulnerable to: GHSA-fvq6-392h-6mjj","Warn: Project is vulnerable to: GHSA-fw99-f933-rgh8","Warn: Project is vulnerable to: GHSA-hxfw-jm98-v4mq","Warn: Project is vulnerable to: GHSA-jcxv-2j3h-mg59","Warn: Project is vulnerable to: GHSA-jggw-2q6g-c3m6","Warn: Project is vulnerable to: GHSA-m43c-649m-pm48","Warn: Project is vulnerable to: GHSA-m6vm-8g8v-xfjh","Warn: Project is vulnerable to: GHSA-pqjj-6f5q-gqph","Warn: Project is vulnerable to: GHSA-q799-q27x-vp7w","Warn: Project is vulnerable to: GHSA-qr4w-53vh-m672","Warn: Project is vulnerable to: GHSA-rqxg-xvcq-3v2f","Warn: Project is vulnerable to: GHSA-vc29-rj92-gc7j","Warn: Project is vulnerable to: GHSA-w96g-3p64-63wr","Warn: Project is vulnerable to: GHSA-wq8f-wvqp-xvvm","Warn: Project is vulnerable to: GHSA-x3rm-644h-67m8","Warn: Project is vulnerable to: PYSEC-2023-183","Warn: Project is vulnerable to: PYSEC-2019-156 / GHSA-xp76-357g-9wqq","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: PYSEC-2013-22 / GHSA-27x4-j476-jp5f","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T14:38:05.373Z","repository_id":32467322,"created_at":"2025-08-20T14:38:05.374Z","updated_at":"2025-08-20T14:38:05.374Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28539008,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dedupe","deduplicate","image","perceptual-hashes","perceptual-hashing"],"created_at":"2026-01-18T15:08:18.977Z","updated_at":"2026-01-18T15:08:19.892Z","avatar_url":"https://github.com/knjcode.png","language":"Python","readme":"# imgdupes\n\n`imgdupes` is a command line tool for checking and deleting near-duplicate images based on perceptual hash from the target directory.\n\n![video_capture](video_capture.gif)\nImages by [Caltech 101] dataset that semi-deduped for demonstration.\n\nIt is better to pre-deduplicate identical images with [`fdupes`] or [`jdupes`] in advance.  \nThen, you can check and delete near-duplicate images using `imgdupes` with an operation similar to the [`fdupes`] command.\n\n\n## For large dataset\n\nIt is possible to speed up dedupe process by approximate nearest neighbor search of hamming distance using [NGT] or [hnsw].\nSee [Against large dataset](#against-large-dataset) section for details.\n\n\n# Install\n\nTo install, simply use pip:\n\n```bash\n$ pip install imgdupes\n```\n\n\n# Usage\n\nThe following example is sample command to find sets of near-duplicate images with Hamming distance of phash less than 4 from the target directory.  \nTo search images recursively from the target directory, add `-r` or `--recursive` option.\n\n```bash\n$ imgdupes --recursive target_dir phash 4\ntarget_dir/airplane_0583.jpg\ntarget_dir/airplane_0800.jpg\n\ntarget_dir/watch_0122.jpg\ntarget_dir/watch_0121.jpg\n```\n\nBy default, imgdupes displays a list of duplicate images list and exits.  \nTo display preserve or delete images prompt, use the `-d` or `--delete` option.\n\nIf you are using iTerm 2, you can display a set of images on the terminal with the `-c` or `--imgcat` option.\n\n```bash\n$ imgdupes --recursive --delete --imgcat 101_ObjectCategories phash 4\n```\n\nThe set of images are sorted in ascending order of file size and displayed together with the pixel size of the image, you can choose which image to preserve.\n\nWith `-N` or `--noprompt` option, you can preserve the first file in each set of duplicates and delete the rest without prompting.\n\n```bash\n$ imgdupes -rdN 101_ObjectCategories phash 0\n```\n\n## To take input from a list of files\n\nUse `--files-from` or `-T` option to take input from a list of files.\n\n```bash\n$ imgdupes -T image_list.txt phash 0\n```\n\nFor example, create `image_list.txt` as below.\n```\n101_ObjectCategories/Faces/image_0345.jpg\n101_ObjectCategories/Motorbikes/image_0269.jpg\n101_ObjectCategories/Motorbikes/image_0735.jpg\n101_ObjectCategories/brain/image_0047.jpg\n101_ObjectCategories/headphone/image_0034.jpg\n101_ObjectCategories/dollar_bill/image_0038.jpg\n101_ObjectCategories/ferry/image_0020.jpg\n101_ObjectCategories/tick/image_0049.jpg\n101_ObjectCategories/Faces_easy/image_0283.jpg\n101_ObjectCategories/watch/image_0171.jpg\n```\n\n\n## Find near-duplicated images from an image you specified\n\nUse `--query` option to specify a query image file.\n\n```bash\n$ imgdupes --recursive target_dir --query target_dir/airplane_0583.jpg phash 4\nQuery: sample_airplane.png\n\ntarget_dir/airplane_0583.jpg\ntarget_dir/airplane_0800.jpg\n```\n\n\n# Against large dataset\n\n`imgdupes` supports approximate nearest neighbor search of hamming distance using [NGT] or [hnsw].\n\nTo dedupe images using NGT, run with `--ngt` option after installing NGT and python binding.\n\n```bash\n$ imgdupes -rdc --ngt 101_ObjectCategories phash 4\n```\n\n**Notice**: `--ngt` option is enabled by default from version 0.1.0.\n\n\nFor instructions on installing NGT and python binding, see [NGT] and [python NGT].\n\nTo dedupe images using hnsw, run with `--hnsw` option after installing hnsw python binding.\n\n```bash\n$ imgdupes -rdc --hnsw 101_ObjectCategories phash 4\n```\n\n\n# Fast exact searching\n\n`imgdupes` supports exact nearest neighbor search of hamming distance using [faiss] (IndexFlatL2).\n\nTo dedupe images using faiss, run with `--faiss-flat` option after installing faiss python binding.\n\n```bash\n$ imgdupes -rdc --faiss-flat 101_ObjectCategories phash 4\n```\n\n\n# Using imgdupes without installing it with docker\n\nYou can use `imgdupes` without installing it using a pre-build docker container image.  \n[NGT], [hnsw] and [faiss] are already installed in this image.\n\nPlace the target directory in the current directory and execute the following command.\n\n```bash\n$ docker run -it -v $PWD:/app knjcode/imgdupes -rdc target_dir phash 0\n```\n\nWhen docker run, current directory is mounted inside the container and referenced from imgdupes.\n\n\nBy aliasing the command, you can use `imgdupes` as installed.\n\n```bash\n$ alias imgdupes=\"docker run -it -v $PWD:/app knjcode/imgdupes\"\n$ imgdupes -rdc target_dir phash 0\n```\n\n\nTo upgrade imgdupes docker image, you can pull the docker image as below.\n\n```bash\n$ docker pull knjcode/imgdupes\n```\n\n\n# Available hash algorithm\n\n`imgdupes` uses the [ImageHash] to calculate perceptual hash (except for `phash_org` algorithm).\n\n- [ahash]: average hashing\n- [phash]: perception hashing (using only the 8x8 DCT low-frequency values including the first term)\n- [dhash]: difference hashing\n- [whash]: wavelet hashing\n\n- [phash_org]: perception hashing (fix algorithm from ImageHash implementation)  \n  \u003e using only the 8x8 DCT low-frequency values and excluding the first term since the DC coefficient can be significantly different from the other values and will throw off the average.\n\n# Options\n\n`-r` `--recursive`\n\nsearch images recursively from the target directory (default=False)\n\n`-d` `--delete`\n\nprompt user for files to preserve and delete (default=False)\n\n`-c` `--imgcat`\n\ndisplay duplicate images for iTerm2 (default=False)\n\n`-m` `--summarize`\n\nsummarize dupe information\n\n`-N` `--noprompt`\n\ntogether with `--delete`, preserve the first file in each set of duplicates and delete the rest without prompting the user\n\n `--query \u003cimage filename\u003e`\n\n find image files that are duplicated or similar to the specified image file from the target directory\n\n`--hash-bits 64`\n\nbits of perceptual hash (default=64)\n\nThe number of bits specifies the value that is the square of n.  \nFor example, you can specify 64(8^2), 144(12^2), 256(16^2), etc.\n\n`--sort \u003csort_type\u003e`\n\nhow to sort duplicate image files (default=filesize)\n\nYou can specify following types:\n\n- `filesize`: sort by filesize in descending order\n- `filepath`: sort by filepath in ascending order\n- `imagesize`: sort by pixel width and height in descenging order\n- `width`: sort by pixel width in descending order\n- `height`: sort by pixel height in descending order\n- `none`: do not sort\n\n`--reverse`\n\nreverse sort order\n\n`--num-proc 4`\n\nnumber of hash calculation and ngt processes (default=cpu_count-1)\n\n`--log`\n\noutput logs of duplicate and delete files (default=False)\n\n`--no-cache`\n\nnot create or use image hash cache (default=False)\n\n`--no-subdir-warning`\n\nstop warnings that appear when similar images are in different subdirectories\n\n`--sameline`\n\nlist each set of matches on a single line\n\n`--dry-run`\n\ndry run (do not delete any files)\n\n`--faiss-flat`\n\nuse faiss exact search (IndexFlatL2) for calculating Hamming distance between hash of images (default=False)\n\n`--faiss-flat-k 20`\n\n number of searched objects when using faiss-flat (default=20)\n\n\n## use with imgcat (`-c`, `--imgcat`) options\n\n`--size 256x256`\n\nresize image (default=256x256)\n\n`--space 0`\n\nspace between images (default=0)\n\n`--space-color black`\n\nspace color between images (default=black)\n\n`--tile-num 4`\n\nhorizontal tile number (default=4)\n\n`--interpolation INTER_LINEAR`\n\ninterpolation methods (default=INTER_LINEAR)\n\nYou can specify OpenCV interpolation methods: INTER_NEAREST, INTER_LINEAR, INTER_AREA, INTER_CUBIC, INTER_LANCZOS4, etc.\n\n`--no-keep-aspect`\n\ndo not keep aspect when displaying images\n\n\n## ngt options\n\n`--ngt`\n\nuse NGT for calculating Hamming distance between hash of images (default=True)\n\n`--ngt-k 20`\n\nnumber of searched objects when using NGT.\nIncreasing this value, improves accuracy and increases computation time. (default=20)\n\n`--ngt-epsilon 0.1`\n\nsearch range when using NGT.\nIncreasing this value, improves accuracy and increases computation time. (default=0.1)\n\n`--ngt-edges 10`\n\nnumber of initial edges of each node at graph generation time. (default=10)\n\n`--ngt-edges-for-search 40`\n\nnumber of edges at search time. (default=40)\n\n## hnsw options\n\n`--hnsw`\n\nuse hnsw for calculating Hamming distance between hash of images (default=False)\n\n`--hnsw-k 20`\n\nnumber of searched objects when using hnsw.\nIncreasing this value, improves accuracy and increases computation time. (default=20)\n\n`--hnsw-ef-construction 100`\n\ncontrols index search speed/build speed tradeoff (default=100)\n\n`--hnsw-m 16`\n\nm is tightly connected with internal dimensionality of the data stronlgy affects the memory consumption (default=16)\n\n`--hnsw-ef 50`\n\ncontrols recall. higher ef leads to better accuracy, but slower search (default=50)\n\n## faiss options\n\n`--faiss-cuda`\n\nuses CUDA enabled device for faster searching (requires faiss-gpu, Nvidia GPU, and CUDA toolkit) \u003cbr/\u003e\nInstall: https://github.com/facebookresearch/faiss/blob/master/INSTALL.md \u003cbr/\u003e\nGeneral: https://github.com/facebookresearch/faiss/wiki/Faiss-on-the-GPU\n\n## CUDA options\n\n`--cuda-device`\n\nuses the specific CUDA device passed for CUDA accelerated searches (default=device with lowest load) \u003cbr/\u003e\nNOTE: if the device passed is not found on the system the CUDA device with the lowest load will be used\n\n\n# License\n\nMIT\n\n[`fdupes`]: (https://github.com/adrianlopezroche/fdupes)\n[`jdupes`]: (https://github.com/jbruchon/jdupes)\n[Caltech 101]: http://www.vision.caltech.edu/Image_Datasets/Caltech101/\n[ImageHash]: https://github.com/JohannesBuchner/imagehash\n[ahash]: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html\n[phash]: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html\n[dhash]: http://www.hackerfactor.com/blog/index.php?/archives/529-Kind-of-Like-That.html\n[whash]: https://fullstackml.com/2016/07/02/wavelet-image-hash-in-python/\n[phash_org]: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html\n[NGT]: https://github.com/yahoojapan/NGT\n[python NGT]: https://github.com/yahoojapan/NGT/tree/master/python\n[hnsw]: https://github.com/nmslib/hnsw\n[faiss]: https://github.com/facebookresearch/faiss\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknjcode%2Fimgdupes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fknjcode%2Fimgdupes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknjcode%2Fimgdupes/lists"}