Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Алгоритмы совмещения изображений

1478  1 2 все
AlexNek патриот30.09.24 17:56
AlexNek
30.09.24 17:56 

Даже не изображений, а проще скриншотов.

Есть у нас большая картинка

|==================|
|====|
   |====|
     |====|
...

Но видна она через маленькое окно. И вот набираем таких картинок, а после их нужно объединить

часть 1часть 2

Алгоритмов полно, но все они "работают" для разных типов изображений. Многие на этом тесте только вертикально скролла, обламываются, так как фон "мешает"

Разные сетки страшно зависят от шага и т.п.

А хочется иметь что-то одно, чтобы нелажало часто.

Видимо, нужна определенная комбинация, вот весь вопрос какая, пока не находится. Что посоветуете?

#1 
alex445 патриот03.10.24 09:25
NEW 03.10.24 09:25 
в ответ AlexNek 30.09.24 17:56

Ну явно же задача для ИИ. Или этот ваш ИИ только копипастным поиском заниматься может да по 4 завязанных в узлы пальца генерировать?

#2 
AlexNek патриот03.10.24 11:35
AlexNek
NEW 03.10.24 11:35 
в ответ alex445 03.10.24 09:25, Последний раз изменено 03.10.24 11:59 (AlexNek)
Ну явно же задача для ИИ

Блин, ну устал уже повторять, что нужно вначале самому хорошо разбираться в теме. Нужно знать, что именно спрашивать и понимать, что отвечает.

Ну вот выдали с десяток алгоритмов, а будут ли они с твоим классом изображений работать?


А так конечно, сам столько бы вариантов не перебрал. По крайней мере знаю, что уже точно не будет работать. И чему-то научился.


Пока вот ограничился только вертикальным скроллом и нашел относительно рабочий вариант. Пирамида изображений + сетка через окошко.

#3 
alex445 патриот03.10.24 12:10
NEW 03.10.24 12:10 
в ответ AlexNek 03.10.24 11:35
Блин, ну устал уже повторять, что нужно вначале самому хорошо разбираться в теме. Нужно знать, что именно спрашивать и понимать, что отвечает.

Мою мысль стали повторять, немного изменив, и выдают за свою собственную. ))


Ну вот выдали с десяток алгоритмов, а будут ли они с твоим классом изображений работать?

Какие алгоритмы, алё? Просто скармливаешь ему пачку картинок и говоришь, чтобы склеил на... И стучать кулаком по столу, чтобы побыстрее на..., а то вилку из розетки мол выдерну на... и кабзда этому интеллекту на...


вертикальным скроллом
Пирамида изображений
сетка через окошко

Какая скука. Так вы этих кнопкодавов бесполезных на ИИ не замените.


Это значит к требованиям знать всю ту байду, что сейчас на собесах спрашивают, добавят ещё и "уметь рамсить с ИИ", чтобы на работе был нормальный такой движ-париж, а не эти ваши постоянные переносы на следующий спринт.

#4 
AlexNek патриот03.10.24 12:20
AlexNek
NEW 03.10.24 12:20 
в ответ alex445 03.10.24 12:10
Мою мысль стали повторять, немного изменив

странно, когда вы успели ее присвоить? смущ


Просто скармливаешь ему пачку картинок и говоришь, чтобы склеил

сайтик мона?


добавят ещё

Добавят, добавят бебе

#5 
AlexNek патриот11.10.24 17:57
AlexNek
NEW 11.10.24 17:57 
в ответ AlexNek 30.09.24 17:56

Может, математик забежит. После анализа графика совпадений выяснилось, что имеются скриншоты с одним пиком и со многими.

Нужно только найти максимумы функции z=f(x,y) или для чисто вертикально совмещения z=f(y) за минимальное количество вызовов функции.

вот тут один пик и он в минусе по Х. Пока просто сетка с 0 по Y и затем пик по Х

#6 
alex445 патриот11.10.24 20:53
NEW 11.10.24 20:53 
в ответ AlexNek 11.10.24 17:57, Последний раз изменено 11.10.24 21:01 (alex445)

