Find known sub image in larger image

前端 未结 6 1432
谎友^
谎友^ 2020-12-13 03:13

Does anyone know of an algorithm (or search terms / descriptions) to locate a known image within a larger image?

e.g.

I have an image of a s

6条回答
  •  温柔的废话
    2020-12-13 03:53

    You could use unique visual elements of this target area to determine its position. These unique visual elements are like a "signature". Examples: unique icons, images and symbols. This approach works independently of the window resolution if you have unique elements in the corners. For fixed sized windows, just one element is sufficient to find all window coordinates.

    Below I illustrate the idea with a simple example using Marvin Framework.

    Unique elements:


    Program output:

    Original Image:
    window.png

    Source code:

    import static marvin.MarvinPluginCollection.*;
    
    public class FindSubimageWindow {
        public FindSubimageWindow(){
            MarvinImage window = MarvinImageIO.loadImage("./res/window.png");
            MarvinImage eclipse = MarvinImageIO.loadImage("./res/eclipse_icon.png");
            MarvinImage progress = MarvinImageIO.loadImage("./res/progress_icon.png");
    
            MarvinSegment seg1, seg2;
            seg1 = findSubimage(eclipse, window, 0, 0);
            drawRect(window, seg1.x1, seg1.y1, seg1.x2-seg1.x1, seg1.y2-seg1.y1);
    
            seg2 = findSubimage(progress, window, 0, 0);
            drawRect(window, seg2.x1, seg2.y1, seg2.x2-seg2.x1, seg2.y2-seg2.y1);
    
            drawRect(window, seg1.x1-10, seg1.y1-10, (seg2.x2-seg1.x1)+25, (seg2.y2-seg1.y1)+20);
    
            MarvinImageIO.saveImage(window, "./res/window_out.png");
        }
        private void drawRect(MarvinImage image, int x, int y, int width, int height){
            x-=4; y-=4; width+=8; height+=8;
            image.drawRect(x, y, width, height, Color.red);
            image.drawRect(x+1, y+1, width-2, height-2, Color.red);
            image.drawRect(x+2, y+2, width-4, height-4, Color.red);
        }
        public static void main(String[] args) {
            new FindSubimageWindow();
        }   
    }
    

提交回复
热议问题