Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Построение линии длины изображения / 17 сообщений из 17, страница 1 из 1
19.03.2011, 12:23
    #37173417
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Всем доброго времени суток!
Вопрос следующий:

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

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

Контур у меня есть. Никак не могу придумать, как можно произвести сравнение координат текущей точки со всеми координатами точек контура и выявить максимальные координаты.

Буду рад Вашим советам.
...
Рейтинг: 0 / 0
19.03.2011, 12:49
    #37173434
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Strelok_33Для того, чтобы найти координаты первой точки, я прохожу циклом всю картинку и когда встречаю пиксель черного цвета, то запоминаю его координаты. С этим вроде проблем нет.
А разве первая точка может быть внутри изображения? Максимально длинный отрезок наверное же обеими точками на контуре будет.

авторКонтур у меня есть. Никак не могу придумать, как можно произвести сравнение координат текущей точки со всеми координатами точек контура
В чем собственно проблема? Контур есть - перебери все его точки.
...
Рейтинг: 0 / 0
19.03.2011, 13:03
    #37173451
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Edd.DragonА разве первая точка может быть внутри изображения? Максимально длинный отрезок наверное же обеими точками на контуре будет.

Ну к примеру у нас есть на белом фоне некий объект черного цвета. Вот для этого объекта и будем находить линию длины. Естественно мы по двум точкам будем строить отрезок.


Edd.DragonВ чем собственно проблема? Контур есть - перебери все его точки.
Вот я что-то не могу придумать, каким образом можно все точки контура перебрать. И сравнить потом их координаты с начальной точкой.
...
Рейтинг: 0 / 0
19.03.2011, 13:07
    #37173459
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Strelok_33Ну к примеру у нас есть на белом фоне некий объект черного цвета. Вот для этого объекта и будем находить линию длины. Естественно мы по двум точкам будем строить отрезок.

Ну так а зачем внутренние то точки перебирать? Нас интересует отрезок максимкальной длины? Такой отрезок обязательно обеими точками ляжет на контур. Любой отрезок проведенный не с контура, а изнутри рисунка не окажется максимально длинным.

авторВот я что-то не могу придумать, каким образом можно все точки контура перебрать.
Естественно это зависит от того, как у тебя контур хранится.
...
Рейтинг: 0 / 0
19.03.2011, 13:21
    #37173473
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Edd.DragonНу так а зачем внутренние то точки перебирать? Нас интересует отрезок максимкальной длины? Такой отрезок обязательно обеими точками ляжет на контур. Любой отрезок проведенный не с контура, а изнутри рисунка не окажется максимально длинным.

Совершенно согласен.

Edd.DragonЕстественно это зависит от того, как у тебя контур хранится.
Контур планируется хранить в виде матрицы в стрингриде. Не собираюсь утверждать, что это наиболее рациональный способ, но так нагляднее. Фоновый пиксель принимает значение "0", не фоновый - "255". То есть каким-либо образом надо будет обойти все ячейки, которые содержат число 255 и сравнить координаты каждой ячейки с точкой начала обхода контура. Тут же при обходе надо будет учитывать некоторую маску, с помощью которой мы будем обходить контур и проверять, что следующий пиксель является пикселем контура, а не фоновым.
...
Рейтинг: 0 / 0
19.03.2011, 13:37
    #37173481
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
авторФоновый пиксель принимает значение "0", не фоновый - "255"
Наоборот надо бы. Черный обычно - 0, а белый - 255. Потом путаница может возникнуть или необходимость менять местами при каких-либо операциях. Но в принципе, без разницы.

1. Я так понимаю изображения мааааленькие, если будете для наглядности их в стринг-гриде выводить (1 пиксель = 1 ячейка)?

2. Стринггрид - это средство вывода, а не средство хранения. Хранить картинку/контур в таком виде надо не в гриде, а в обычном массиве двумерном. Ну а дальше - выводить ее на экран как удобно. Хоть в грид заносить значения из массива, хоть на канве рисовать (один пиксель например квадратом 3х3). Хоть оба способа одновременно.

3. Если контур не хранится в виде одномерного массива точек, а хранится в виде картинки (матрицы), то "черная" точка принадлежит контуру, если хотя бы одна из 8-ми окружающих ее точек - "белая". Поскольку контур нужно пройти не один раз, а для каждой точки контура придется перебирать все остальные точки контура для вычисления длины, то сначала желательно перебрать все точки контура с картинки и поместить их в линейный массив точек.

Т.е. массив edge[], каждый элемент которого содержит пару координат точки: x и y.
Перебираем всю картинку поточечно, если (i,j)-точка является контурной (рядом с ней есть хотя бы одна фоновая точка) - помещаем ее в edge[].

