여러 이미지의 유사성을 비교하기위한 이미지 지문


94

모든 이미지를 다른 모든 이미지와 매우 빠르게 비교하려면 많은 이미지의 지문 (기존 이미지 약 100.000 개, 매일 새 이미지 1000 개, RGB, JPEG, 최대 크기 800x800)을 만들어야합니다. 거의 비슷한 이미지도 인식해야하므로 바이너리 비교 방법을 사용할 수 없습니다.

가장 좋은 것은 기존 라이브러리이지만 기존 알고리즘에 대한 몇 가지 힌트도 많은 도움이 될 것입니다.


1
도서관의 언어는?
Ben S

답변:


57

일반 해싱 또는 CRC 계산 알고리즘은 이미지 데이터에서 제대로 작동하지 않습니다. 정보의 차원 적 특성을 고려해야합니다.

아핀 변환 (크기 조정, 회전, 변환, 뒤집기)을 고려하는 매우 강력한 지문이 필요한 경우 이미지 소스 에서 라돈 변환을 사용 하여 이미지 데이터의 표준 매핑을 생성 할 수 있습니다. 이를 각 이미지와 함께 저장하고 그런 다음 지문 만 비교합니다. 이것은 복잡한 알고리즘이며 희미한 심장을위한 것이 아닙니다.

몇 가지 간단한 솔루션이 가능합니다.

  1. 이미지에 대한 광도 히스토그램을 지문으로 생성
  2. 각 이미지의 축소 된 버전을 지문으로 생성
  3. 비교 품질 향상을 위해 기술 (1) 및 (2)를 하이브리드 접근 방식으로 결합

광도 히스토그램 (특히 RGB 구성 요소로 분리 된 것)은 이미지에 대한 합리적인 지문이며 매우 효율적으로 구현할 수 있습니다. 하나의 히스토그램을 다른 히스토그램에서 빼면 두 이미지가 얼마나 유사한 지 결정하기 위해 처리 할 수있는 새로운 히스토그램이 생성됩니다. 히스토그램은 광도 / 색상 정보의 분포 및 발생을 평가하기 때문에 아핀 변환을 아주 잘 처리합니다. 각 색상 구성 요소의 광도 정보를 8 비트 값으로 양자화하면 거의 모든 합리적인 크기의 이미지 지문에 768 바이트의 저장 공간이 충분합니다. 광도 히스토그램은 이미지의 색상 정보를 조작 할 때 위음성을 생성합니다. 대비 / 밝기, 포스터 화, 색상 이동, 광도 정보 변경과 같은 변형을 적용하면.

크기 조정 된 이미지를 사용하는 것은 이미지의 정보 밀도를 비교하기 쉬운 수준으로 줄이는 또 다른 방법입니다. 원본 이미지 크기의 10 % 미만으로 축소하면 일반적으로 사용하기에 너무 많은 정보가 손실됩니다. 따라서 800x800 픽셀 이미지는 80x80으로 축소 될 수 있으며 여전히 적절한 지문을 수행하기에 충분한 정보를 제공 할 수 있습니다. 히스토그램 데이터와 달리 소스 해상도가 다양한 종횡비를 가질 때 이미지 데이터의 이방성 스케일링을 수행해야합니다. 즉, 300x800 이미지를 80x80 미리보기 이미지로 줄이면 이미지가 변형되어 300x500 이미지 (매우 비슷 함)와 비교할 때 거짓 음성이 발생합니다. 썸네일 지문은 아핀 변환이 관련 될 때 종종 위음성을 생성합니다. 이미지를 뒤집거나 회전하면

두 가지 기술을 결합하는 것은 베팅을 헤지하고 거짓 긍정과 거짓 부정의 발생을 줄이는 합리적인 방법입니다.


CRC에 대해서는 동의했습니다. 그러나 그것을 사용하고 싶다면 CRC32보다 MD5 해시를 사용하는 것이 좋습니다
mloskot

5
MD5는 단방향 암호화 해시이기 때문에 사용하고 싶지 않을 것입니다. 해시 간의 차이를 직접 비교할 수 있도록 유사한 입력에 대해 유사한 결과를 생성하는 해시 방법을 사용해야합니다.
AJ Quick

34

여기에 제안 된 축소 된 이미지 변형보다 훨씬 덜 임시적인 접근 방식이 있습니다. 여기서 제안 된 일반적인 특징은 유지하지만 진행 상황에 대해 훨씬 더 엄격한 수학적 기반을 제공합니다.

