답변:
일반 해싱 또는 CRC 계산 알고리즘은 이미지 데이터에서 제대로 작동하지 않습니다. 정보의 차원 적 특성을 고려해야합니다.
아핀 변환 (크기 조정, 회전, 변환, 뒤집기)을 고려하는 매우 강력한 지문이 필요한 경우 이미지 소스 에서 라돈 변환을 사용 하여 이미지 데이터의 표준 매핑을 생성 할 수 있습니다. 이를 각 이미지와 함께 저장하고 그런 다음 지문 만 비교합니다. 이것은 복잡한 알고리즘이며 희미한 심장을위한 것이 아닙니다.
몇 가지 간단한 솔루션이 가능합니다.
광도 히스토그램 (특히 RGB 구성 요소로 분리 된 것)은 이미지에 대한 합리적인 지문이며 매우 효율적으로 구현할 수 있습니다. 하나의 히스토그램을 다른 히스토그램에서 빼면 두 이미지가 얼마나 유사한 지 결정하기 위해 처리 할 수있는 새로운 히스토그램이 생성됩니다. 히스토그램은 광도 / 색상 정보의 분포 및 발생을 평가하기 때문에 아핀 변환을 아주 잘 처리합니다. 각 색상 구성 요소의 광도 정보를 8 비트 값으로 양자화하면 거의 모든 합리적인 크기의 이미지 지문에 768 바이트의 저장 공간이 충분합니다. 광도 히스토그램은 이미지의 색상 정보를 조작 할 때 위음성을 생성합니다. 대비 / 밝기, 포스터 화, 색상 이동, 광도 정보 변경과 같은 변형을 적용하면.
크기 조정 된 이미지를 사용하는 것은 이미지의 정보 밀도를 비교하기 쉬운 수준으로 줄이는 또 다른 방법입니다. 원본 이미지 크기의 10 % 미만으로 축소하면 일반적으로 사용하기에 너무 많은 정보가 손실됩니다. 따라서 800x800 픽셀 이미지는 80x80으로 축소 될 수 있으며 여전히 적절한 지문을 수행하기에 충분한 정보를 제공 할 수 있습니다. 히스토그램 데이터와 달리 소스 해상도가 다양한 종횡비를 가질 때 이미지 데이터의 이방성 스케일링을 수행해야합니다. 즉, 300x800 이미지를 80x80 미리보기 이미지로 줄이면 이미지가 변형되어 300x500 이미지 (매우 비슷 함)와 비교할 때 거짓 음성이 발생합니다. 썸네일 지문은 아핀 변환이 관련 될 때 종종 위음성을 생성합니다. 이미지를 뒤집거나 회전하면
두 가지 기술을 결합하는 것은 베팅을 헤지하고 거짓 긍정과 거짓 부정의 발생을 줄이는 합리적인 방법입니다.
여기에 제안 된 축소 된 이미지 변형보다 훨씬 덜 임시적인 접근 방식이 있습니다. 여기서 제안 된 일반적인 특징은 유지하지만 진행 상황에 대해 훨씬 더 엄격한 수학적 기반을 제공합니다.
이미지 의 Haar 웨이블릿 을 가져옵니다 . 기본적으로 Haar 웨이블릿은 저해상도 이미지에서 각 고해상도 이미지까지의 차이가 연속되지만 밉맵의 '트리'에 얼마나 깊이 있는지에 따라 가중치가 부여됩니다. 계산은 간단합니다. 그런 다음 Haar 웨이블릿에 적절한 가중치가 부여되면 k 개의 가장 큰 계수 (절대 값 측면)를 제외한 모든 계수를 버리고 벡터를 정규화하고 저장합니다.
두 개의 정규화 된 벡터의 내적을 취하면 1이 거의 동일한 유사성의 척도를 제공합니다. 여기 에 더 많은 정보를 게시했습니다 .
당신은 확실히 phash를 봐야한다 .
이미지 비교를 위해 다음 PHP 프로젝트가 있습니다 : https://github.com/kennethrapp/phasher
그리고 내 작은 자바 스크립트 복제 : https://redaktor.me/phasher/demo_js/index.html
불행히도 이것은 "bitcount"기반이지만 회전 된 이미지를 인식합니다. 자바 스크립트의 또 다른 접근 방식은 캔버스를 사용하여 이미지에서 광도 히스토그램을 만드는 것입니다. 캔버스에서 다각형 히스토그램을 시각화하고 데이터베이스에서 해당 다각형을 비교할 수 있습니다 (예 : mySQL 공간 ...).
Compare()
먼저 이미지를 다운로드하는 대신 이미지 URI를 함수에 전달할 수 있기를 바랍니다 . 또한 내 테스트에서 "매우 유사한 이미지"의 임계 값은 98 %가 아닌 90 %를 초과해야합니다.
오래 전에 비슷한 특성을 가진 시스템에서 작업했는데 이것이 우리가 따랐던 알고리즘의 근사치입니다.
따라서 각 이미지에 대해 n + 1
정수 값을 저장 합니다. 여기서 n
추적하는 영역의 수입니다.
비교를 위해 각 색상 채널을 개별적으로 살펴 봐야합니다.
이렇게하면 일치하지 않는 이미지를 빠르게 삭제할 수 있습니다. 더 많은 영역을 사용하거나 알고리즘을 재귀 적으로 적용하여 더 강력한 일치 신뢰도를 얻을 수도 있습니다.
Ic의 답변과 유사-여러 해상도에서 이미지를 비교해 볼 수 있습니다. 따라서 각 이미지는 1x1, 2x2, 4x4 .. 800x800으로 저장됩니다. 최저 해상도가 일치하지 않는 경우 (임계 값에 따라) 즉시 거부 할 수 있습니다. 일치하는 경우 다음 더 높은 해상도에서 비교할 수 있습니다.
또한 이미지가 의료 이미지와 같은 유사한 구조를 공유하는 경우 비교하기 더 쉽고 / 빠른 설명으로 해당 구조를 추출 할 수 있습니다.
따라서 "이미지 일치"와는 매우 다른 "지문 일치"를 수행하려고합니다. 지문의 분석은 지난 20 년 동안 깊이 연구되어 왔으며 올바른 탐지율을 보장하기 위해 몇 가지 흥미로운 알고리즘이 개발되었습니다 ( FAR 및 FRR 측정 과 관련하여 -False Acceptance Rate 및 False Rejection Rate ).
나는 주로 세부 검사를 기반으로 구축 된 LFA (Local Feature Analysis) 검출 기술 클래스 를 더 잘 살펴볼 것을 제안합니다 . 세부 사항은 지문의 특정 특성이며 여러 등급으로 분류되었습니다. 래스터 이미지를 세부지도에 매핑하는 것은 실제로 대부분의 공공 기관이 범죄자 또는 테러리스트를 신고하기 위해 수행하는 작업입니다.
iPhone 이미지 비교 및 이미지 유사성 개발은 http://sites.google.com/site/imagecomparison/을 확인하세요.
실제로 확인하려면 iTunes AppStore에서 eyeBuy Visual Search를 확인하십시오.
2015 년 (미래로 돌아가 ...이 2009 년 Google에서 높은 순위를 차지한 질문에 대해) 이미지 유사성은 딥 러닝 기술을 사용하여 계산할 수 있습니다. 자동 인코더로 알려진 알고리즘 제품군은 유사성을 검색 할 수있는 벡터 표현을 만들 수 있습니다. 여기에 데모가 있습니다 .
이를 수행 할 수있는 한 가지 방법은 이미지 크기를 조정하고 해상도를 크게 낮추고 (아마도 200x200으로?) 비교를 위해 더 작은 (픽셀 평균) 버전을 저장하는 것입니다. 그런 다음 허용 오차 임계 값을 정의하고 각 픽셀을 비교합니다. 모든 픽셀의 RGB가 허용 오차 내에 있으면 일치하는 것입니다.
초기 실행은 O (n ^ 2)이지만 모든 일치 항목을 카탈로그 화하면 각각의 새 이미지는 비교할 O (n) 알고리즘 일뿐입니다 (이전에 삽입 된 각 이미지와 비교하기 만하면됩니다). 그러나 비교할 이미지 목록이 커지면 결국 무너질 것이지만 당분간은 안전하다고 생각합니다.
400 일을 실행하면 500,000 개의 이미지가 생성됩니다. 즉, 이미지 크기를 줄이는 데 걸리는 시간이 200(H)*200(W)*500,000(images)*3(RGB)
제외됨 = 60,000,000,000 회 비교됩니다. 모든 이미지가 정확히 일치하면 뒤처 질 것이지만 그렇지 않을 것입니다. 단일 비교가 임계 값을 벗어나는 즉시 이미지를 일치 항목으로 할인 할 수 있습니다.