여러 이미지의 유사성을 비교하기위한 이미지 지문
모든 이미지를 다른 모든 이미지와 매우 빠르게 비교하려면 많은 이미지의 지문 (기존 이미지 약 100.000 개, 매일 새 이미지 1000 개, RGB, JPEG, 최대 크기 800x800)을 만들어야합니다. 거의 비슷한 이미지도 인식해야하므로 바이너리 비교 방법을 사용할 수 없습니다.
가장 좋은 것은 기존 라이브러리이지만 기존 알고리즘에 대한 몇 가지 힌트도 많은 도움이 될 것입니다.
일반 해싱 또는 CRC 계산 알고리즘은 이미지 데이터에서 제대로 작동하지 않습니다. 정보의 차원 적 특성을 고려해야합니다.
아핀 변환 (크기 조정, 회전, 변환, 뒤집기)을 고려하는 매우 강력한 핑거 프린팅이 필요한 경우 이미지 소스 에서 라돈 변환을 사용 하여 이미지 데이터의 표준 매핑을 생성 할 수 있습니다. 이를 각 이미지와 함께 저장하고 그런 다음 지문 만 비교합니다. 이것은 복잡한 알고리즘이며 희미한 심장을위한 것이 아닙니다.
몇 가지 간단한 솔루션이 가능합니다.
- 이미지에 대한 광도 히스토그램을 지문으로 생성
- 각 이미지의 축소 된 버전을 지문으로 생성
- 비교 품질 향상을 위해 기술 (1) 및 (2)를 하이브리드 접근 방식으로 결합
광도 히스토그램 (특히 RGB 구성 요소로 분리 된 것)은 이미지에 대한 합리적인 지문이며 매우 효율적으로 구현할 수 있습니다. 하나의 히스토그램을 다른 히스토그램에서 빼면 두 이미지가 얼마나 유사한 지 결정하기 위해 처리 할 수있는 새로운 히스토그램이 생성됩니다. 히스토그램은 광도 / 색상 정보의 분포 및 발생을 평가하기 때문에 아핀 변환을 아주 잘 처리합니다. 각 색상 구성 요소의 광도 정보를 8 비트 값으로 양자화하면 거의 모든 합리적인 크기의 이미지 지문에 768 바이트의 저장 공간이 충분합니다. 광도 히스토그램은 이미지의 색상 정보를 조작 할 때 위음성을 생성합니다. 대비 / 밝기, 포스터 화, 색상 이동, 광도 정보 변경과 같은 변형을 적용하면.
크기 조정 된 이미지를 사용하는 것은 이미지의 정보 밀도를 비교하기 쉬운 수준으로 줄이는 또 다른 방법입니다. 원본 이미지 크기의 10 % 미만으로 축소하면 일반적으로 사용하기에 너무 많은 정보가 손실됩니다. 따라서 800x800 픽셀 이미지는 80x80으로 축소 될 수 있으며 적절한 지문을 수행하기에 충분한 정보를 제공 할 수 있습니다. 히스토그램 데이터와 달리 소스 해상도가 다양한 종횡비를 가질 때 이미지 데이터의 이방성 스케일링을 수행해야합니다. 즉, 300x800 이미지를 80x80 미리보기 이미지로 줄이면 이미지가 변형되어 300x500 이미지 (매우 유사 함)와 비교할 때 거짓 음성이 발생합니다. 썸네일 지문은 아핀 변환이 관련 될 때 종종 위음성을 생성합니다. 이미지를 뒤집거나 회전하면
두 가지 기술을 결합하는 것은 베팅을 헤지하고 거짓 긍정과 거짓 부정의 발생을 줄이는 합리적인 방법입니다.
여기에 제안 된 축소 된 이미지 변형보다 훨씬 덜 임시적인 접근 방식이 있습니다. 여기서 제안 된 일반적인 특징은 유지하지만 진행 상황에 대해 훨씬 더 엄격한 수학적 기반을 제공합니다.
이미지 의 Haar 웨이블릿 을 가져옵니다 . 기본적으로 Haar 웨이블릿은 저해상도 이미지에서 각 고해상도 이미지로의 차이가 연속되지만 밉맵의 '트리'에 얼마나 깊이 있는지에 따라 가중치가 부여됩니다. 계산은 간단합니다. 그런 다음 Haar 웨이블릿에 적절한 가중치가 부여되면 k 개의 가장 큰 계수 (절대 값 측면)를 제외한 모든 계수를 버리고 벡터를 정규화하고 저장합니다.
두 개의 정규화 된 벡터의 내적을 취하면 1이 거의 동일한 유사성의 척도를 제공합니다. 여기 에 더 많은 정보를 게시했습니다 .
당신은 확실히 phash를 봐야한다 .
이미지 비교를 위해 다음 PHP 프로젝트가 있습니다 : https://github.com/kennethrapp/phasher
그리고 내 작은 자바 스크립트 클론 : https://redaktorcms.com/dev/phasher/demo_js/index.html
불행히도 이것은 "bitcount"기반이지만 회전 된 이미지를 인식합니다. 자바 스크립트의 또 다른 접근 방식은 캔버스를 사용하여 이미지에서 광도 히스토그램을 만드는 것입니다. 캔버스에서 다각형 히스토그램을 시각화하고 데이터베이스에서 해당 다각형을 비교할 수 있습니다 (예 : mySQL 공간 ...).
다음은 비디오 히스토그램 데모입니다 : https://redaktorcms.com/dev/globetrottr/testHashVideo.php
오래 전에 비슷한 특성을 가진 시스템에서 작업했는데 이것이 우리가 따랐던 알고리즘의 근사치입니다.
- 그림을 영역으로 나눕니다. 우리의 경우 4 : 3 해상도 비디오를 다루고 있었으므로 12 개의 영역을 사용했습니다. 이렇게하면 사진에서 소스 이미지의 해상도가 제거됩니다.
- 각 영역에 대해 전체 색상 (영역에있는 모든 픽셀의 평균)을 계산합니다.
- 전체 이미지에 대해 전체 색상 계산-모든 영역의 평균
따라서 각 이미지에 대해 n + 1
정수 값을 저장 합니다. 여기서 n
추적하는 영역의 수입니다.
비교를 위해 각 색상 채널을 개별적으로 살펴 봐야합니다.
- 전체 이미지의 경우 전체 색상의 색상 채널을 비교하여 특정 임계 값 (예 : 10 %) 내에 있는지 확인합니다.
- 이미지가 임계 값 내에 있으면 다음으로 각 영역을 비교합니다. 모든 영역이 임계 값 내에있는 경우 이미지는 적어도 추가 비교를 위해 플래그를 지정할 수있을만큼 충분히 강한 일치입니다.
이렇게하면 일치하지 않는 이미지를 빠르게 삭제할 수 있습니다. 더 많은 영역을 사용하거나 알고리즘을 재귀 적으로 적용하여 더 강력한 일치 신뢰도를 얻을 수도 있습니다.
Ic의 답변과 유사-여러 해상도에서 이미지를 비교해 볼 수 있습니다. 따라서 각 이미지는 1x1, 2x2, 4x4 .. 800x800으로 저장됩니다. 최저 해상도가 일치하지 않는 경우 (임계 값에 따라) 즉시 거부 할 수 있습니다. 일치하는 경우 다음 더 높은 해상도에서 비교할 수 있습니다.
Also - if the images share any similar structure, such as medical images, you might be able to extract that structure into a description that is easier/faster to compare.
So you want to do "fingerprint matching" that's pretty different than "image matching". Fingerprints' analysis has been deeply studied during the past 20 years, and several interesting algorithms have been developed to ensure the right detection rate (with respect to FAR and FRR measures - False Acceptance Rate and False Rejection Rate).
I suggest you to better look to LFA (Local Feature Analysis) class of detection techniques, mostly built on minutiae inspection. Minutiae are specific characteristics of any fingerprint, and have been classified in several classes. Mapping a raster image to a minutiae map is what actually most of Public Authorities do to file criminals or terrorists.
See here for further references
For iPhone image comparison and image similarity development check out: http://sites.google.com/site/imagecomparison/
To see it in action, check out eyeBuy Visual Search on the iTunes AppStore.
One way you can do this is to resize the image and drop the resolution significantly (to 200x200 maybe?), storing a smaller (pixel-averaged) version for doing the comparison. Then define a tolerance threshold and compare each pixel. If the RGB of all pixels are within the tolerance, you've got a match.
Your initial run through is O(n^2) but if you catalog all matches, each new image is just an O(n) algorithm to compare (you only have to compare it to each previously inserted image). It will eventually break down however as the list of images to compare becomes larger, but I think you're safe for a while.
After 400 days of running, you'll have 500,000 images, which means (discounting the time to resize the image down) 200(H)*200(W)*500,000(images)*3(RGB)
= 60,000,000,000 comparisons. If every image is an exact match, you're going to be falling behind, but that's probably not going to be the case, right? Remember, you can discount an image as a match as soon as a single comparison falls outside your threshold.
Do you literally want to compare every image against the others? What is the application? Maybe you just need some kind of indexing and retrieval of images based on certain descriptors? Then for example you can look at MPEG-7 standard for Multimedia Content Description Interface. Then you could compare the different image descriptors, which will be not that accurate but much faster.
As of 2015 (back to the future... on this 2009 question which is now high-ranked in Google) image similarity can be computed using Deep Learning techniques. The family of algorithms known as Auto Encoders can create a vector representation which is searchable for similarity. There is a demo here.
It seems that specialised image hashing algorithms are an area of active research but perhaps a normal hash calculation of the image bytes would do the trick.
Are you seeking byte-identical images rather than looking for images that are derived from the same source but may be a different format or resolution (which strikes me as a rather hard problem).
참고URL : https://stackoverflow.com/questions/596262/image-fingerprint-to-compare-similarity-of-many-images
'IT story' 카테고리의 다른 글
점이없는 파일 (확장자가없는 모든 파일)을 gitignore 파일에 어떻게 추가합니까? (0) | 2020.09.03 |
---|---|
사용자가 SSH 터널을 설정하도록 허용하지만 다른 것은 설정하지 않습니다. (0) | 2020.09.03 |
클래스 경로에서 Java 패키지의 모든 클래스를 어떻게 읽습니까? (0) | 2020.09.03 |
git은 xcodeproject / project.pbxproj 파일을 무시해야합니까? (0) | 2020.09.03 |
C, Clojure, Python, Ruby, Scala 등의 벤치 마크 해석 (0) | 2020.09.03 |