Russian Qt Forum

Qt => Вопросы новичков => Тема начата: nikeo от Декабрь 16, 2012, 18:40



Название: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 16, 2012, 18:40
Всем добрый вечер!

Если кто сталкивался,помогите в разработке алгоритма по определению части реки на снимке.


Название: Re: Распознавание объекта на снимке
Отправлено: Igors от Декабрь 16, 2012, 19:37
Фраза "не изобретайте велосипед" употребляется не к месту примерно в 95% случаев - но здесь Вы попали в оставшиеся 5% :)  Здесь надо сначала читать теорию распознавания образов, подобрать подходящий алгоритм, а потом уж (может быть) и свое что-то добавить.


Название: Re: Распознавание объекта на снимке
Отправлено: Nagdiel от Декабрь 17, 2012, 08:35
Вы как то нечетко задачу формулируете. Если Вы хотите выделить пиксели, которые соответствуют реке на снимке, можно попробовать один из методов сегментации. Идеально выделить обычно не получается, возникают разного рода артефакты типа "ложных тревог" или разрывов. С ними можно бороться при помощи алгоритмов математической морфологии.

Основы неплохо написаны в книге Р. Гонсалес, Р. Вудс "Цифровая обработка изображений"


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 17, 2012, 22:47
Все эти книжки я уже читал)основы знаю...у меня реализован метод по перепаду яркостей на снимке...но для реки это не подходит(


Название: Re: Распознавание объекта на снимке
Отправлено: QuAzI от Декабрь 18, 2012, 00:44
Попробуй увеличить контрастность, тогда река будет более... выделена от окружающих объектов... тогда должно зашуршать, хотя конечно весьма лажовая задача... нужно ещё смотреть, как обход контура делается... когда-то мне нужно было шуршить контуры детали отсканированной... нахавался геммора даже на относительно чистом скане.


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 18, 2012, 02:22
Вообщем то прогресс пошел :D

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

P.S:извиняюсь за такой способ задания вопросов!!!я в этом мало чего понимаю,приходится писать диплом,а эта часть совсем не по специальности,так что приходится изучать самому.


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 18, 2012, 02:26
Попробуй увеличить контрастность, тогда река будет более... выделена от окружающих объектов... тогда должно зашуршать, хотя конечно весьма лажовая задача... нужно ещё смотреть, как обход контура делается... когда-то мне нужно было шуршить контуры детали отсканированной... нахавался геммора даже на относительно чистом скане.

вот вот,как раз над этим и думаю,так как надо бы от заданной точки идти в 4х направлениях(исходя из разработанного мной алгоритма)
Я накапливаю множество точек на снимке,где яркостные характеристики имеют малые различия(оцениваю по общей яркости пикселя,в котором преобладает синий спектр).


Название: Re: Распознавание объекта на снимке
Отправлено: QuAzI от Декабрь 18, 2012, 07:51
Я в своё время использовал круговой обход с настраиваемым шагом. На всяких мусорных артефактах близких к границе можно получить жестокий косяк, вплоть до зацикливания :(
Алгоритмом не поделишься?


Название: Re: Распознавание объекта на снимке
Отправлено: Nagdiel от Декабрь 18, 2012, 08:56
Теперь хотел бы попросить помощи в том,как увеличить контрастность...
На сколько я понимаю,нужен фильтр размытия,потом из оригинала вычесть размытую...
А вот как это делать,я пока не понял.
"Матрица свертки" и тд и тп - правильное направление?)

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

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


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 18, 2012, 09:11
Теперь хотел бы попросить помощи в том,как увеличить контрастность...
На сколько я понимаю,нужен фильтр размытия,потом из оригинала вычесть размытую...
А вот как это делать,я пока не понял.
"Матрица свертки" и тд и тп - правильное направление?)

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