이미지 의 Haar 웨이블릿 을 가져옵니다 . 기본적으로 Haar 웨이블릿은 저해상도 이미지에서 각 고해상도 이미지까지의 차이가 연속되지만 밉맵의 '트리'에 얼마나 깊이 있는지에 따라 가중치가 부여됩니다. 계산은 간단합니다. 그런 다음 Haar 웨이블릿에 적절한 가중치가 부여되면 k 개의 가장 큰 계수 (절대 값 측면)를 제외한 모든 계수를 버리고 벡터를 정규화하고 저장합니다.

두 개의 정규화 된 벡터의 내적을 취하면 1이 거의 동일한 유사성의 척도를 제공합니다. 여기 에 더 많은 정보를 게시했습니다 .


20

당신은 확실히 phash를 봐야한다 .

이미지 비교를 위해 다음 PHP 프로젝트가 있습니다 : https://github.com/kennethrapp/phasher

그리고 내 작은 자바 스크립트 복제 : https://redaktor.me/phasher/demo_js/index.html

불행히도 이것은 "bitcount"기반이지만 회전 된 이미지를 인식합니다. 자바 스크립트의 또 다른 접근 방식은 캔버스를 사용하여 이미지에서 광도 히스토그램을 만드는 것입니다. 캔버스에서 다각형 히스토그램을 시각화하고 데이터베이스에서 해당 다각형을 비교할 수 있습니다 (예 : mySQL 공간 ...).


npm에 있습니까? 나는 자바 스크립트를 사용하여 두 이미지 사이의 유사성을 비교하는 방법을 찾고 있어요
chovy

흠, 나는 그것이 "npm을 위해 싸게"라고 생각했다. 정말 처음부터 빠르게 작성된 데모였습니다. 그러나 소스로 원하는 것은 무엇이든 자유롭게하십시오. 내가 할 수 있다면 나중에 살펴보고 github github.com/redaktor로 푸시 하겠습니다 ...
sebilasse

@SebastianLasse 방금 JS 포트를 확인했는데 환상적입니다! Compare()먼저 이미지를 다운로드하는 대신 이미지 URI를 함수에 전달할 수 있기를 바랍니다 . 또한 내 테스트에서 "매우 유사한 이미지"의 임계 값은 98 %가 아닌 90 %를 초과해야합니다.
thdoan jul.

12

오래 전에 비슷한 특성을 가진 시스템에서 작업했는데 이것이 우리가 따랐던 알고리즘의 근사치입니다.

  1. 그림을 영역으로 나눕니다. 우리의 경우 4 : 3 해상도 비디오를 다루고 있었으므로 12 개의 영역을 사용했습니다. 이렇게하면 사진에서 소스 이미지의 해상도가 제거됩니다.
  2. 각 영역에 대해 전체 색상 (영역에있는 모든 픽셀의 평균)을 계산합니다.
  3. 전체 이미지에 대해 전체 색상 계산-모든 영역의 평균

따라서 각 이미지에 대해 n + 1정수 값을 저장 합니다. 여기서 n추적하는 영역의 수입니다.

비교를 위해 각 색상 채널을 개별적으로 살펴 봐야합니다.

  1. 전체 이미지의 경우 전체 색상의 색상 채널을 비교하여 특정 임계 값 (예 : 10 %) 내에 있는지 확인합니다.
  2. 이미지가 임계 값 내에 있으면 다음으로 각 영역을 비교합니다. 모든 영역이 임계 값 내에있는 경우 이미지는 적어도 추가 비교를 위해 플래그를 지정할 수있을만큼 충분히 강한 일치입니다.

이렇게하면 일치하지 않는 이미지를 빠르게 삭제할 수 있습니다. 더 많은 영역을 사용하거나 알고리즘을 재귀 적으로 적용하여 더 강력한 일치 신뢰도를 얻을 수도 있습니다.


6

Ic의 답변과 유사-여러 해상도에서 이미지를 비교해 볼 수 있습니다. 따라서 각 이미지는 1x1, 2x2, 4x4 .. 800x800으로 저장됩니다. 최저 해상도가 일치하지 않는 경우 (임계 값에 따라) 즉시 거부 할 수 있습니다. 일치하는 경우 다음 더 높은 해상도에서 비교할 수 있습니다.

또한 이미지가 의료 이미지와 같은 유사한 구조를 공유하는 경우 비교하기 더 쉽고 / 빠른 설명으로 해당 구조를 추출 할 수 있습니다.


이것은 내가 생각하는 일종의 나무 검색에 매핑됩니다. 흥미 롭군.
André Laszlo

3

따라서 "이미지 일치"와는 매우 다른 "지문 일치"를 수행하려고합니다. 지문의 분석은 지난 20 년 동안 깊이 연구되어 왔으며 올바른 탐지율을 보장하기 위해 몇 가지 흥미로운 알고리즘이 개발되었습니다 ( FARFRR 측정 과 관련하여 -False Acceptance RateFalse Rejection Rate ).

