programing

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

nasanasas 2020. 9. 7. 08:15
반응형

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


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

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


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

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

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

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

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

편집 조합 스케일링 알고리즘은 하나의 픽셀 (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)).

This formula is actually the "cosine" of the angle between the matrices (wierd). The bigger the similarity (lets say Pij=Qij), C will be 1, and if they're completely different, lets say for every i,j Qij = 1 (avoiding zero-division), Pij = 255, then for size nxn, the bigger n will be, the closer to zero we'll get. (By rough calculation: C=1/n^2).


You'll need pattern recognition for that. To determine small differences between two images, Hopfield nets work fairly well and are quite easy to implement. I don't know any available implementations, though.


A ruby solution can be found here

From the readme:

Phashion is a Ruby wrapper around the pHash library, "perceptual hash", which detects duplicate and near duplicate multimedia files


How to measure similarity between two images entirely depends on what you would like to measure, for example: contrast, brightness, modality, noise... and then choose the best suitable similarity measure there is for you. You can choose from MAD (mean absolute difference), MSD (mean squared difference) which are good for measuring brightness...there is also available CR (correlation coefficient) which is good in representing correlation between two images. You could also choose from histogram based similarity measures like SDH (standard deviation of difference image histogram) or multimodality similarity measures like MI (mutual information) or NMI (normalized mutual information).

Because this similarity measures cost much in time, it is advised to scale images down before applying these measures on them.


I wonder (and I'm really just throwing the idea out there to be shot down) if something could be derived by subtracting one image from the other, and then compressing the resulting image as a jpeg of gif, and taking the file size as a measure of similarity.

If you had two identical images, you'd get a white box, which would compress really well. The more the images differed, the more complex it would be to represent, and hence the less compressible.

Probably not an ideal test, and probably much slower than necessary, but it might work as a quick and dirty implementation.


You might look at the code for the open source tool findimagedupes, though it appears to have been written in perl, so I can't say how easy it will be to parse...

Reading the findimagedupes page that I liked, I see that there is a C++ implementation of the same algorithm. Presumably this will be easier to understand.

And it appears you can also use gqview.


Well, not to answer your question directly, but I have seen this happen. Microsoft recently launched a tool called PhotoSynth which does something very similar to determine overlapping areas in a large number of pictures (which could be of different aspect ratios).

I wonder if they have any available libraries or code snippets on their blog.


to expand on Vaibhav's note, hugin is an open-source 'autostitcher' which should have some insight on the problem.


There's software for content-based image retrieval, which does (partially) what you need. All references and explanations are linked from the project site and there's also a short text book (Kindle): LIRE


Well a really base-level method to use could go through every pixel colour and compare it with the corresponding pixel colour on the second image - but that's a probably a very very slow solution.


If this is something you will be doing on an occasional basis and doesn't need automating, you can do it in an image editor that supports layers, such as Photoshop or Paint Shop Pro (probably GIMP or Paint.Net too, but I'm not sure about those). Open both screen shots, and put one as a layer on top of the other. Change the layer blending mode to Difference, and everything that's the same between the two will become black. You can move the top layer around to minimize any alignment differences.


You can use Siamese Network to see if the two images are similar or dissimilar following this tutorial. This tutorial cluster the similar images whereas you can use L2 distance to measure the similarity of two images.


Beyond Compare has pixel-by-pixel comparison for images, e.g.,

enter image description here

참고URL : https://stackoverflow.com/questions/25977/how-can-i-measure-the-similarity-between-two-images

반응형