두 이미지 간의 유사성을 어떻게 측정 할 수 있습니까? [닫은]


94

한 응용 프로그램 (웹 페이지 일 수 있음)의 스크린 샷을 이전에 찍은 스크린 샷과 비교하여 응용 프로그램이 올바르게 표시되는지 확인하고 싶습니다. 측면이 약간 다를 수 있기 때문에 정확한 일치 비교를 원하지 않습니다 (웹 앱의 경우 브라우저에 따라 일부 요소가 약간 다른 위치에있을 수 있음). 스크린 샷이 얼마나 유사한 지 측정해야합니다.

이미 그렇게하는 라이브러리 / 도구가 있습니까? 어떻게 구현 하시겠습니까?


1
이 다른 유사한 질문에 좋은 답변이 있습니다. stackoverflow.com/questions/75891/…
blak

1
그리고 자세한 내용은 여기 : stackoverflow.com/questions/189943/...
Anoyz

1
머신 러닝의 최근 발전과보다 구체적으로 "딥 러닝"에 비추어 답변을 업데이트 할 시간입니다.
jldupont

내 연구실도이 문제를 해결하는 데 필요한, 사용 된 워크 플로우는 여기에 설명 : douglasduhaime.com/posts/...
duhaime

답변:


73

이것은 전적으로 알고리즘이 얼마나 똑똑하길 원하는지에 달려 있습니다.

예를 들어 다음과 같은 몇 가지 문제가 있습니다.

  • 잘린 이미지와 잘리지 않은 이미지
  • 텍스트가 추가 된 이미지와없는 이미지
  • 미러링 된 이미지

내가 본 가장 쉽고 간단한 알고리즘 은 각 이미지에 대해 다음 단계를 수행하는 것입니다.

  1. 64x64 또는 32x32와 같은 작은 크기로 조정하고 종횡비를 무시하고 가장 가까운 픽셀 대신 결합 크기 조정 알고리즘을 사용합니다.
  2. 가장 어두운 부분이 검은 색이고 가장 밝은 부분이 흰색이되도록 색상 범위를 조정합니다.
  3. 가장 밝은 색상이 왼쪽 위가되도록 이미지를 회전하고 뒤집고 오른쪽 위가 다음으로 어두워지고 왼쪽 아래가 다음으로 어두워집니다 (물론 가능한 한 멀리)

편집 조합 스케일링 알고리즘은 하나의 픽셀 (10) 아래로 확장하는 경우에 하나의 모든 화소 (10) 및 콤바인 그들 색을 취하는 함수를 사용하여 수행 할 것입니다. 평균화, 평균값과 같은 알고리즘 또는 쌍 입방 스플라인과 같은 더 복잡한 알고리즘으로 수행 할 수 있습니다.

그런 다음 두 이미지 간의 평균 거리를 픽셀 단위로 계산합니다.

데이터베이스에서 가능한 일치 항목을 찾으려면 픽셀 색상을 데이터베이스에 개별 열로 저장하고 여러 열을 인덱싱하고 (매우 작은 이미지를 사용하지 않는 한 전부는 아님) 각 항목에 대해 범위를 사용하는 쿼리를 수행하십시오. 픽셀 값, 즉. 작은 이미지의 픽셀이 조회하려는 이미지의 -5에서 +5 사이에있는 모든 이미지.

이것은 구현하기 쉽고 실행이 상당히 빠르지 만 물론 대부분의 고급 차이점을 처리하지는 않습니다. 이를 위해서는 훨씬 더 고급 알고리즘이 필요합니다.


14
"결합 스케일링 알고리즘"이란 무엇입니까?
Gregg Lind

32

이를 측정하는 '고전적인'방법은 이미지를 몇 개의 표준 섹션 수 (예 : 10x10 그리드)로 분할 한 다음 각 셀 내부의 RGB 값의 히스토그램을 계산하고 해당 히스토그램을 비교하는 것입니다. 이러한 유형의 알고리즘은 단순성과 스케일링 및 (작은!) 번역에 대한 불변성 때문에 선호됩니다.