Вот теперь, работая с edge[], будем искать максимально длинный отрезок. Берем edge[0] в качестве первой точки отрезка, перебираем все остальные edge[i] в качестве второй точки отрезка. Берем edge[1] в качестве первой точки отрезка, перебираем ... И т.д. Максимальное значение этого перебора храним в переменных maxIdx1 (индекс первой точки), maxIdx2 (индекс второй точки), maxLength (длина между этими точками).
...
Рейтинг: 0 / 0
19.03.2011, 14:06
    #37173516
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Edd.DragonНаоборот надо бы. Черный обычно - 0, а белый - 255. Потом путаница может возникнуть или необходимость менять местами при каких-либо операциях. Но в принципе, без разницы.

ну это знаете - как в RGB) 255, 255, 255 - черный, 0, 0, 0 - белый.

Edd.DragonЯ так понимаю изображения мааааленькие, если будете для наглядности их в стринг-гриде выводить (1 пиксель = 1 ячейка)?
Да, Вы правы - изображения небольшие, это раз. А во-вторых одним из заданий моей работы с графикой является вывод значений пикселов на экран. Т.е. поначалу я беру цветную картинку, бинаризую его и на матрице все это отражается. Т.е. были ячейки 150, 200, 10, 1, а стали 255, 255, 0, 0 (например).

Edd.DragonСтринггрид - это средство вывода, а не средство хранения. Хранить картинку/контур в таком виде надо не в гриде, а в обычном массиве двумерном.
Да, пожалуй так будет правильнее.

Что касается остального - спасибо за советы! Теперь надо подумать над реализацией.

P.S. К модераторам просьба пока тему не закрывать.
...
Рейтинг: 0 / 0
19.03.2011, 14:29
    #37173535
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Strelok_33ну это знаете - как в RGB) 255, 255, 255 - черный, 0, 0, 0 - белый.

Наоборот

Strelok_33Что касается остального - спасибо за советы! Теперь надо подумать над реализацией.
Да там никаких сложностей. Циклы, циклы, да вычисление расстояния между двумя точками (i1,j1) - (i2,j2) по теореме Пифагора.
...
Рейтинг: 0 / 0
19.03.2011, 18:28
    #37173723
mayton1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Задачу нужно привести к другой постановке. Будем искать поперечник выпуклого многоугольника.

Если контур известен, то мы его упрощаем. Точки которые вогнуты убираем из множества.
Остаются значимые точки {N} - вершины многугольника. Генерируем сочетания 2 из N
вершин и ищем максимально длинное расстояние.
...
Рейтинг: 0 / 0
19.03.2011, 20:37
    #37173816
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
mayton1Задачу нужно привести к другой постановке. Будем искать поперечник выпуклого многоугольника.

Если контур известен, то мы его упрощаем. Точки которые вогнуты убираем из множества.
Остаются значимые точки {N} - вершины многоугольника. Генерируем сочетания 2 из N
вершин и ищем максимально длинное расстояние.

Т.е. как я понял, Вы предлагаете оставить только вершины грубо говоря от контура? Если фигура сложная - не будут ли они совпадать с участками максимальной кривизны?

А вот это место "Генерируем сочетания 2 из N вершин и ищем максимально длинное расстояние." - разъясните пожалуйста поподробнее, если не сложно. Что-то я не понял)
...
Рейтинг: 0 / 0
19.03.2011, 22:04
    #37173885
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Я предлагаю оставить только те вершины, которые влияют на результат.
Чтобы не говорить много и красноречиво лучше один раз увидеть.

Приложите в форум образец B&W картинки и мы попробуем обозначить эти вершины.
...
Рейтинг: 0 / 0
19.03.2011, 22:32
    #37173907
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Прилагаю образец бинаризованного изображения. Специально выбрал такой пример, после которого остальные уже не будут вызывать вопросов.

картинка
...
Рейтинг: 0 / 0
19.03.2011, 22:49
    #37173924
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Рисовал грубо. На глаз. Но думаю, идея понятна.
...
Рейтинг: 0 / 0
19.03.2011, 23:10
    #37173937
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
mayton,

То есть тут каждая вершина по идее должна сравниваться координатами со всеми остальными, иначе как их можно сравнить и узнать наиболее эффективные?
...
Рейтинг: 0 / 0
19.03.2011, 23:16
    #37173945
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Я-же говорю. Убираем вогнутые вершины. Смотри здесь алгоритм http://algolist.manual.ru/maths/geom/convhull/

Потом делаем то что я, нарисовал интуитивно. Зелёная линия - суть максимальный поперечник (на глазок).
...
Рейтинг: 0 / 0
19.03.2011, 23:36
    #37173974
Strelok_33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
mayton,

Вот за ссылочку Вам отдельное merci
Завтра продолжим)
...
Рейтинг: 0 / 0
20.03.2011, 10:34
    #37174067
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии длины изображения
Strelok_33А вот это место "Генерируем сочетания 2 из N вершин и ищем максимально длинное расстояние." - разъясните пожалуйста поподробнее, если не сложно. Что-то я не понял)
Это и есть " Берем edge[0] в качестве первой точки отрезка, перебираем все остальные edge[i] в качестве второй точки отрезка. Берем edge[1] в качестве первой точки отрезка, перебираем ... И т.д. "

Только теперь у нас в edge[] десяток точек, а не сотни, как ранее.

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Построение линии длины изображения / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]