Чёт не понял, почему график совпадений какие-то линии, а не поверхность? Вы не всю площадь картинки сравниваете, а лишь в точках, образующих эту линию?


У вас функции конвергенции изображений не являются аналитическими, а скорее кусочно-заданными, потому искать там максимумы и минимумы с помощью матанализа нельзя. Тогда остаётся банальный и привычный программистам численный метод - перебор всех значений.

#7 
AlexNek патриот11.10.24 21:05
AlexNek
NEW 11.10.24 21:05 
в ответ alex445 11.10.24 20:53, Последний раз изменено 11.10.24 21:08 (AlexNek)
Вы не всю площадь картинки сравниваете,

Ну так в этом же и есть проблема — минимизировать количество сравнений. Что-то не могу найти, как выглядит вся поверхность. Но как ни странно форма кривой сохраняется и вдалеке от максимума.

Если бы была возможность сравнить всю картинку, так и проблемы и не было.


У вас функции конвергенции изображений не являются аналитическими,

откуда? есть две картинки сдвигаешь и сравниваешь. Хорошо хоть функцию сравнения нашел относительно быструю.

#8 
alex445 патриот11.10.24 21:13
NEW 11.10.24 21:13 
в ответ AlexNek 11.10.24 21:05, Последний раз изменено 11.10.24 21:15 (alex445)

Вы совмещаете разрезанное изображение, о котором заранее известно, что кусочки совпадают лишь краями? Или кусочки взяты произвольно и в некоторых могут быть повторяющиеся части картинки?


Если первый вариант, то всё проще - сравниваете на совпадение лишь границы. Т.е. всю площадь картинки и не надо сравнивать. Если кусочки прямоугольные, то ещё упрощается.

#9 
alex445 патриот11.10.24 21:14
NEW 11.10.24 21:14 
в ответ AlexNek 11.10.24 21:05, Последний раз изменено 11.10.24 21:14 (alex445)
У вас функции конвергенции изображений не являются аналитическими,
откуда? есть две картинки сдвигаешь и сравниваешь. Хорошо хоть функцию сравнения нашел относительно быструю.

Тогда только полный перебор по всем точкам, в которых хотите сравнить картинки. Т.е. вам надо оптимизировать алгоритм по местам сравнений.

#10 
AlexNek патриот11.10.24 21:52
AlexNek
NEW 11.10.24 21:52 
в ответ alex445 11.10.24 21:13

ну откройте эту страницу и скроллируйте, попутно делая скриншоты. Это самый простой вариант, который уже работает в полуавтоматическом режиме.

Проблема то, где именно пересекаются картинки. Но тут должен быть один максимум, так что попроще.

#11 
AlexNek патриот11.10.24 21:55
AlexNek
NEW 11.10.24 21:55 
в ответ alex445 11.10.24 21:14
Тогда только полный перебор по всем точкам, в которых хотите сравнить картинки.

нифига, слишком грубо.

#12 
MrSanders коренной житель11.10.24 22:13
NEW 11.10.24 22:13 
в ответ AlexNek 11.10.24 21:55

Ищи контрастные места. Контуры. Выделяй небольшой кусочек с контуром (что тоже не тривиально) и ищи его на большой картинке. Нашёл совпадение - проверяй.

#13 
AlexNek патриот11.10.24 22:20
AlexNek
NEW 11.10.24 22:20 
в ответ MrSanders 11.10.24 22:13, Последний раз изменено 11.10.24 22:44 (AlexNek)
Ищи контрастные места. Контуры

пробовал, OpenCV имеем спец. функцию для этого, для фоток, может, и работает для моих скриншотов нет. Там есть KeyPoint-ы и DMatch-и

MSE отлично сравнивает


Выделяй небольшой кусочек с контуром (что тоже не тривиально) и ищи его на большой картинке.

ну так в этом и проблема, быстро что найти. небольшой кусок фиг найдешь и ошибки очень большие.

#14 
AlexNek патриот11.10.24 22:40
AlexNek
NEW 11.10.24 22:40 
в ответ AlexNek 11.10.24 21:52

