Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102

Сравнение изображений

19.10.2016, 13:18. Показов 6023. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написана функция, которая сравнивает два изображения и вычисляет смещение одного относительно другого по осям Х и Y. В функции используются принцип максимизации нормированной корреляции.

Собственно проблема в следующем: на больших изображениях, размером 3000 на 3000 пикселей программа ДОЛГО выполняется.

Хотелось бы узнать способы оптимизации.

Код представлен ниже: W, H - ширина и высота изображения (предполагается, что изображения имеют одинаковые W и Н)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    
    int xc = W/2;
    int yc = H/2;
 
    int r = 500;
    int d = 20;
 
    float corr_max = -1.0;
 
    int i_max = 0; 
    int j_max = 0;
 
    int progress = 0;
 
    float img1_avar = 0.0;
    for(int y = yc-r; y <= yc+r; ++y){
        for(int x = xc-r; x <= xc+r; ++x)
            if(x>=0 && y>=0 && x<W && y<H){
                img1_avar += arr1[x+y*W];
            }
    }
    img1_avar /= pow(2*r+1, 2);
 
    for(int j = yc-d; j <= yc+d; ++j){
        for(int i = xc-d; i <= xc+d; ++i){
            if(i>=0 && j>=0 && i<W && j<H){
                float img2_avar = 0.0;
                for(int y = j-r; y <= j+r; ++y){
                    for(int x = i-r; x <= i+r; ++x){
                        if(x>=0 && y>=0 && x<W && y<H){
                            img1_avar += arr2[x+y*W];  
                        }
                    }
                }
 
                img1_avar /= pow(2*r+1, 2);
 
                float s1 = 0;
                float s2 = 0;
                float s3 = 0;
 
                for(int y = j-r; y <= j+r; ++y){
                    for(int x = i-r; x <= i+r; ++x){
                        if(x>=0 && y>=0 && x<W && y<H &&
                          (x-i+xc)>=0 && (y-j+yc)>=0 && (x-i+xc)<W && (y-j+yc)<H){
                            float a1 = arr1[x-i+xc + (y-j+yc)*W] - img1_avar;
                            float a2 = arr2[x+y*W] - img2_avar;
 
                            s1 += a1*a2;
                            s2 += a1*a1;
                            s3 += a2*a2;
                        }
                    }
                }
 
                float corr = s1/(sqrt(s2)*sqrt(s3));
                if(corr > corr_max){
                    corr_max = corr;
                    i_max = i;
                    j_max = j;
                }
            }
            progress ++;
        }
 
        cout << 100*progress/((2*d+1)*(2*d+1)) << endl;
    }
 
    int dx = xc - i_max;
    int dy = yc - j_max;
Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2016, 13:18
Ответы с готовыми решениями:

Сравнение изображений
ДОБРОЕ ВРЕМЯ СУТОК, уважаемые программисты! У меня будет такой вопрос: Как можно узнать содержимое JPEG файла для попикселного...

Сравнение изображений
Есть вот такое изображение,(я сделал скриншот, на самом деле это 2 изображения разных спектров) одно и тоже снимаеться, как можно выделив...

Сравнение изображений OpenCv
Поскажите ресурсы по изучению OpenCV. Стоит следующая задача. Есть avi с попеременно меняющимися 3-мя каналами видео. С помощью шаблонов...

6
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
19.10.2016, 13:47
OpenMP - https://software.intel.com/ru-... studio-xe/,
NVIDIA CUDA Toolkit - https://developer.nvidia.com/cuda-zone

Добавлено через 1 минуту
OpenCV - http://opencv.org/
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
19.10.2016, 13:51
Это что за задача? Оптически поток, стереореконструкция? А то там специальные методы для этого есть. Можно не корреляцией это считать, а поиском ключевых точек (тем же SURF, SIFT) и считать смещение по ним.

