중복된 이미지를 삭제해주는 프로그램

난 트위터를 하다가 재밌거나 한 짤(그림)이 보이면 쭉쭉 저장하곤 하는데 이게 쌓인 양이 늘어나다보니 찾기가 힘들어서 폴더별로 분리를 하기 시작했다.
폴더를 분리해도 각 폴더 안에 사진이 1000장 이상 들어가기 시작하면 그래도 찾기가 어려워지는데 그러다가 중복된 짤이 있는 것 같은 느낌이 들었다.

원래는 같은 파일명을 가진 사진이라면 덮어쓰기가 되어 중복해서 들어오지 않겠지만 누군가가 저장했던 사진을 다시 재업로드 하면 그 때는 파일명이 달라지니 어쩔 수가 없었다. 게다가 웬만한 서버에서는 그림파일을 올리면 exif 정보를 날리는 등의 변조를 하므로 파일의 해시값도 달라지게 된다. 그래서 sha1 해시 등을 이용해서 중복된 그림을 찾아 지우는 건 거의 불가능에 가까웠다.

언젠가 파이썬으로 비슷한 이미지를 찾는 글을 찾았는데 이걸 거의 그냥 그대로 이용해서 중복된 이미지를 찾아 지워주는 CLI 프로그램을 하나 작성했다. 비슷한 이미지가 있으면 동일한 것으로 간주하고 가장 해상도가 높은 한 장만 남긴채 나머지를 모두 지워버리게 했다.

원리는 아주 간단하다. 이미지를 흑백 이미지로 바꾼 후에(웬만한 영상처리는 흑백으로 바꾸는 것이 1단계다) 특정한 사이즈로 리사이즈를 한 후(보통 여기까지는 공통사항이다) 각 픽셀마다 오른쪽 픽셀보다 밝은지 아닌지를 Boolean 값으로 저장하면 배열이 나오게 되는데 2진법 수로 변환할 수 있으니 이걸 그냥 hash처럼 이용하면 된다. 좀 더 사이즈를 크게 할수록 미묘한 차이도 감지할 수 있겠지만 예제에 나온 8*8이 적당한 것 같아서 그냥 그대로 썼다.

별로 대단한 건 아니지만 github에 올려뒀고 pip를 통해 설치할 수 있다.

$ pip install imagecleaner;

kjwon15

I'm a hacker, I want to improve life.

7 thoughts to “중복된 이미지를 삭제해주는 프로그램”

  1. 실행해보니 상위 폴더(AppData\Local\kjwon15\imagecleaner\Cache)가 없던 터라 지정된 경로를 찾을 수 없다고 오류가 나네요.
    os.mkdir(caching_dir)
    이 부분을
    os.makedirs(caching_dir)
    로 수정하면 동작합니다.

  2. usage: imagecleaner.py [-h] [-S HASHSIZE] [-v] [-s] paths [paths …]
    imagecleaner.py: error: the following arguments are required: paths

    이러한 에러가나오는데 이건 어떤거 떄문에 그런건가요?

    1. “the following arguments are required: paths”
      뭐가 문제인지는 에러 메시지에 잘 나와 있네요.

    2. 안녕하세요 제가 python을 시작한지 얼마 안되서 kwjon15님의 소스코드를 가지고 실행이라도 해보려고 했는데 실행이 안되서 path라는게 패키지도 아니고 윈도우 변수설정에서 설정을 바꿔봐도 돌아가지가 않아서 어찌해야되는지를 몰라 여쭤봅니다. 혼자서 몇일동안 구글링을 해도 안되서 알려주실수 있을까요?

  3. setup.py에서 에러가 납니다.
    Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-aK1ynv/imagecleaner

    1. 버그 확인하고 수정 후 릴리즈 하였습니다.
      감사합니다!

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.