한 응용 프로그램 (웹 페이지 일 수 있음)의 스크린 샷을 이전에 찍은 스크린 샷과 비교하여 응용 프로그램이 올바르게 표시되는지 확인하고 싶습니다. 측면이 약간 다를 수 있기 때문에 정확한 일치 비교를 원하지 않습니다 (웹 앱의 경우 브라우저에 따라 일부 요소가 약간 다른 위치에있을 수 있음). 스크린 샷이 얼마나 유사한 지 측정해야합니다.
이미 그렇게하는 라이브러리 / 도구가 있습니까? 어떻게 구현 하시겠습니까?
한 응용 프로그램 (웹 페이지 일 수 있음)의 스크린 샷을 이전에 찍은 스크린 샷과 비교하여 응용 프로그램이 올바르게 표시되는지 확인하고 싶습니다. 측면이 약간 다를 수 있기 때문에 정확한 일치 비교를 원하지 않습니다 (웹 앱의 경우 브라우저에 따라 일부 요소가 약간 다른 위치에있을 수 있음). 스크린 샷이 얼마나 유사한 지 측정해야합니다.
이미 그렇게하는 라이브러리 / 도구가 있습니까? 어떻게 구현 하시겠습니까?
답변:
이것은 전적으로 알고리즘이 얼마나 똑똑하길 원하는지에 달려 있습니다.
예를 들어 다음과 같은 몇 가지 문제가 있습니다.
내가 본 가장 쉽고 간단한 알고리즘 은 각 이미지에 대해 다음 단계를 수행하는 것입니다.
편집 조합 스케일링 알고리즘은 하나의 픽셀 (10) 아래로 확장하는 경우에 하나의 모든 화소 (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 nets 는 상당히 잘 작동하며 구현하기가 매우 쉽습니다. 그래도 사용 가능한 구현을 모릅니다.
두 이미지 간의 유사성을 측정하는 방법은 전적으로 측정하려는 항목 (예 : 대비, 밝기, 양식, 노이즈 ...)에 따라 달라지며 가장 적합한 유사성 측정을 선택합니다. 밝기 측정에 적합한 MAD (평균 절대 차이), MSD (평균 제곱 차이) 중에서 선택할 수 있습니다 . 두 이미지 간의 상관 관계를 나타내는 데 좋은 CR (상관 계수) 도 사용할 수 있습니다. SDH (차이 이미지 히스토그램의 표준 편차) 와 같은 히스토그램 기반 유사성 측정 이나 MI (상호 정보) 또는 NMI (정규화 된 상호 정보) 와 같은 다중 모드 유사성 측정 중에서 선택할 수도 있습니다 .
이 유사성 측정 값은 시간이 많이 걸리므로 이러한 측정 값을 적용하기 전에 이미지를 축소하는 것이 좋습니다.
오픈 소스 도구 findimagedupes 의 코드를 살펴볼 수도 있지만, 펄로 작성된 것처럼 보이므로 파싱이 얼마나 쉬운 지 말할 수 없습니다.
내가 좋아하는 findimagedupes 페이지를 읽으면 동일한 알고리즘의 C ++ 구현이 있음을 알 수 있습니다. 아마도 이것은 이해하기 더 쉬울 것입니다.
그리고 gqview 를 사용할 수도 있습니다 .
글쎄, 당신의 질문에 직접 대답하지는 않지만 이런 일이 일어나는 것을 보았습니다. Microsoft는 최근 에 많은 수의 사진에서 겹치는 영역을 결정하기 위해 매우 유사한 작업을 수행 하는 PhotoSynth 라는 도구를 출시했습니다 (종횡비가 다를 수 있음).
블로그에 사용 가능한 라이브러리 나 코드 스 니펫이 있는지 궁금합니다.
이 작업이 가끔 수행되고 자동화가 필요하지 않은 경우 Photoshop 또는 Paint Shop Pro (아마도 GIMP 또는 Paint.Net도 가능하지만 나는 레이어를 지원하는 이미지 편집기)에서 수행 할 수 있습니다. m 확실하지 않음). 두 스크린 샷을 모두 열고 하나를 다른 위에 레이어로 놓습니다. 레이어 혼합 모드를 차이로 변경하면 둘 사이에 동일한 모든 것이 검은 색이됩니다. 정렬 차이를 최소화하기 위해 상단 레이어를 이동할 수 있습니다.
Beyond Compare 는 이미지를 픽셀 단위로 비교합니다.