开发者

Image in Image Algorithm

开发者 https://www.devze.com 2023-02-05 18:29 出处:网络
I need an algorithm written in any language to find an image inside of an image, includin开发者_StackOverflow中文版g at different scales. Does anyone know a starting point to solving a problem like th

I need an algorithm written in any language to find an image inside of an image, includin开发者_StackOverflow中文版g at different scales. Does anyone know a starting point to solving a problem like this?

For example:

I have an image of 800x600 and in that image is a yellow ball measuring 180 pixels in circumference. I need to be able to find this image with a search pattern of a yellow ball having a circumference of 15 pixels.

Thanks


Here's an algorithm:

  • Split the image into RGB and take the blue channel. You will notice that areas that were yellow in the color image are now dark in the blue channel. This is because blue and yellow are complementary colors.
  • Invert the blue channel
  • Create a greyscale search pattern with a circle that's the same size as what's in the image (180 pixels in circumference). Make it a white circle on a black background.
  • Calculate the cross-correlation of the search pattern with the inverted blue channel.
  • The cross-correlation peak will correspond to the location of the ball.

Here's the algorithm in action:

RGB and R:

Image in Image Algorithm

Image in Image Algorithm

G and B:

Image in Image Algorithm

Image in Image Algorithm

Inverted B and pattern:

Image in Image Algorithm

Image in Image Algorithm

Python + OpenCV code:

import cv
if __name__ == '__main__':
    image = cv.LoadImage('ball-b-inv.png')
    template = cv.LoadImage('ball-pattern-inv.png')

    image_size = cv.GetSize(image)
    template_size = cv.GetSize(template)
    result_size = [ s[0] - s[1] + 1 for s in zip(image_size, template_size) ]

    result = cv.CreateImage(result_size, cv.IPL_DEPTH_32F, 1)

    cv.MatchTemplate(image, template, result, cv.CV_TM_CCORR)

    min_val, max_val, min_loc, max_loc = cv.MinMaxLoc(result)

    print max_loc

Result:

misha@misha-desktop:~/Desktop$ python cross-correlation.py 
(72, 28)

This gives you the top-left co-ordinate of the first occurence of the pattern in the image. Add the radius of the circle to both x and y co-ordinates if you want to find the center of the circle.


You should take a look at OpenCV, an open source computer vision library - this would be a good starting point. Specifically check out object detection and the cvMatchTemplate method.


a version of one of previous posts made with opencv 3 and python 3

import cv2
import sys

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(cv2.matchTemplate(cv2.imread(sys.argv[1]),cv2.imread(sys.argv[2]),cv2.TM_CCOEFF_NORMED))

print(max_loc)

save as file.py and run as:
python file.py image pattern


A simple starting point would be the Hough transform, if you want to find circles.

However there is a whole research area arount this subject called object detection and recognition. The state of the art has advanced significantly the past decade.

0

精彩评论

暂无评论...
验证码 换一张
取 消