johnsen
johnsen

Reputation: 1

What is the most effective way to compare similarity of two images (which contain buildings)

I have an image comparison problem.

To be more precise, I have a test image (a building taken from outside, could be a house, an apartment, a big public building) and I need to compare it against 100.000 other building images in my DB.

Is there an effective method to output top X images (which are most similar, if not the same) in the most accurate way possible to-date?

A number of StackOverflow answers guided me more towards feature-matching OpenCV but sadly I failed to progress (hitting bad accuracy and therefore roadblocks in terms of a way to improve it).

For instance, this is a test image that I would like to compare (white house - South). test_image

and these are the images in my DB pic1_DB pic2_DB pic3_DB pic4_DB pic5_DB

The desired/ideal output would be "the test image is the same building as that in Pic1, Pic3, Pic4 and Pic5".

And the test image is different significantly from Pic2.

Thank you all.

Upvotes: 0

Views: 3918

Answers (2)

Dr Yuan Shenghai
Dr Yuan Shenghai

Reputation: 1915

matchTemplate wont work well in this case, as they need exact size and viewpoint match.

Opencv Feature based method might work. You can try SIFT based method first. But the general assumption is that the rotation, translation, perspective changes are bounded. It means that for adjacent iamge pair, it can not be 1 taken from 20m and other picture taken from 10km away. Assumptions are made so that the feature can be associated. enter image description here

Deep learning-based method might work well given enough datasets. take POSEnet for reference. It can matches same building from different geometry view point and associate them correctly. enter image description here

Each method has pros and cons. You have to decide which method you can afford to use

Regards

Dr. Yuan Shenghai

Upvotes: 1

Flicic Suo
Flicic Suo

Reputation: 797

For pixel-wise similarity, you may use res = cv2.matchTemplate(img1, img2, cv2.TM_CCOEFF_NORMED) \\ similarity = res[0][0], which adopts standard corralation coefficient to evaluate simlarity (first assure two inputted image is in the same size).

For chromatic similarity, you may calculate histogram of each image by cv2.calHist, then measure the similarity between each histogram by metric of your choice.

For intuitive similarity, I'm afraid you have to use some machine learning or deep learning method since "similar" is a rather vague concept here.

Upvotes: 0

Related Questions