두 이미지 간의 유사성을 어떻게 측정할 수 있나요?[닫은]
-
09-06-2019 - |
문제
한 응용 프로그램(웹 페이지일 수 있음)의 스크린샷을 이전에 찍은 스크린샷과 비교하여 응용 프로그램이 올바르게 표시되는지 확인하고 싶습니다.측면이 약간 다를 수 있기 때문에 정확한 일치 비교를 원하지 않습니다(웹 앱의 경우 브라우저에 따라 일부 요소가 약간 다른 위치에 있을 수 있음).스크린샷이 얼마나 유사한지 측정할 수 있어야 합니다.
이미 그렇게 하는 라이브러리/도구가 있나요?어떻게 구현하시겠습니까?
해결책
알고리즘이 얼마나 똑똑하길 원하는지에 따라 다릅니다.
예를 들어 다음은 몇 가지 문제입니다.
- 잘린 이미지와 잘리지 않은 이미지
- 텍스트가 추가 된 이미지와없는 이미지
- 미러링 된 이미지
내가 본 가장 쉽고 간단한 알고리즘 은 각 이미지에 대해 다음 단계를 수행하는 것입니다.
- 64x64 또는 32x32와 같이 작은 크기로 조정하고 가로 세로 비율을 무시하고 가장 가까운 픽셀 대신 결합 크기 조정 알고리즘을 사용합니다.
- 가장 어두운 부분이 검은 색이고 가장 밝은 부분이 흰색이되도록 색상 범위를 조정합니다.
- 가장 밝은 색상이 왼쪽 상단이되고 오른쪽 상단이 다음 어두워지고 왼쪽 하단이 다음 어두워 지도록 이미지를 회전하고 뒤집습니다 (물론 가능한 한)
편집 결합 배율 알고리즘 은 10 픽셀을 1로 축소 할 때 모든 10 픽셀의 색상을 가져와 결합하는 함수를 사용하여 수행하는 알고리즘입니다. 하나로. 평균화, 평균값과 같은 알고리즘 또는 쌍 입방 스플라인과 같은 더 복잡한 알고리즘으로 수행 할 수 있습니다.
그런 다음 두 이미지 간의 평균 거리를 픽셀 단위로 계산합니다.
데이터베이스에서 가능한 일치 항목을 찾으려면 픽셀 색상을 데이터베이스의 개별 열로 저장하고 여러 개의 열을 색인화하고 (매우 작은 이미지를 사용하지 않는 한 전부는 아님) 다음을 사용하는 쿼리를 수행하십시오. 각 픽셀 값에 대한 범위, 즉. 작은 이미지의 픽셀이 조회하려는 이미지의 -5에서 +5 사이 인 모든 이미지
이는 구현하기 쉽고 실행이 상당히 빠르지 만 물론 대부분의 고급 차이점을 처리하지는 않습니다. 이를 위해서는 훨씬 더 고급 알고리즘이 필요합니다.
다른 팁
이를 측정하는 '고전적인'방법은 이미지를 몇 개의 표준 섹션 수 (예 : 10x10 그리드)로 분할 한 다음 각 셀 내부의 RGB 값의 히스토그램을 계산하고 해당 히스토그램을 비교하는 것입니다.이러한 유형의 알고리즘은 단순성과 확장 및 (작은!) 번역에 불변하기 때문에 선호됩니다.
정규화 된 컬러 히스토그램을 사용합니다. ( 여기 에서 애플리케이션에 대한 섹션을 읽으십시오), 이들은 일반적으로 이미지 검색 / 일치 시스템에서 사용되며 매우 신뢰할 수 있고 상대적으로 빠르고 구현하기 쉬운 이미지를 일치시키는 표준 방법입니다.
본질적으로 색상 히스토그램은 이미지의 색상 분포를 캡처합니다. 그런 다음 다른 이미지와 비교하여 색상 분포가 일치하는지 확인할 수 있습니다.
이 유형의 일치는 크기 조정 (히스토그램이 정규화되면) 및 회전 / 이동 / 이동 등에 매우 유연합니다.
이미지가 약간 회전 / 이동되는 것처럼 픽셀 단위 비교를 피하면보고되는 큰 차이로 이어질 수 있습니다.
히스토그램은 직접 생성하는 것이 쉽지만 (픽셀 값에 액세스 할 수 있다고 가정), 마음에 들지 않으면 OpenCV 라이브러리는 이런 종류의 작업을 수행 할 수있는 훌륭한 리소스입니다. 여기 는 다음을 사용하여 히스토그램을 만드는 방법을 보여주는 파워 포인트 프레젠테이션입니다. OpenCV.
MPEG와 같은 비디오 인코딩 알고리즘은 델타 만 인코딩 할 수 있도록 비디오의 각 프레임 간의 차이를 계산하지 않습니까?비디오 인코딩 알고리즘이 이러한 프레임 차이를 계산하는 방법을 살펴볼 수 있습니다.
이 오픈 소스 이미지 검색 애플리케이션을 살펴보십시오. http://www.semanticmetadata.net/lire/.MPEG-7 표준 인 ScalableColor, ColorLayout, EdgeHistogram 및 Auto Color Correlogram의 몇 가지 이미지 유사성 알고리즘을 설명합니다.
다음과 같은 순수한 수학적 접근 방식을 사용할 수 있습니다. O(n^2)
, 그러나 오프셋이나 이와 유사한 것이 없다고 확신하는 경우에만 유용할 것입니다.(동질적인 색상을 가진 개체가 몇 개 있는 경우에도 여전히 잘 작동합니다.)
어쨌든, 아이디어는 두 행렬의 정규화된 내적을 계산하는 것입니다.C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2))
.
이 공식은 실제로 행렬 사이 각도의 "코사인"입니다(이상함).유사성이 클수록(예를 들어 Pij=Qij
), C는 1이 될 것이며, 완전히 다르다면 i,j Qij = 1
(0분할 방지), Pij = 255
, 다음으로 크기 nxn
, 더 큰 것 n
0에 가까울수록 우리는 얻게 될 것입니다.(대략적인 계산으로: C=1/n^2
).
이를 위해서는 패턴 인식 이 필요합니다.두 이미지 간의 작은 차이를 확인하기 위해 Hopfield net 이 상당히 잘 작동하고 구현하기가 매우 쉽습니다.그래도 사용 가능한 구현이 없습니다.
루비 솔루션은 여기 에서 찾을 수 있습니다.
Readme에서 :
Phashion은 중복 및 거의 중복 된 멀티미디어 파일을 감지하는 pHash 라이브러리 "지각 해시"를 둘러싼 Ruby 래퍼입니다.
두 이미지 간의 유사성을 측정하는 방법은 측정하려는 항목 (예 : 대비, 밝기, 양식, 노이즈 ...)에 따라 전적으로 달라진 다음 가장 적합한 유사성 측정을 선택합니다.밝기 측정에 적합한 MAD (평균 절대 차이), MSD (평균 제곱 차이) 중에서 선택할 수 있습니다. CR (상관 계수)는 두 이미지 간의 상관 관계를 나타내는 데 좋습니다.또한 SDH (차이 이미지 히스토그램의 표준 편차)와 같은 히스토그램 기반 유사성 측정이나 MI (상호 정보) 또는 NMI (정규화 된 상호 정보).
이 유사성 측정은 시간이 많이 걸리기 때문에 이러한 측정을 적용하기 전에 이미지를 축소하는 것이 좋습니다.
한 이미지에서 다른 이미지를 빼고 결과 이미지를 gif의 jpeg로 압축하고유사성의 척도로 파일 크기.
두 개의 동일한 이미지가있는 경우 흰색 상자가 표시되어 매우 잘 압축됩니다.이미지가 다를수록 표현이 더 복잡해 지므로 압축률이 낮아집니다.
아마 이상적인 테스트는 아니고 필요한 것보다 훨씬 느리지 만 빠르고 더러운 구현으로 작동 할 수 있습니다.
오픈 소스 도구 findimagedupes 에 대한 코드가 표시되지만 볼 수 있습니다.Perl로 작성 되었기 때문에 파싱이 얼마나 쉬운 지 말할 수 없습니다 ...
좋아했던 findimagedupes 페이지를 읽으면서 C ++ 구현이동일한 알고리즘 .아마도 이것은 이해하기 더 쉬울 것입니다.
또한 gqview 를 사용할 수도 있습니다.
글쎄요, 질문에 직접 답하기는 아니지만 이런 일이 발생하는 것을 보았습니다.Microsoft는 최근에 PhotoSynth 라는 도구를 출시했습니다.가로 세로 비율이 다를 수 있습니다.
블로그에 사용 가능한 라이브러리 나 코드 스 니펫이 있는지 궁금합니다.
Vaibhav의 메모를 확장하기 위해 hugin 은 약간의 통찰력이 있어야하는 오픈 소스 'autostitcher'입니다.문제에 대해.
콘텐츠 기반 이미지 검색을위한 소프트웨어가있어 필요한 작업을 (부분적으로) 수행합니다.모든 참조 및 설명은 프로젝트 사이트에서 링크되며 짧은 교과서 (Kindle)도 있습니다. LIRE
실제로 기본 수준의 방법을 사용하면 모든 픽셀 색상을 살펴보고 두 번째 이미지의 해당 픽셀 색상과 비교할 수 있습니다.하지만 이는 아마도 매우 매우 느린 솔루션 일 것입니다. p>
이 작업이 가끔씩 수행되고 자동화가 필요하지 않은 경우 Photoshop 또는 Paint Shop Pro와 같은 레이어를 지원하는 이미지 편집기에서 수행 할 수 있습니다 (아마도 김프 또는 Paint.Net,그러나 나는 그것에 대해 잘 모르겠습니다).두 스크린 샷을 모두 열고 하나를 다른 하나 위에 레이어로 놓습니다.레이어 혼합 모드를 차이로 변경하면 둘 사이에 동일한 모든 것이 검은 색이됩니다.정렬 차이를 최소화하기 위해 상단 레이어를 이동할 수 있습니다.
Siamese Network를 사용하여 자습서 .이 자습서에서는 유사한 이미지를 클러스터링하지만 L2
거리를 사용하여 두 이미지의 유사성을 측정 할 수 있습니다.
비욘드 비교 는 이미지를 픽셀 단위로 비교합니다. 예 :