вот где проблема, самый максимум не годится. Там на картинке скругленные прямоугольники с текстом. И лучше всего совпадает низ одного прямоугольника с другим. А на самом деле совпадение на один прямоугольник выше. Глаз то всё видит, а комп ну никак :)

И в каждой новой серии картинок своя особая фигня. хммм

И это я забил на изменение по Х пока.

#15 
alex445 патриот12.10.24 08:02
NEW 12.10.24 08:02 
в ответ AlexNek 11.10.24 21:52, Последний раз изменено 12.10.24 08:04 (alex445)
ну откройте эту страницу и скроллируйте, попутно делая скриншоты. Это самый простой вариант, который уже работает в полуавтоматическом режиме.
Проблема то, где именно пересекаются картинки. Но тут должен быть один максимум, так что попроще.

Вам надо вашу реальную задачу описать, а не в общем отвлечённом виде. В общем виде задача решается полным перебором всех точек изображения. А оптимизации идут уже от задачи - скроллить картинку и склеивать потом, или собирать мозаику из кусочков - это разные задачи. И по сути, в первой надо оптимизировать процесс снятия скриншотов, а не склейки. Т.к. если скриншоты сняты оптимально, то ничего оптимизировать вообще не надо. А если случайным образом, т.е. каждый новый скриншот может содержать произвольное число пикселей вдоль скролла исходной картинки, то придётся придумывать разные анализы по цвету или статистике. Но если исходная картинка содержит не ограниченное число цветов, как скажем веб-страница без фотографий, а какое угодно, как скажем фотография, то точность обеспечит лишь полный перебор всех пикселей. Все остальные алгоритмы дадут погрешность и какой-то процент неправильных склеек. Но даже полный, но последовательный перебор пикселей не сработает, если исходная картинка имеет повторяющиеся паттерны (как частный случай - плошная однотонная заливка) по всей длине склейки.


Вобщем, все оптимизации идут после максимально полного описания задачи. А "на все случаи жизни" - только полный перебор с каким-то решением против повторяющихся паттернов.

#16 
alex445 патриот12.10.24 08:08
NEW 12.10.24 08:08 
в ответ AlexNek 11.10.24 22:40, Последний раз изменено 12.10.24 08:09 (alex445)

Такое ощущение, что вам шеф дал задачку "решить по-быстрому", на более-менее нормальное решение которой надо писать докторскую диссертацию и проводить долгие исследования. Ну, если нет готовых алгоритмов или софта для склеек. Люди, коллективы людей над подобными задачами годами бьются, получая огромные зарплаты и всё равно неуниверсальные и неоптимальные решения, а вы хотите с наскока и сразу в калашный ряд. Если получится, шеф конечно вас поблагодарит, что вы ему миллионы принесли, а вас пожурит "чё так долго возился?!". )))

#17 
alex445 патриот12.10.24 08:12
NEW 12.10.24 08:12 
в ответ AlexNek 11.10.24 22:40, Последний раз изменено 12.10.24 08:13 (alex445)

Вот вы всё графики какие-то анализируете. А у вас решена граничная задача, когда надо склеить сплошную однотонную заливку, сохраняя при этом площадь этой заливки как в исходном изображении? А методами анализа полученных кусочков картинки это решить невозможно - только зная, как проводилось снятие скриншотов и имея контроль над этим алгоритмом.

#18 
AlexNek патриот12.10.24 11:03
AlexNek
NEW 12.10.24 11:03 
в ответ alex445 12.10.24 08:02
Вам надо вашу реальную задачу описать

Для кого и для чего? И что изменится? Если просто Вам интересно, то к тому что есть можно добавить, что изображения идут один за другим и каждое последующее изображение должно иметь относительно большую область пересечения с предыдущим. И это всегда одна сессия. Ну и очень нежелательно иметь динамические части на картинке.


В общем виде задача решается полным перебором всех точек изображения

Заблуждение, которым тоже страдал смущ

Вот у вас два 3000х2000 скриншота, значит нужно 6 000 000 сравнений?