6
이것은 전체 이미지에 대해 단일 히스토그램을 수행하는 것과 유사하지 않지만 미러링 및 회전이 불가능하다는 추가 단점이 있습니까?
dodgy_coder

절반 이미지의 2 개 히스토그램은 전체 히스토그램 1 개보다 일치 정밀도가 더 좋습니다. 언급 한 단점이 있지만 해결중인 문제에 따라 다릅니다.
psycho brm

25

정규화 된 색상 히스토그램을 사용합니다. ( 여기 에서 애플리케이션에 대한 섹션을 읽으 십시오 ), 이들은 이미지 검색 / 매칭 시스템에서 일반적으로 사용되며 매우 안정적이고 상대적으로 빠르고 구현하기 쉬운 이미지를 일치시키는 표준 방법입니다.

기본적으로 색상 히스토그램은 이미지의 색상 분포를 캡처합니다. 그런 다음 다른 이미지와 비교하여 색상 분포가 일치하는지 확인할 수 있습니다.

이러한 유형의 일치는 스케일링 (히스토그램이 정규화되면) 및 회전 / 이동 / 이동 등에 매우 유연합니다.

이미지가 약간 회전 / 시프트 된 것처럼보고되는 큰 차이로 이어질 수 있으므로 픽셀 단위 비교를 피하십시오.

히스토그램은 직접 생성하는 것이 간단하지만 (픽셀 값에 액세스 할 수 있다고 가정), 마음에 들지 않으면 OpenCV 라이브러리가 이러한 종류의 작업을 수행 할 수있는 훌륭한 리소스입니다. 다음 은 OpenCV를 사용하여 히스토그램을 만드는 방법을 보여주는 파워 포인트 프레젠테이션입니다.


14

MPEG와 같은 비디오 인코딩 알고리즘이 비디오의 각 프레임 간의 차이를 계산하여 델타 만 인코딩하지 않습니까? 비디오 인코딩 알고리즘이 이러한 프레임 차이를 계산하는 방법을 살펴볼 수 있습니다.

이 오픈 소스 이미지 검색 애플리케이션 http://www.semanticmetadata.net/lire/를보십시오 . MPEG-7 표준 인 ScalableColor, ColorLayout, EdgeHistogram 및 Auto Color Correlogram의 세 가지 이미지 유사성 알고리즘을 설명합니다.


1
이것은 여기의 질문에 답하지 않을 것입니다. 문제는 픽셀 당 픽셀 비교에 관한 것이 아닙니다.
Kousha

@Kousha 사실이지만 생각하기에 여전히 흥미로운 방향입니다.
의미 문제

13

의 순수한 수학적 접근 방식을 사용할 수 O(n^2)있지만 오프셋이나 이와 비슷한 것이 없다고 확신하는 경우에만 유용합니다. (균질 한 색상의 개체가 몇 개 있으면 여전히 잘 작동합니다.)

어쨌든, 아이디어는 두 행렬의 정규화 된 내적을 계산하는 것입니다. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

이 공식은 실제로 행렬 (위어) 사이 각도의 "코사인"입니다. 유사성이 클수록 Pij=QijC는 1이되고, 완전히 다른 경우에는 i,j Qij = 1(0 분할을 피하고), Pij = 255크기 nxn에 대해 더 크게할수록 n0에 가까워집니다. 가져 오기. (대략 계산 :) C=1/n^2.


8

이를 위해서는 패턴 인식 이 필요 합니다. 두 이미지 간의 작은 차이를 확인하기 위해 Hopfield nets 는 상당히 잘 작동하며 구현하기가 매우 쉽습니다. 그래도 사용 가능한 구현을 모릅니다.


7

루비 솔루션은 여기에서 찾을 수 있습니다 .

Readme에서 :

Phashion은 중복 및 거의 중복 된 멀티미디어 파일을 감지하는 pHash 라이브러리 "지각 해시"를 둘러싼 Ruby 래퍼입니다.


5

