Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск изображения в изображении??? 
:(
    Опции темы
andruxai
Дата 27.12.2013, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



Всем привет. Подскажите как сделать поиск изображения в изображении. Есть два изображения: большое, и маленькое. На большом надо найти маленькое. Например: чтоб на робочем столе программа знала место расположения папок? Кто нибудь сталкивался с такой проблемой?
PM MAIL   Вверх
Stolzen
Дата 27.12.2013, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Ну я думаю можно решить проблему в лоб: допустим, есть у вас маленькое изображение размера m * n, то пускаете окошко этого размера по большому файлу с шагом в 1 пиксель, и для каждого окошка проверяете, совпадает ли оно с искомым изображением. 

Вот примерный код для пускания окошка
Код

windowWidth = 32;
windowHeight = 32;

for j = 1:imageHeight - windowHeight + 1
    for i = 1:imageWidth - windowWidth + 1
        window = image(j:j + windowHeight - 1, i:i + windowWidth - 1, :);
        % do stuff with subimage
    end
end


Это сообщение отредактировал(а) Stolzen - 27.12.2013, 09:35


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
andruxai
Дата 27.12.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.12.2013

Репутация: нет
Всего: нет



От нашол код который мне нада но он очень медленный. Может ктото знает как можна его ускорить?
Код:
Код

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));
    }

}


PM MAIL   Вверх
Stolzen
Дата 28.12.2013, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Ответил вам тут (чет уведомление об ответе в этой теме не пришло)


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.