или собирать мозаику из кусочков

А кто где-то говорил о мозаике?


т.е. каждый новый скриншот может содержать произвольное число пикселей

Речь всегда идет об одном окне "просмотра"


в первой надо оптимизировать процесс снятия скриншотов

ну давайте идеи. Если одно маленькое ограничение - управлять скроллингом другого окна невозможно. Передвигать можно исключительно мышкой.

#19 
AlexNek патриот12.10.24 11:06
AlexNek
NEW 12.10.24 11:06 
в ответ alex445 12.10.24 08:08
Люди, коллективы людей над подобными задачами годами бьются...Такое ощущение, что вам шеф дал задачку "решить по-быстрому",

странности не замечаете? Ну и кто интересно один в команде решает свою задачу?


#20 
AlexNek патриот12.10.24 11:14
AlexNek
NEW 12.10.24 11:14 
в ответ alex445 12.10.24 08:12
А у вас решена граничная задача, когда надо склеить сплошную однотонную заливку

ну так решайте, кто же вам не даёт бебе


Вот вы всё графики какие-то анализируете

Очень удобная вещь, раньше сидишь и не понимаешь отчего не работает, в какую сторону рыть?

А так графики очень о многом говорят


#21 
alex445 патриот12.10.24 13:48
NEW 12.10.24 13:48 
в ответ AlexNek 12.10.24 11:03
В общем виде задача решается полным перебором всех точек изображения

Заблуждение, которым тоже страдал смущ

Вот у вас два 3000х2000 скриншота, значит нужно 6 000 000 сравнений?

#22 
alex445 патриот12.10.24 13:50
NEW 12.10.24 13:50 
в ответ AlexNek 12.10.24 11:03
ну давайте идеи. Если одно маленькое ограничение - управлять скроллингом другого окна невозможно. Передвигать можно исключительно мышкой.

Попробовать посылать в окно события скролла, и выяснить, на сколько пикселей прокручивается страница при этом?

#23 
AlexNek патриот12.10.24 14:34
AlexNek
NEW 12.10.24 14:34 
в ответ alex445 12.10.24 13:50
Попробовать посылать в окно события скролла

улыб ну нету окна со скроллом в понимании винды. Как и скролбара

#24 
Murr патриот12.10.24 19:04
Murr
NEW 12.10.24 19:04 
в ответ alex445 11.10.24 20:53

какие-то линии, а не поверхность?

-----

а что, в пространстве линий не бывает?

#25 
alex445 патриот12.10.24 21:37
NEW 12.10.24 21:37 
в ответ Murr 12.10.24 19:04

Вот я и спрашивал, почему он анализирует картинку вдоль какой-то кривой на этой картинке.

#26 
AlexNek патриот12.10.24 22:07
AlexNek
NEW 12.10.24 22:07 
в ответ alex445 12.10.24 21:37

Прямая - кратчайший путь из одной точки в другую спок

#27 
alex445 патриот13.10.24 06:24
NEW 13.10.24 06:24 
в ответ AlexNek 12.10.24 22:07, Последний раз изменено 13.10.24 06:24 (alex445)

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

#28 
AlexNek патриот13.10.24 12:13
AlexNek
NEW 13.10.24 12:13 
в ответ alex445 13.10.24 06:24
Может, я не разглядел тут прямую в проекции на плоскость х-у

естественно не разглядели, их то две бебе

вначале находим максимум по одной оси, потом по другой, параллельно обследуя пик. Как раз получаются две прямые и в точке пересечения небольшой бардачок.

Как обратно заработает, сделаю другую проекцию. А то отрицательные смещения и прозрачные места неправильно обрабатывал смущ

#29 
wasja-de знакомое лицо20.11.24 18:34
NEW 20.11.24 18:34 
в ответ AlexNek 30.09.24 17:56

а у вас скалировка и поворот разрешены? А затененность?


Если да, то сравнивать надо через особые точки - например те, у которых градиент цвета сильно большой. Ищите такие точки на одной картинке и на другой, и потом ищете как набор этих точек перемаппить один в другой. Гуглится все через edge detection and mapping.