Вообще, а как ты хотел - у тебя свертка для изображения 3000*3000 = 9000000 целей для этой свертки, плюс в каждом нужно рассматривать окрестность определенного радиуса... А скорость доступа к памяти много медленнее выполнения арифметических инструкций. Плюс куча вложенных циклов.

Можно попробовать раскрутить некоторые внутренние (а мб, и не только внутренние) циклы - в OpenCV сделано именно так, и на практике прирост в скорости действительно существенный.

Также можно не считать каждый раз выражения типа `(y-j+yc)`, а посчитать их перед циклом по х-ам, запомнить в переменную и потом пользоваться. Я говорил, что тут скорее дело в скорости памяти, но все же. Зачем выполнять лишние инструкции, когда их можно избежать?

Возможно, нужно распараллелить это дело (к примеру, разбить изображение на N полос, где N - кол-во потоков, и каждую полосу обрабатывать в отдельном потоке. OpenMP позволяет это легко сделать.

Ну и можешь не каждый пиксель сравнивать, а с определенным шагом - но тут нужно смотреть на саму задачу, все от нее зависит, а твою я пока не совсем понимаю (точнее, итоговую цель).

PS
У тебя и радиус огромный... Однозначно раскрутку циклов делай, должна помочь (https://ru.wikipedia.org/wiki/... 0%BB%D0%B0).
1
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
19.10.2016, 14:00  [ТС]
monolit, хорошо, попробую! спасибо!

Добавлено через 3 минуты
В терминах "Оптический поток, стереореконструкция" не очень разбираюсь. Просто нужно сравнить два изображения. Было предложено сделать с помощью подсчета корреляции, но как выяснилось (это и в интернете пишут), что способ этот медленный. Нашла так же то, что есть и другие алгоритмы, более эффективные, но они как - то сложны для моего понимания.

А какие вообще есть возможности сравнить изображения? Находила много статей на Хабре и так - на просторах интернета. Но там все поверхностно - скорее для тех, кто знаком с этой темой. А я новичок.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
19.10.2016, 14:45
Лучший ответ Сообщение было отмечено M4753 как решение

Решение

M4753, как вариант - ключевые точки (SURF/SIFT) или использование гистограмм. Эти должны быть намного быстрее. А в твоем случае, возможно, нужно просто понизить разрешение и сравнивать изображения в уменьшенном виде. Чем не вариант.

Вот одни из первых ссылок в гугле: http://stackoverflow.com/quest... -algorithm.

Если хочется ускорить свой - раскручивай циклы и используй OpenMP. Ставлю на наибольший выигрыш от раскрутки внутренних циклов (которые по радиусу) - их и раскрутить легче будет. С внешними уже придется повозиться... Хотя, можно пробовать комбинацию. Ну и лишних вычислений старайся не делать где этого можно избежать...
1
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
19.10.2016, 14:50  [ТС]
Спасибо, попробую!!!
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
20.10.2016, 12:44
Одно изображение содержит второе без преобразований и шума?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2016, 12:44
Помогаю со студенческими работами здесь

Сравнение текста из файла и сравнение с текстом в программе char - Dev C++
Доброго времени суток! Имеется код программы: ifstream test(&quot;primer.txt&quot;); char awm = &quot;kod&quot;; char buff; test &gt;&gt; buff; if...

C# сравнение изображений
Есть изображение в pictureBox1 могу ли я сравнить картинку в боксе с другой картинкой? точней получить имя этой картинки(картинка в...

Сравнение изображений
Добрый день. Пишу программу удаленного управления. Нужно найти и отправить измененные части снимка рабочего стола, как это реализовать...

Сравнение изображений
Здравствуйте, объясните кофейнику как сравнить два абсолютно одинаковых изображения. Просто одинаковые они или нет. Что-то типа такого...

Сравнение изображений
Здравствуйте! Знаю, подобные темы обсуждались, но мой вопрос немного другой: есть папка с изображениями и все они разные. Как сравнить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru