
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.143.16] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Поясню. Картинка большого размера создана путем повторения некоторой области. Часто говорят "замостили". Задача по картинке этого большого размера найти (исходную область или минимальную по площади), которую можно использовать для воссоздания этой большой картинки. Приведу один из примеров большой картинки: Прикреплённая картинка
из неё нужно получить вот такую: Прикреплённая картинка
Но, если внимательно взглянуть на последнюю картинку, можно предположить, что для создания большой картинки вторая картинка немного избыточна (можно выбрать из нее и меньшую область, не обязательно квадратную - это предположение). Да, мы говорим о картинках, так проще. Но для алгоритма проще рассматривать матрицы разных размеров, в которых ячейки содержат просто численный код цвета (битность, сиречь "глубина" тут пока не важна). В общем, хелп! |
![]() |
Сообщ.
#2
,
|
|
Цитата Majestio @ можно выбрать из нее и меньшую область, не обязательно квадратную - это предположение Можно сразу вдвое урезать ширину, будет прямоугольник, а в пределе минимизации - параллелограмм. Это всё не сложно найти автоматически, а вот, если наклонить оси, станет значительно сложнее: Прикреплённая картинка
|
Сообщ.
#3
,
|
|
|
Представленную большую картинку я получил путем склеивания маленьких 9 раз (в 3x3). Но подозреваю, что большую картинку можно получить и из более мелкого "штампа", ибо и на изначальной маленькой картинке видны повторяющиеся фигуры ...
Mikle, но мне ващета алгоритм поиска нужен ![]() |
Сообщ.
#5
,
|
|
|
Цитата Profi @ Вот тут описан интересный подход. Почитал. Там описан вопрос нахождения Расстояния Евклида. Практической пользы этого для решения моего вопроса я не наблюдаю ![]() |
![]() |
Сообщ.
#6
,
|
|
Цитата Majestio @ мне ващета алгоритм поиска нужен Так я и спрашиваю, должен алгоритм работать на таких картинках, как я показал, или только на простых, как выше? |
Сообщ.
#7
,
|
|
|
Цитата Mikle @ Так я и спрашиваю, должен алгоритм работать на таких картинках, как я показал, или только на простых, как выше? Должен работать на любых картинках, которые можно получить путем повторения прямоугольной картинки, которую и нужно найти. Требование только одно, найденная картинка должна быть минимальной площади, если найдена не одна, а несколько картинок для повторения. Пример с камуфляжем - только пример. |
![]() |
Сообщ.
#8
,
|
|
Цитата Majestio @ Должен работать на любых картинках, которые можно получить путем повторения прямоугольной картинки Так моя картинка подходит под эти условия? Поясню. Она получается повторением прямоугольной картинки, но на холст картинка кладётся под углом к сканлиниям. Ещё важные уточнения: Алгоритм должен допускать некоторую погрешность (например, от сжатия JPG)? А как на счёт нецелых размеров тайла? Это, например, если взять холст 1024*1024 и замостить его картинкой 64*64, а потом холст смасштабировать (возможно, с фильтрацией) до размера 777*777. Размер тайла получится 48.5625. Или картинка, на которой нужно искать тайлы, всегда содержит их целого (в пикселях) размера? И в первом сообщении написано: Цитата Majestio @ можно выбрать из нее и меньшую область, не обязательно квадратную - это предположение Что противоречит новому условию "Она получается повторением прямоугольной картинки". Не зря говорят: "правильное формулирование задачи - это половина её решения". |
Сообщ.
#9
,
|
|
|
ADD: У мне уже примерно сложился возможный алгоритм, увы - перебором:
ADD-2: Нет-нет-нет - ищем строго слева-сверху! Нам же не нужно искать именно исходный тайтл, из которого сделали фон (а вдруг там замостили, а потом обрезали?). Нам нужно найти тайтл, которым можно получить фон. Добавлено Цитата Mikle @ но на холст картинка кладётся под углом к сканлиниям Нет, под углом класть нельзя. Только заполнять строго вертикальными прямоугольниками. Собственно - искомыми. Добавлено Цитата Mikle @ А как на счёт нецелых размеров тайла? Это, например, если взять холст 1024*1024 и замостить его картинкой 64*64, а потом холст смасштабировать (возможно, с фильтрацией) до размера 777*777. Размер тайла получится 48.5625. Или картинка, на которой нужно искать тайлы, всегда содержит их целого (в пикселях) размера? В масштабированной картинке искать штамп (тайтл) по целым пикселям. Добавлено Цитата Mikle @ Что противоречит новому условию "Она получается повторением прямоугольной картинки". Не зря говорят: "правильное формулирование задачи - это половина её решения". Тут нет противоречия. Допустим, мы замостили фон квадратной картинкой. Но если эта исходная картинка сама может "дробиться"? Пример: Большая картинка создана из штампа "3x3". Нужный нам штамп тут будет "1x1" или "3x1" или "3x2" ... (если с помощью его можно получить 3x3) |
![]() |
Сообщ.
#10
,
|
|
Цитата Majestio @ Большая картинка создана из штампа "3x3". Нужный нам штамп тут будет "1x1" или "3x1" или "3x2" ... (если с помощью его можно получить 3x3) Это всё прямоугольники, а в первой картинке можно предельно уменьшить до параллелограмма. Цитата Majestio @ В масштабированной картинке искать штамп (тайтл) по целым пикселям. То есть не находить... |
Сообщ.
#11
,
|
|
|
Цитата Mikle @ То есть не находить... Да, не находить. Потому как при масштабировании края картинки искажаются не так, как в середине. Но можно попытаться найти "штамп", если сузить границы поиска в большой картинки по ширине и высоте на пару-тройку пикселей. Собственно на размер смазывания при уменьшении. Но это вообще не наш вопрос. Если картинка после модификаций не может быть воспроизведена тайлами, то и искать нечего. Цитата Mikle @ Это всё прямоугольники, а в первой картинке можно предельно уменьшить до параллелограмма. Мы договорились - только и строго прямоугольники. |
![]() |
Сообщ.
#12
,
|
|
Цитата Majestio @ Там описан вопрос нахождения Расстояния Евклида. Ну, надо читать чуть дальше заголовка. Вот пример, как этот алгоритм использовать. |
Сообщ.
#13
,
|
|
|
Цитата Profi @ Ну, надо читать чуть дальше заголовка. Вот пример, как этот алгоритм использовать. Ну тут же решается совершенно другая задача - найти заранее известные мелкие изображения в большом. А у меня задача иная - найти (определить) мелкие изображения, которые, собственно, заранее не известны. |
![]() |
Сообщ.
#14
,
|
|
Ну, так можно адоптировать:
1. Берем кусок, например 1/4. 2. Пытаемся найти внутри него хотя бы одну повторяющуюся область. 3. Нашли - идем на шаг один. 4. Нет - смотрим, не совпадает ли область с другим куском с предыдущего шага. 5. Да - мы нашли искомый. 6. Нет (такое возможно, если исходная картинка была чуть обрезана) - начинаем чуть увеличивать найденную область и искать совпадения. |
Сообщ.
#15
,
|
|
|
Цитата Profi @ Пытаемся найти внутри него хотя бы одну повторяющуюся область. Не нужно всех шагов - вот этот шаг №2 нужно реализовать. Это и будет ответом в первом приближении. |
Сообщ.
#16
,
|
|
|
Цитата Profi @ 1. Берем кусок, например 1/4. И да - предварительно дробить картинку на области смысла не имеет, потому как вид повторения может быть ну очень разный. Примеры: 1) Тайтл занимает 4/5 по ширине от большой картинки ⇒ при делении ничего не найдём 2) Большая картинка представляет собой "шахматную доску", где ячейка - пиксель. Искомый тайтл 2x2, тогда какой смысл в делении, к примеру, 4096 на 4? Не сильно легче станет, имхо. |
![]() |
Сообщ.
#17
,
|
|
Решение - обычный брутфорс, просто в реализации, но не очень эффективно по быстродействию.
Накладывать картинку саму на себя субтрактивно, сдвигая попиксельно вниз до тех пор, пока не получим на пересечении нулевой результат, так находим DY, потом аналогично сдвигом вправо находим DX, тут уже можно для оптимизации уменьшить картинку по вертикали до найдённой величины DY. Неоднозначно тут только то, что мы принимаем за нулевой результат, как считаем допуск. |
Сообщ.
#18
,
|
|
|
Цитата Mikle @ Решение - обычный брутфорс, просто в реализации, но не очень эффективно по быстродействию. Накладывать картинку саму на себя субтрактивно, сдвигая попиксельно вниз до тех пор, пока не получим на пересечении нулевой результат, так находим DY, потом аналогично сдвигом вправо находим DX, тут уже можно для оптимизации уменьшить картинку по вертикали до найдённой величины DY. Неоднозначно тут только то, что мы принимаем за нулевой результат, как считаем допуск. Все верно! Я уже там в середине обсуждения внес правки в "свой вариант". Да, перебором и с верхнего левого угла. |
![]() |
Сообщ.
#19
,
|
|
По-моему вы пытаетесь переоткрыть метод фрактальной упаковки изображений. Ну, в неком лайтовом варианте. Не?
|
Сообщ.
#20
,
|
|
|
Цитата Qraizer @ Ну, в неком лайтовом варианте. Не? Наверное всё же не ![]() |
Сообщ.
#21
,
|
|
|
Попробуй посчитать двумерную автокорреляцию. Основные максимумы соответствуют сдвигам и соответственно размеру структурного элемента, однако интерпретация может быть непростой. Возможно, изображение придётся перевести в диапазон -1..1
Навскидку хорошей ссылки не нашёл: https://www.nanoindustry.su/files/article_p...cle_3308_33.pdf |
Сообщ.
#22
,
|
|
|
Цитата MBo @ Попробуй посчитать двумерную автокорреляцию. Основные максимумы соответствуют сдвигам и соответственно размеру структурного элемента, однако интерпретация может быть непростой. Возможно, изображение придётся перевести в диапазон -1..1 Навскидку хорошей ссылки не нашёл: https://www.nanoindustry.su/files/article_p...cle_3308_33.pdf Для моей задачи это не нужно, решение будет гораздо проще. Но ... тема отличная. И я знаю где ее применение возможно будет супер! Простой пример. Есть фон из повторяющихся элементов, который, например, на последнем этапе обработали градиентом освещенности. По факту структура с повторениями, но выделить в ней тайтл не представляется возможным, ибо все "портит" градиент. Предлагаемой тобою методикой возможно получится "убрать" градиент, а потом уже искать нужный тайтл. Ну это как предположение. |