Поиск Изображения В Изображении?

Тема в разделе "Java", создана пользователем andruxai, 27 дек 2013.

  1. andruxai

    andruxai Member

    Регистрация:
    10 дек 2013
    Сообщения:
    8
    Симпатии:
    0
    Всем привет. Подскажите как сделать поиск изображения в изображении. Есть два изображения: большое, и маленькое. На большом надо найти маленькое. Например: чтоб на робочем столе программа знала место расположения папок? Кто нибудь сталкивался с такой проблемой?
     
  2. andruxai

    andruxai Member

    Регистрация:
    10 дек 2013
    Сообщения:
    8
    Симпатии:
    0
    От нашол код который мне нада но он очень медленный. Может ктото знает как можна его ускорить?
    Код:
    Код (Text):
    import java.awt.image.BufferedImage;


    public class Motor {


    int[] findSubimage(BufferedImage im1, BufferedImage im2){
    int w1 = im1.getWidth(); int h1 = im1.getHeight();
    int w2 = im2.getWidth(); int h2 = im2.getHeight();
    assert(w2 <= w1 && h2 <= h1);
    // will keep track of best position found
    int bestX = 0; int bestY = 0; double lowestDiff = Double.POSITIVE_INFINITY;
    // brute-force search through whole image (slow...)
    for(int x = 0;x < w1-w2;x++){
    for(int y = 0;y < h1-h2;y++){
    double comp = compareImages(im1.getSubimage(x,y,w2,h2),im2);
    if(comp < lowestDiff){
    bestX = x; bestY = y; lowestDiff = comp;
    }
    }
    }
    // output similarity measure from 0 to 1, with 0 being identical
    System.out.println(lowestDiff);
    System.out.println(bestX+" "+bestY);
    // return best location
    return new int[]{bestX,bestY};

    }



    /**
    * Determines how different two identically sized regions are.
    */
    private double compareImages(BufferedImage im1, BufferedImage im2) {
    assert(im1.getHeight() == im2.getHeight() && im1.getWidth() == im2.getWidth());
    double variation = 0.0;
    for(int x = 0;x < im1.getWidth();x++){
    for(int y = 0;y < im1.getHeight();y++){
    variation += compareARGB(im1.getRGB(x,y),im2.getRGB(x,y))/Math.sqrt(3);
    }
    }
    return variation/(im1.getWidth()*im1.getHeight());

    }
    /**
    * Calculates the difference between two ARGB colours (BufferedImage.TYPE_INT_ARGB).
    */
    private double compareARGB(int rgb1, int rgb2) {
    double r1 = ((rgb1 >> 16) & 0xFF)/255.0; double r2 = ((rgb2 >> 16) & 0xFF)/255.0;
    double g1 = ((rgb1 >> 8) & 0xFF)/255.0; double g2 = ((rgb2 >> 8) & 0xFF)/255.0;
    double b1 = (rgb1 & 0xFF)/255.0;         double b2 = (rgb2 & 0xFF)/255.0;
    double a1 = ((rgb1 >> 24) & 0xFF)/255.0; double a2 = ((rgb2 >> 24) & 0xFF)/255.0;
    // if there is transparency, the alpha values will make difference smaller
    return a1*a2*Math.sqrt((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2));
    }

    }
     
Загрузка...

Поделиться этой страницей