Если сдвиги маленькие - надо делать так называемый optical flow - на пальцах там да - газодинамика для цвета, решаем задачу как если бы у вас цвета поплыли, на практике - тонны кода, желательно понимать хотя бы основы CFD и основы edge detection (с ним многие вещи делать проще).


Если поворотов нет, но только паттерны - ищем прямоугольничек в маленькой картинке и его Фурьем на большую множим. Вычислительная сложность не большая, работает довольно надежно. Если прямоугольничек сделать сложно, тогда или набор прямоугольничков, или в лоб. Можно иерархически - типа пиксели размазал и большими квадратиками нашел что-то и там дальше внутри ищешь поточнее.


Если есть возможность скормить в что-то готовое, лучше именно скормить, потому, что в ручную все это программировать или тырить по гитхабам и склеивать - можно застрелиться особенно если до этого этими задачами не занимался.

#30 
AlexNek патриот20.11.24 20:43
AlexNek
NEW 20.11.24 20:43 
в ответ wasja-de 20.11.24 18:34
а у вас скалировка и поворот разрешены? А затененность?

Всё проще. Если грубо, то есть сторонняя программа, у которой имеется большая картинка, но она эту картинку может показывать только частично. Картинки могут быть совершенно разных типов от простейших цветных прямоугольников с текстом или просто текст, до типа гоогле мапа со спутника. Могут быть и более сложные варианты, но пока их не рассматриваем.

Часть картинки которую видно можно скопировать, затем отскроллировать и опять скопировать. Направление скроллирования тоже пока ограничил, сверху-вниз и слева-направо.

Таким образом получаем серию скриншотов - задача собрать из них большую картинку. Если бы можно было скроллить автоматом, то проблемы не было бы вообще.


edge detection

Пробовал уже. В OpenCvSharp4 всё уже есть. Громаднейшие погрешности и часто никаких границ не определяется где надо. Это скорее всё для фотографии.

Единственное, что работает, это MSE с повышенной чувствительностью (но из-за чувствительности и медленно). Просто сдвигаем картинку как игральные карты по одной оси вначале, а затем по другой. Сдвиг не в лоб по пикселу смущ


ищем прямоугольничек в маленькой картинке и его Фурьем на большую множим

именно так не делал, но что-то подобное тоже было. Есть в OpenCvSharp4 подобная функция - найти маленькую часть в большой.


Можно иерархически - типа пиксели размазал и большими квадратиками нашел что-то и там дальше внутри ищешь поточнее.

Да, именно так и делаю. Пирамида изображений + грубый поиск + точный поиск по месту. С точным поиском лезем наверх по пирамиде.


Если есть возможность скормить в что-то готовое

OpenCvSharp4 и ImageSharp либы есть. Обе пробовал.

Пока работает только в полуавтоматическом режиме, так как 100% совмещение удается не всегда.

В Snagit есть подобная функция, но работает она очень плохо. И теперь стало понятно почему.


до этого этими задачами не занимался.

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

Но зато теперь есть что-то, что как-то работает. Потихоньку можно возвращаться и улучать.


Спасибо

#31 
kukka местный житель20.11.24 21:56
kukka
NEW 20.11.24 21:56 
в ответ AlexNek 20.11.24 20:43

А вы кто, дизайнер по квартирам? Там точно измерения идут по стенам или кривая опять наверх пошла?! Стетоскопом точно не измерить, зато дом у него отменный с ремонтом в прошлом тыщ на 100000.


Я тестирую наоборот посмотрим какой оборот придёт через четверть года обещали пи на несчастных ID шниках...туда повыбираем буковки, а потом попробуем написать большую историю про кота Базилио и его компаньона слепоглазого и летающие станции по производству солярки. ПСС...тише тише пинг уже на взлете.


Блин жалко конечно что МС все таки примитив поставил в свою модель.


Кстати куда запропастилась фиалка якобы её забрала какая-то Сандра с Германии и нашли её в Мега долине какого-то авиапрома в российском городе С.