두 이미지 간의 유사성을 측정하는 방법은 전적으로 측정하려는 항목 (예 : 대비, 밝기, 양식, 노이즈 ...)에 따라 달라지며 가장 적합한 유사성 측정을 선택합니다. 밝기 측정에 적합한 MAD (평균 절대 차이), MSD (평균 제곱 차이) 중에서 선택할 수 있습니다 . 두 이미지 간의 상관 관계를 나타내는 데 좋은 CR (상관 계수) 도 사용할 수 있습니다. SDH (차이 이미지 히스토그램의 표준 편차) 와 같은 히스토그램 기반 유사성 측정 이나 MI (상호 정보) 또는 NMI (정규화 된 상호 정보) 와 같은 다중 모드 유사성 측정 중에서 선택할 수도 있습니다 .

이 유사성 측정 값은 시간이 많이 걸리므로 이러한 측정 값을 적용하기 전에 이미지를 축소하는 것이 좋습니다.


4

한 이미지를 다른 이미지에서 빼고 결과 이미지를 gif의 jpeg로 압축하고 파일 크기를 유사성의 척도.

두 개의 동일한 이미지가있는 경우 흰색 상자가 표시되어 정말 잘 압축됩니다. 이미지가 더 많이 다를수록 표현하기가 더 복잡해 지므로 압축률이 떨어집니다.

아마도 이상적인 테스트는 아니며 필요보다 훨씬 느릴 수 있지만 빠르고 더러운 구현으로 작동 할 수 있습니다.


90도 회전을 생각해보십시오. 이미지는 여전히 유사합니다.
의미 문제


2

글쎄, 당신의 질문에 직접 대답하지는 않지만 이런 일이 일어나는 것을 보았습니다. Microsoft는 최근 에 많은 수의 사진에서 겹치는 영역을 결정하기 위해 매우 유사한 작업을 수행 하는 PhotoSynth 라는 도구를 출시했습니다 (종횡비가 다를 수 있음).

블로그에 사용 가능한 라이브러리 나 코드 스 니펫이 있는지 궁금합니다.


1
이 기술. 중단되었습니다.
Joseph Rosson 2011

2

Vaibhav의 메모를 확장하기 위해 hugin 은 문제에 대한 통찰력을 가져야하는 오픈 소스 'autostitcher'입니다.


2

필요한 것을 (부분적으로) 수행하는 콘텐츠 기반 이미지 검색 용 소프트웨어가 있습니다. 모든 참조 및 설명은 프로젝트 사이트에서 링크되며 짧은 교과서 (Kindle)도 있습니다. LIRE


1

튜토리얼을 따라 Siamese Network를 사용하여 두 이미지가 비슷하거나 다른지 확인할 수 있습니다 . 이 자습서에서는 유사한 이미지를 클러스터링하지만 L2거리를 사용하여 두 이미지의 유사성을 측정 할 수 있습니다 .


0

이 작업이 가끔 수행되고 자동화가 필요하지 않은 경우 Photoshop 또는 Paint Shop Pro (아마도 GIMP 또는 Paint.Net도 가능하지만 나는 레이어를 지원하는 이미지 편집기)에서 수행 할 수 있습니다. m 확실하지 않음). 두 스크린 샷을 모두 열고 하나를 다른 위에 레이어로 놓습니다. 레이어 혼합 모드를 차이로 변경하면 둘 사이에 동일한 모든 것이 검은 색이됩니다. 정렬 차이를 최소화하기 위해 상단 레이어를 이동할 수 있습니다.


아주 간단한 diffing의이 유형을 만드는 또 다른 도구는 kaleidoscopeapp.com입니다
마이클 Osofsky

0

Beyond Compare 는 이미지를 픽셀 단위로 비교합니다.

여기에 이미지 설명 입력


@xilpex, OP는 묻습니다. 이미 그렇게하는 라이브러리 / 도구가 있습니까? 내 대답에는 그러한 라이브러리 / 도구에 대한 링크가 포함되어 있습니다.
emallove

-1

실제로 사용하는 기본 수준의 방법은 모든 픽셀 색상을 살펴보고 두 번째 이미지의 해당 픽셀 색상과 비교할 수 있습니다.하지만 이는 아마도 매우 느린 솔루션 일 것입니다.

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