나는 주로 세부 검사를 기반으로 구축 된 LFA (Local Feature Analysis) 검출 기술 클래스 를 더 잘 살펴볼 것을 제안합니다 . 세부 사항은 지문의 특정 특성이며 여러 등급으로 분류되었습니다. 래스터 이미지를 세부지도에 매핑하는 것은 실제로 대부분의 공공 기관이 범죄자 또는 테러리스트를 신고하기 위해 수행하는 작업입니다.

추가 참조는 여기 를 참조 하십시오.


주어진 생체 인식 시스템에 대한 가우스 점수 분포가있는 경우 거짓 합격률을 계산하는 방법을 알고 있습니까?
GobiasKoffi 2010 년

OP는 "많은 이미지의 지문 생성"을 원합니다. 인간의 지문 이미지를 비교하지 마십시오.
Navin 19


3

2015 년 (미래로 돌아가 ...이 2009 년 Google에서 높은 순위를 차지한 질문에 대해) 이미지 유사성은 딥 러닝 기술을 사용하여 계산할 수 있습니다. 자동 인코더로 알려진 알고리즘 제품군은 유사성을 검색 할 수있는 벡터 표현을 만들 수 있습니다. 여기에 데모가 있습니다 .


바이너리 데이터에서 지문 이미지를 생성 할 수 있습니까?
SwR

물론,이 작업에 대한 ANN이 있지만 귀하의 답변은 실제로 아무것도 대답하지 않는 것 같습니다. 질문은 : 어떻게 이루어 집니까? 링크 된 페이지는 어떠한 정보도 공개하지 않으며 "자동 인코더"라는 용어도 도움이되지 않습니다.
Simon Steinberger

원래 질문은 "어떻게 되었습니까?"라고 말하지 않지만 "기존 알고리즘에 대한 몇 가지 힌트가 나에게 많은 도움이 될 것입니다"라고 말하고 있습니다.
Alex R

알고리즘에 "힌트"를 연결하지 않았습니다. 실제로 링크 된 페이지에 "작동하지만 이유는 아무도 모릅니다. 결과에 대해 너무 많이 기대하지 마십시오."라고되어 있습니다.
odyth

deeplearning4j.org/deepautoencoder#use-cases 는 Auto Encoder를 사용하여 지문을 만드는 방법과 그 지문을 사용하여 정점이 얼마나 유사한 지에 따라 다른 이미지에서 유사점을 찾는 방법에 대해 더 명확하게 제공합니다.
odyth

2

이를 수행 할 수있는 한 가지 방법은 이미지 크기를 조정하고 해상도를 크게 낮추고 (아마도 200x200으로?) 비교를 위해 더 작은 (픽셀 평균) 버전을 저장하는 것입니다. 그런 다음 허용 오차 임계 값을 정의하고 각 픽셀을 비교합니다. 모든 픽셀의 RGB가 허용 오차 내에 있으면 일치하는 것입니다.

초기 실행은 O (n ^ 2)이지만 모든 일치 항목을 카탈로그 화하면 각각의 새 이미지는 비교할 O (n) 알고리즘 일뿐입니다 (이전에 삽입 된 각 이미지와 비교하기 만하면됩니다). 그러나 비교할 이미지 목록이 커지면 결국 무너질 것이지만 당분간은 안전하다고 생각합니다.

400 일을 실행하면 500,000 개의 이미지가 생성됩니다. 즉, 이미지 크기를 줄이는 데 걸리는 시간이 200(H)*200(W)*500,000(images)*3(RGB)제외됨 = 60,000,000,000 회 비교됩니다. 모든 이미지가 정확히 일치하면 뒤처 질 것이지만 그렇지 않을 것입니다. 단일 비교가 임계 값을 벗어나는 즉시 이미지를 일치 항목으로 할인 할 수 있습니다.


2

말 그대로 모든 이미지를 다른 이미지와 비교하고 싶습니까? 응용 프로그램은 무엇입니까? 특정 설명자를 기반으로 한 이미지의 색인 및 검색이 필요할 수 있습니까? 예를 들어 멀티미디어 콘텐츠 설명 인터페이스에 대한 MPEG-7 표준을 볼 수 있습니다. 그런 다음 다른 이미지 설명자를 비교할 수 있는데, 이는 정확하지는 않지만 훨씬 빠릅니다.


어쩌면 사이에서 선택 철저한 및 제한
조니

0

전문적인 이미지 해싱 알고리즘이 활발한 연구 분야 인 것 같지만 아마도 이미지 바이트의 정상적인 해시 계산이 트릭을 수행 할 것입니다.

동일한 소스에서 파생되었지만 다른 형식이나 해상도 일 수있는 이미지를 찾는 대신 바이트와 동일한 이미지를 찾고 있습니까 (이는 다소 어려운 문제라고 생각합니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.