#32 
AlexNek патриот20.11.24 23:17
AlexNek
NEW 20.11.24 23:17 
в ответ kukka 20.11.24 21:56
Там точно измерения идут по стенам или кривая опять наверх пошла?!

Ну, я просто не знаю что с вами делать смущ

Вы живете в каком-то своём мире и выдаёте отрывки из него же, которые понять просто невозможно.

Проведите эксперимент со своими знакомыми, дайте прочитать написанный вами текст, а после засекайте время сколько нужно будет им еще дополнительных пояснений что бы они поняли написанное.

#33 
wasja-de знакомое лицо21.11.24 00:41
NEW 21.11.24 00:41 
в ответ AlexNek 20.11.24 20:43
Единственное, что работает, это MSE с повышенной чувствительностью (но из-за чувствительности и медленно).

это вам еще повезло. На произвольных картинках у меня с сотню всяких весовых параметров как детектировать, но угадать никогда не получается. Но угадывать-то надо, и я могу это только для видеоряда - вначале на первых фреймах барахтаешся и у тебя ничего не получается, но, постепенно, можно параметры от фрейма к фрейму так науськать, что начинает получаться. А когда получается, можно обратно назад на предыдущие фреймы распространить. Если картинка на фреймах кардинально изменилась - все заново. Надеюсь Вам такое извращение не потребуется :)

#34 
wasja-de знакомое лицо21.11.24 00:45
NEW 21.11.24 00:45 
в ответ AlexNek 20.11.24 23:17
Ну, я просто не знаю что с вами делать смущ...

и как у Вас терпенья хватило так вежливо ему/ей ответить. Вот в других формах (не на этой платформе) обычно все просто, там или есть кнопка пожаловаться, или разрешено матом посылать.


#35 
kukka местный житель21.11.24 04:23
kukka
NEW 21.11.24 04:23 
в ответ wasja-de 20.11.24 18:34

И я про что лучше скормить. А СМД чем не нравится??

#36 
AlexNek патриот21.11.24 17:58
AlexNek
NEW 21.11.24 17:58 
в ответ wasja-de 21.11.24 00:41, Последний раз изменено 21.11.24 20:57 (AlexNek)
это вам еще повезло.

ну просто заметил, что есть более менее адекватная реакция с нормальной чувствительностью, а потом пришла идея увеличить чувствительность.

Но самое удобное - это 3д график, сразу всё видно. На некоторых изображениях есть несколько максимумов, из которых только один правильный. Из за этого и бинарный поиск не канает. хммм

У вас конечно похуже, могу только посочувствовать.

Но получается никаких "волшебных" алгоритмов по незнанию не пропустил - нет таких.

#37 
AlexNek патриот21.11.24 18:01
AlexNek
NEW 21.11.24 18:01 
в ответ wasja-de 21.11.24 00:45
и как у Вас терпенья хватило

было где тренироваться смущ

Всегда есть какая-то надежда на улучшение. Ну а не получится так не получится, по крайней мере пробовал.

#38 
wasja-de знакомое лицо21.11.24 19:24
NEW 21.11.24 19:24 
в ответ AlexNek 21.11.24 17:58
Но получается никаких "волшебных" алгоритмов по незнанию на пропустил - нет таких.

да, верно. Волшебство начинается, когда у вас есть 2Д изображение, вернее видеоряд, а вам надо на нем восстановить 3Д, а это 3Д еще обычно движется. Типа ты со всей дури бежишь за кем-то, держа его в видимости своей камеры, а нужно что-то определить у бегущего или его идентифицировать. Вот там пока не все устаканилось, даже международные конкурсы проводятся у кого лучше получится :)

#39 
AlexNek патриот21.11.24 21:02
AlexNek
NEW 21.11.24 21:02 
в ответ wasja-de 21.11.24 19:24
а вам надо на нем восстановить 3Д

Да уж полный фигвам особенно когда в реальном времени еще и надо.


Мне то всего лишь одинаковые части найти в двух картинках и то оказалось непросто.

#40 
1 2 все