Правда, непонятно зачем изобретать колесо. Для выделения границ есть метод Canny, например. Там как раз с размытия и начинают. Лично мне, кажется, что контуры лучше выделять, а не прослеживать, так как прослеживание сильно зависит от локальных особенностей изображения и чувствительно к накоплению ошибок.
никто и не изобретает велосипед)такой метод я и имел ввиду)меня вот лично вполне результат устраивает,и думаю научника с комиссией тоже устроит.
Но меня мой ум пытливый выводит...для накопления,нужно начальную точку задать,а я хотел бы,чтобы он ее сам нашел(
Да и большинство методов,строятся на статистике,а у меня к сожалению нету времени ее выводить..


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 18, 2012, 09:13
Я в своё время использовал круговой обход с настраиваемым шагом. На всяких мусорных артефактах близких к границе можно получить жестокий косяк, вплоть до зацикливания :(
Алгоритмом не поделишься?
Он пока в доработке,как доделаю,обязательно скину.


Название: Re: Распознавание объекта на снимке
Отправлено: Nagdiel от Декабрь 18, 2012, 09:26
А насколько сильно качество работы алгоритма зависит от выбора начальной точки?


Название: Re: Распознавание объекта на снимке
Отправлено: Nagdiel от Декабрь 18, 2012, 09:37
С точки зрения постановки вопроса, чтобы выбрать начальную точку на границе реки, нужно собственно знать, где находится эта самая граница, или хотя бы ее часть. В таком случае можно использовать что-нибудь простенькое для предварительного выделения контуров, затем выбирать по каким-либо признакам подходящий контур и точку на нем. А дальше использовать Ваш алгоритм для более точного прослеживания границы реки на снимке.


Название: Re: Распознавание объекта на снимке
Отправлено: Igors от Декабрь 18, 2012, 10:53
Теперь хотел бы попросить помощи в том,как увеличить контрастность...
На сколько я понимаю,нужен фильтр размытия,потом из оригинала вычесть размытую...
А вот как это делать,я пока не понял.
"Матрица свертки" и тд и тп - правильное направление?)
После вычитания размытой все значения цветов сильно изменятся - что может повести к новым проблемам. Вообще не очень ясно что у Вас делается на данный момент - вскользь упоминаете о перепаде контрастности - и все. Так трудно что-то советовать.

Ok, с позиций "велосипедизма" - зачем тот контраст/перепад? Попробуем думать непредвзято (пусть наивно). Цвет реки хорошо заметен и колеблется в относительно небольшом диапазоне - ну и выделим все пиксели что соответствуют этому цвету +/- какая-то дельта. Далее - река должна иметь какую-то протяженность, Тестируем каждый полученный тег пикселей по длине x/y и, возможно, диагоналям. Выбрасываем теги что слишком малы. Это можно сделать за день и посмотреть - может всего хватает. А нет - по результатам искать как улучшить





Название: Re: Распознавание объекта на снимке
Отправлено: Nagdiel от Декабрь 18, 2012, 11:24
Согласен с Igors, сегментация тут подходит больше. Река действительно "хорошо" отделяется по цвету, а вот границы местами могут быть и размытыми. Сегмент (связная группа выделенных пикселей) с рекой, скорей всего, получится найти по максимуму площади. Если принципиально получить именно контурный препарат, то его после сегментации легко извлечь из бинарного изображения.

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


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 18, 2012, 22:00
Согласен с Igors, сегментация тут подходит больше. Река действительно "хорошо" отделяется по цвету, а вот границы местами могут быть и размытыми. Сегмент (связная группа выделенных пикселей) с рекой, скорей всего, получится найти по максимуму площади. Если принципиально получить именно контурный препарат, то его после сегментации легко извлечь из бинарного изображения.

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

Вы меня не поняли,я не пытаюсь размытием вывести контур,я пытаюсь увеличить контрастность изображения)

Нет,алгоритм работает со всеми ответвлениями!!!я не задаю точку берега,я задаю характеристики "классификации",по которой и происходит накопление "классификаций".
Я задаю пиксел,получаю с него яркостные характеристики по 3 спектрам и общую яркость.После,делаю обход по соседним пикселам,и если они удовлетворяют "классификации",то записываю их координаты в вектор.Такой алгоритм,позволяет "распознать" все водные объекты на снимке,и погрешность его расчета,по большей степени,зависит от качества снимка.
Для максимального результата,нужно привести статистику по множеству снимков,сделанных с одной аппаратуры.Тогда качество распознавания увеличится, и можно использовать автоматическое определение точки отсчета.

Моя полная задача делится на три блока:
1.Определение координат спутника на момент съемки.
2.Коррекция геопространственной привязки снимка.
3.Тестовый модуль(Отображение полученных результатов на Google Maps).

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


Название: Re: Распознавание объекта на снимке
Отправлено: Igors от Декабрь 19, 2012, 09:04
Судя по Вашему умению напускать туман - задатки научного работника налицо, и кандидатская диссертация не за горами :)

Простой человек сказал бы без затей типа RGB, grayscale, а у Вас
яркостные характеристики по 3 спектрам и общую яркость.
Наверное чтобы при случае задавить оппонента знаниями о спектре и.т.п.

Так что,для меня распознавание реки,это лишь часть всей программы.)И того что я сделал,уже достаточно)но для себя,я не хочу делать все "тяп-ляп")
Похвально, но давайте сосредоточимся на контрасте. Чем Вас не устраивают простейшие модуляторы, напр (псевдокод)
Код
C++ (Qt)
brightness = GetBrightness(pixel);
if (doPow)
brightness = pow(brightness, amount);
if (doHermit)
brightness = Hermite(brightness);
SetBrightness(pixel, brightness);
 
???




Название: Re: Распознавание объекта на снимке
Отправлено: Dancing_on_water от Декабрь 19, 2012, 10:49
2Igors, уж лучше иногда молчать, чем говорить.
nikeo ошибся в терминологии, вместо 3 спектров, скорее всего, надо читать три светофильтра.

2nikeo
Т.е. у вас на руках по сути три кадра? Тогда лобовое решение: с помошью openCV ищем контура изображений на кадрах. А далее фильтруем по размеру, по положению (контура на всех трех кадрах должны быть более-менее близко расположены), можно, наверно, задать условие, чтоб существовал второй контур были более-менее параллельный.

Но если честно, задача мне видется по меньше мере странной. Чтоб получить данные со спутника мы должны знать его орбиту. Это решается приемником GPS\Глонасс на борту самого аппарата + наземные станции наблюдения. Далее, зная орбиту и зная время съемки кадра, мы знаем какой участок мы снимаем. Или точность привязки нужна до угловых секунд?




Название: Re: Распознавание объекта на снимке
Отправлено: Igors от Декабрь 19, 2012, 11:27
2Igors, уж лучше иногда молчать, чем говорить.
Это совершенно верно. К чему приплетать openCV,  приемник GPS\Глонасс на борту аппарата (?), параллельность контуров и многое другое - если человек спрашивал как повысить контраст картинки?  :)


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 20, 2012, 17:19
2Igors, уж лучше иногда молчать, чем говорить.
nikeo ошибся в терминологии, вместо 3 спектров, скорее всего, надо читать три светофильтра.

2nikeo
Т.е. у вас на руках по сути три кадра? Тогда лобовое решение: с помошью openCV ищем контура изображений на кадрах. А далее фильтруем по размеру, по положению (контура на всех трех кадрах должны быть более-менее близко расположены), можно, наверно, задать условие, чтоб существовал второй контур были более-менее параллельный.

Но если честно, задача мне видется по меньше мере странной. Чтоб получить данные со спутника мы должны знать его орбиту. Это решается приемником GPS\Глонасс на борту самого аппарата + наземные станции наблюдения. Далее, зная орбиту и зная время съемки кадра, мы знаем какой участок мы снимаем. Или точность привязки нужна до угловых секунд?




Во-первых,да,снимок есть в разных спектрах!
Во-вторых,данные орбиты спутника,можно получить к примеру из TLE,а наземные станции и GPS нужны для корректировки орбиты!
и вообще,если вы не знаете,как осуществляется привязка,то не пытайтесь угадать;)то что делаю я со снимком - КОРРЕКЦИЯ привязки,так как всегда есть погрешность в измерении положения спутника.


Название: Re: Распознавание объекта на снимке
Отправлено: nikeo от Декабрь 20, 2012, 17:24
Судя по Вашему умению напускать туман - задатки научного работника налицо, и кандидатская диссертация не за горами :)

Простой человек сказал бы без затей типа RGB, grayscale, а у Вас
яркостные характеристики по 3 спектрам и общую яркость.
Наверное чтобы при случае задавить оппонента знаниями о спектре и.т.п.

Так что,для меня распознавание реки,это лишь часть всей программы.)И того что я сделал,уже достаточно)но для себя,я не хочу делать все "тяп-ляп")
Похвально, но давайте сосредоточимся на контрасте. Чем Вас не устраивают простейшие модуляторы, напр (псевдокод)
Код
C++ (Qt)
brightness = GetBrightness(pixel);
if (doPow)
brightness = pow(brightness, amount);
if (doHermit)
brightness = Hermite(brightness);
SetBrightness(pixel, brightness);
 
???




Я вас умоляю,я сам мало что знаю о спектрах)))я просто называю вещи своими именами!да и какого оппонента мне давить и где???))Тут что ли???я ожидаю ответы на поставленный вопрос,а не критики моих научных знаний)

Спасибо за код,меня он вполне устраивает!я по тому и спрашиваю,потому что не знаю)


Название: Re: Распознавание объекта на снимке
Отправлено: vic_prog от Декабрь 21, 2012, 09:31
Я предлагаю посмотерть в сторону сегмементации по текстурным признакам. Подобрать признаки, которые подходят к воде. Там только одна проблема - в зависимости от размера масок будет определяться четкость границ.


Название: Re: Распознавание объекта на снимке
Отправлено: Igors от Декабрь 21, 2012, 11:18
я ожидаю ответы на поставленный вопрос,а не критики моих научных знаний)
А так получается потому что ставите Вы вопрос нечетко, туманно. Какую цветовую модель Вы используете? Если просто RGB - так и скажите, если свою собственную - кратко изложите какую. Нет ничего плохого что Вы упоминаете о др аспектах Вашей работы (TLE. GPS и.т,п.), но так Вы вызываете/поощряете весьма обширную дискуссию "обо всем" и, возможно, Ваш изначальный вопрос о контрасте будет забыт.

Возвращаясь к контрасту - исходя из предъявленного имеджа лично я не вижу что даст контраст и др фильтры, (как впрочем и своя цветовая модель). Река и так выделяется хорошо, что легко проверить напр в PhotoShop ("magic" tool)