Алгоритмы совмещения изображений
Даже не изображений, а проще скриншотов.
Есть у нас большая картинка
|==================| |====| |====| |====| ...
Но видна она через маленькое окно. И вот набираем таких картинок, а после их нужно объединить
часть 1
часть 2
Алгоритмов полно, но все они "работают" для разных типов изображений. Многие на этом тесте только вертикально скролла, обламываются, так как фон "мешает"
Разные сетки страшно зависят от шага и т.п.
А хочется иметь что-то одно, чтобы нелажало часто.
Видимо, нужна определенная комбинация, вот весь вопрос какая, пока не находится. Что посоветуете?
Ну явно же задача для ИИ
Блин, ну устал уже повторять, что нужно вначале самому хорошо разбираться в теме. Нужно знать, что именно спрашивать и понимать, что отвечает.
Ну вот выдали с десяток алгоритмов, а будут ли они с твоим классом изображений работать?
А так конечно, сам столько бы вариантов не перебрал. По крайней мере знаю, что уже точно не будет работать. И чему-то научился.
Пока вот ограничился только вертикальным скроллом и нашел относительно рабочий вариант. Пирамида изображений + сетка через окошко.
Блин, ну устал уже повторять, что нужно вначале самому хорошо разбираться в теме. Нужно знать, что именно спрашивать и понимать, что отвечает.
Мою мысль стали повторять, немного изменив, и выдают за свою собственную. ))
Ну вот выдали с десяток алгоритмов, а будут ли они с твоим классом изображений работать?
Какие алгоритмы, алё? Просто скармливаешь ему пачку картинок и говоришь, чтобы склеил на... И стучать кулаком по столу, чтобы побыстрее на..., а то вилку из розетки мол выдерну на... и кабзда этому интеллекту на...
вертикальным скроллом
Пирамида изображений
сетка через окошко
Какая скука. Так вы этих кнопкодавов бесполезных на ИИ не замените.
Это значит к требованиям знать всю ту байду, что сейчас на собесах спрашивают, добавят ещё и "уметь рамсить с ИИ", чтобы на работе был нормальный такой движ-париж, а не эти ваши постоянные переносы на следующий спринт.
Может, математик забежит. После анализа графика совпадений выяснилось, что имеются скриншоты с одним пиком и со многими.
Нужно только найти максимумы функции z=f(x,y) или для чисто вертикально совмещения z=f(y) за минимальное количество вызовов функции.
вот тут один пик и он в минусе по Х. Пока просто сетка с 0 по Y и затем пик по Х
Чёт не понял, почему график совпадений какие-то линии, а не поверхность? Вы не всю площадь картинки сравниваете, а лишь в точках, образующих эту линию?
У вас функции конвергенции изображений не являются аналитическими, а скорее кусочно-заданными, потому искать там максимумы и минимумы с помощью матанализа нельзя. Тогда остаётся банальный и привычный программистам численный метод - перебор всех значений.
Вы не всю площадь картинки сравниваете,
Ну так в этом же и есть проблема — минимизировать количество сравнений. Что-то не могу найти, как выглядит вся поверхность. Но как ни странно форма кривой сохраняется и вдалеке от максимума.
Если бы была возможность сравнить всю картинку, так и проблемы и не было.
У вас функции конвергенции изображений не являются аналитическими,
откуда? есть две картинки сдвигаешь и сравниваешь. Хорошо хоть функцию сравнения нашел относительно быструю.
Вы совмещаете разрезанное изображение, о котором заранее известно, что кусочки совпадают лишь краями? Или кусочки взяты произвольно и в некоторых могут быть повторяющиеся части картинки?
Если первый вариант, то всё проще - сравниваете на совпадение лишь границы. Т.е. всю площадь картинки и не надо сравнивать. Если кусочки прямоугольные, то ещё упрощается.
У вас функции конвергенции изображений не являются аналитическими,откуда? есть две картинки сдвигаешь и сравниваешь. Хорошо хоть функцию сравнения нашел относительно быструю.
Тогда только полный перебор по всем точкам, в которых хотите сравнить картинки. Т.е. вам надо оптимизировать алгоритм по местам сравнений.
Ищи контрастные места. Контуры
пробовал, OpenCV имеем спец. функцию для этого, для фоток, может, и работает для моих скриншотов нет. Там есть KeyPoint-ы и DMatch-и
MSE отлично сравнивает
Выделяй небольшой кусочек с контуром (что тоже не тривиально) и ищи его на большой картинке.
ну так в этом и проблема, быстро что найти. небольшой кусок фиг найдешь и ошибки очень большие.
вот где проблема, самый максимум не годится. Там на картинке скругленные прямоугольники с текстом. И лучше всего совпадает низ одного прямоугольника с другим. А на самом деле совпадение на один прямоугольник выше. Глаз то всё видит, а комп ну никак :)
И в каждой новой серии картинок своя особая фигня.
И это я забил на изменение по Х пока.
ну откройте эту страницу и скроллируйте, попутно делая скриншоты. Это самый простой вариант, который уже работает в полуавтоматическом режиме.
Проблема то, где именно пересекаются картинки. Но тут должен быть один максимум, так что попроще.
Вам надо вашу реальную задачу описать, а не в общем отвлечённом виде. В общем виде задача решается полным перебором всех точек изображения. А оптимизации идут уже от задачи - скроллить картинку и склеивать потом, или собирать мозаику из кусочков - это разные задачи. И по сути, в первой надо оптимизировать процесс снятия скриншотов, а не склейки. Т.к. если скриншоты сняты оптимально, то ничего оптимизировать вообще не надо. А если случайным образом, т.е. каждый новый скриншот может содержать произвольное число пикселей вдоль скролла исходной картинки, то придётся придумывать разные анализы по цвету или статистике. Но если исходная картинка содержит не ограниченное число цветов, как скажем веб-страница без фотографий, а какое угодно, как скажем фотография, то точность обеспечит лишь полный перебор всех пикселей. Все остальные алгоритмы дадут погрешность и какой-то процент неправильных склеек. Но даже полный, но последовательный перебор пикселей не сработает, если исходная картинка имеет повторяющиеся паттерны (как частный случай - плошная однотонная заливка) по всей длине склейки.
Вобщем, все оптимизации идут после максимально полного описания задачи. А "на все случаи жизни" - только полный перебор с каким-то решением против повторяющихся паттернов.
Такое ощущение, что вам шеф дал задачку "решить по-быстрому", на более-менее нормальное решение которой надо писать докторскую диссертацию и проводить долгие исследования. Ну, если нет готовых алгоритмов или софта для склеек. Люди, коллективы людей над подобными задачами годами бьются, получая огромные зарплаты и всё равно неуниверсальные и неоптимальные решения, а вы хотите с наскока и сразу в калашный ряд. Если получится, шеф конечно вас поблагодарит, что вы ему миллионы принесли, а вас пожурит "чё так долго возился?!". )))
Вот вы всё графики какие-то анализируете. А у вас решена граничная задача, когда надо склеить сплошную однотонную заливку, сохраняя при этом площадь этой заливки как в исходном изображении? А методами анализа полученных кусочков картинки это решить невозможно - только зная, как проводилось снятие скриншотов и имея контроль над этим алгоритмом.
Вам надо вашу реальную задачу описать
Для кого и для чего? И что изменится? Если просто Вам интересно, то к тому что есть можно добавить, что изображения идут один за другим и каждое последующее изображение должно иметь относительно большую область пересечения с предыдущим. И это всегда одна сессия. Ну и очень нежелательно иметь динамические части на картинке.
В общем виде задача решается полным перебором всех точек изображения
Заблуждение, которым тоже страдал
Вот у вас два 3000х2000 скриншота, значит нужно 6 000 000 сравнений?
или собирать мозаику из кусочков
А кто где-то говорил о мозаике?
т.е. каждый новый скриншот может содержать произвольное число пикселей
Речь всегда идет об одном окне "просмотра"
в первой надо оптимизировать процесс снятия скриншотов
ну давайте идеи. Если одно маленькое ограничение - управлять скроллингом другого окна невозможно. Передвигать можно исключительно мышкой.
А у вас решена граничная задача, когда надо склеить сплошную однотонную заливку
ну так решайте, кто же вам не даёт
Вот вы всё графики какие-то анализируете
Очень удобная вещь, раньше сидишь и не понимаешь отчего не работает, в какую сторону рыть?
А так графики очень о многом говорят
ну давайте идеи. Если одно маленькое ограничение - управлять скроллингом другого окна невозможно. Передвигать можно исключительно мышкой.
Попробовать посылать в окно события скролла, и выяснить, на сколько пикселей прокручивается страница при этом?
Может, я не разглядел тут прямую в проекции на плоскость х-у
естественно не разглядели, их то две
вначале находим максимум по одной оси, потом по другой, параллельно обследуя пик. Как раз получаются две прямые и в точке пересечения небольшой бардачок.
Как обратно заработает, сделаю другую проекцию. А то отрицательные смещения и прозрачные места неправильно обрабатывал
а у вас скалировка и поворот разрешены? А затененность?
Если да, то сравнивать надо через особые точки - например те, у которых градиент цвета сильно большой. Ищите такие точки на одной картинке и на другой, и потом ищете как набор этих точек перемаппить один в другой. Гуглится все через edge detection and mapping.
Если сдвиги маленькие - надо делать так называемый optical flow - на пальцах там да - газодинамика для цвета, решаем задачу как если бы у вас цвета поплыли, на практике - тонны кода, желательно понимать хотя бы основы CFD и основы edge detection (с ним многие вещи делать проще).
Если поворотов нет, но только паттерны - ищем прямоугольничек в маленькой картинке и его Фурьем на большую множим. Вычислительная сложность не большая, работает довольно надежно. Если прямоугольничек сделать сложно, тогда или набор прямоугольничков, или в лоб. Можно иерархически - типа пиксели размазал и большими квадратиками нашел что-то и там дальше внутри ищешь поточнее.
Если есть возможность скормить в что-то готовое, лучше именно скормить, потому, что в ручную все это программировать или тырить по гитхабам и склеивать - можно застрелиться особенно если до этого этими задачами не занимался.
а у вас скалировка и поворот разрешены? А затененность?
Всё проще. Если грубо, то есть сторонняя программа, у которой имеется большая картинка, но она эту картинку может показывать только частично. Картинки могут быть совершенно разных типов от простейших цветных прямоугольников с текстом или просто текст, до типа гоогле мапа со спутника. Могут быть и более сложные варианты, но пока их не рассматриваем.
Часть картинки которую видно можно скопировать, затем отскроллировать и опять скопировать. Направление скроллирования тоже пока ограничил, сверху-вниз и слева-направо.
Таким образом получаем серию скриншотов - задача собрать из них большую картинку. Если бы можно было скроллить автоматом, то проблемы не было бы вообще.
edge detection
Пробовал уже. В OpenCvSharp4 всё уже есть. Громаднейшие погрешности и часто никаких границ не определяется где надо. Это скорее всё для фотографии.
Единственное, что работает, это MSE с повышенной чувствительностью (но из-за чувствительности и медленно). Просто сдвигаем картинку как игральные карты по одной оси вначале, а затем по другой. Сдвиг не в лоб по пикселу
ищем прямоугольничек в маленькой картинке и его Фурьем на большую множим
именно так не делал, но что-то подобное тоже было. Есть в OpenCvSharp4 подобная функция - найти маленькую часть в большой.
Можно иерархически - типа пиксели размазал и большими квадратиками нашел что-то и там дальше внутри ищешь поточнее.
Да, именно так и делаю. Пирамида изображений + грубый поиск + точный поиск по месту. С точным поиском лезем наверх по пирамиде.
Если есть возможность скормить в что-то готовое
OpenCvSharp4 и ImageSharp либы есть. Обе пробовал.
Пока работает только в полуавтоматическом режиме, так как 100% совмещение удается не всегда.
В Snagit есть подобная функция, но работает она очень плохо. И теперь стало понятно почему.
до этого этими задачами не занимался.
совершенно не интересовало, не нужно было. Да и то, искал задачу для теста ИИ и решил выбрать эту. Самостоятельно всё бы не перепробовал.
Но зато теперь есть что-то, что как-то работает. Потихоньку можно возвращаться и улучать.
Спасибо
А вы кто, дизайнер по квартирам? Там точно измерения идут по стенам или кривая опять наверх пошла?! Стетоскопом точно не измерить, зато дом у него отменный с ремонтом в прошлом тыщ на 100000.
Я тестирую наоборот посмотрим какой оборот придёт через четверть года обещали пи на несчастных ID шниках...туда повыбираем буковки, а потом попробуем написать большую историю про кота Базилио и его компаньона слепоглазого и летающие станции по производству солярки. ПСС...тише тише пинг уже на взлете.
Блин жалко конечно что МС все таки примитив поставил в свою модель.
Кстати куда запропастилась фиалка якобы её забрала какая-то Сандра с Германии и нашли её в Мега долине какого-то авиапрома в российском городе С.
Там точно измерения идут по стенам или кривая опять наверх пошла?!
Ну, я просто не знаю что с вами делать
Вы живете в каком-то своём мире и выдаёте отрывки из него же, которые понять просто невозможно.
Проведите эксперимент со своими знакомыми, дайте прочитать написанный вами текст, а после засекайте время сколько нужно будет им еще дополнительных пояснений что бы они поняли написанное.
Единственное, что работает, это MSE с повышенной чувствительностью (но из-за чувствительности и медленно).
это вам еще повезло. На произвольных картинках у меня с сотню всяких весовых параметров как детектировать, но угадать никогда не получается. Но угадывать-то надо, и я могу это только для видеоряда - вначале на первых фреймах барахтаешся и у тебя ничего не получается, но, постепенно, можно параметры от фрейма к фрейму так науськать, что начинает получаться. А когда получается, можно обратно назад на предыдущие фреймы распространить. Если картинка на фреймах кардинально изменилась - все заново. Надеюсь Вам такое извращение не потребуется :)
это вам еще повезло.
ну просто заметил, что есть более менее адекватная реакция с нормальной чувствительностью, а потом пришла идея увеличить чувствительность.
Но самое удобное - это 3д график, сразу всё видно. На некоторых изображениях есть несколько максимумов, из которых только один правильный. Из за этого и бинарный поиск не канает.
У вас конечно похуже, могу только посочувствовать.
Но получается никаких "волшебных" алгоритмов по незнанию не пропустил - нет таких.
Но получается никаких "волшебных" алгоритмов по незнанию на пропустил - нет таких.
да, верно. Волшебство начинается, когда у вас есть 2Д изображение, вернее видеоряд, а вам надо на нем восстановить 3Д, а это 3Д еще обычно движется. Типа ты со всей дури бежишь за кем-то, держа его в видимости своей камеры, а нужно что-то определить у бегущего или его идентифицировать. Вот там пока не все устаканилось, даже международные конкурсы проводятся у кого лучше получится :)