На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Сглаживание контуров объектов полутоновых изображений
    Скажите, какие существуют алгоритмы сглаживания контуров объектов полутоновых изображений?
      hawk1
      Выделяем края(3 алгоритма) и сглаживаем блюр (функция которой сглаживаем или частотая фильтрация или вайвлеты).
      Подробнее можно найти в википедии(в ангийской подробнее).
      Сообщение отредактировано: Pavia -
        hawk1 посмотри здесь может что найдешь ... ;)
          Тогда еще вопрос. Изображения с каким количеством объектов использовать для тестирования?
            В википедии ниче не нашел.
              Первое что надо сделать это выделить края
              http://en.wikipedia.org/wiki/Edge_detection

              Canny edge detector - наиболее лучшей алгоритм.
              Sobel operator - самы простой алгоритм.
              Prewitt operator - почти тоже самое что Sobel.

              Сглаживание это блюр. Или другими словами размытие.
              Box Blur - самый простой способ сгладит. Берем соседнии пиксели складываеи и делим на число соседий.
              Gaussian blur - Гаусовское сглажевание. Тоже самое но с весовыми коэфицентами по гаусовской функции.
              http://en.wikipedia.org/wiki/Gaussian_blur

              Media - медиана это фильтрация. Но не сглаживает.

              http://en.wikipedia.org/wiki/Category:Image_processing

              Также есть отфильтровать высокии частоты, то все изоброжение сгладиться.
              К таким фильторам относятся Blur. Но он впространственной облости работает. А можно перейти в частотную используя фурье преобразование.
              В вайвлетах, есть аналоги разделения на низкии и высокии частоты.

              Таковот выделем контуры одним из методов, получаем темм самым маску.
              Фильтруем изоброжение. Применяем масску чтобы смешать новое изоброжение и старое.
                Еще бы ссылки на материал на русском языке.
                  есть ещё фрактальная интерполяция - по сути то что называется словом рендеринг (rendering)
                  фрактальные
                  адаптивные методы интегрирования - смотря что за изображение и что сглаживаем.
                  но это занимает много ресурсов процессора попросту говоря.
                  чем мягче и красивее картинка - тем больше ресурсов.

                  по сути эти всё фильтры - зачастую довольно простые операции с соседними точками изображения.
                    А как быть если контур разомкнутый, т.е. линия? Как его выделить? Т.е. понятно, что надо найти первую точку и дальше анализировать ее окрестность. Как это хоть на псевдокоде выглядит?
                      Плиз дайте ссылки на описание задачи сглаживания зашумленных контуров.
                        hawk1
                        Ну ты блин даешь. Я успел за это время целую библеотеку написать оптимизировать и отладить.
                        ExpandedWrap disabled
                            Result:=TByteMap.Create(bm.Canals);
                            Result.Width:=bm.Width;
                            Result.Height:=bm.Height;
                            p:=Result.ScanLine[1];
                            p1:=bm.ScanLine[0];
                            p2:=bm.ScanLine[1];
                            p3:=bm.ScanLine[2];
                            LL:=bm.LineLen;  //Длина в байтах между линиями
                            uf:=bm.Canals;
                            LL1:=uf*bm.Width-uf;
                             for j:=1 to bm.Height-2 do
                              begin
                              i:=uf;
                              while i<LL1 do
                               begin
                               //Собель
                               c:=SQRT_Table[(sqr((p1[i-uf]-p1[i+uf])+        // SQRT_Table таблица корней для ускорения рассчета корня
                                                2*(p2[i-uf]-p2[i+uf])+        //По строкам
                                                  (p3[i-uf]-p3[i+uf])) +
                                              sqr((p1[i-uf]-p3[i-uf])+        // По столбцам
                                                   2*(p1[i]-p3[i])+
                                                  (p1[i+uf]-p3[i+uf]))
                                                  +1)shr 5];//+1 для уточнения рассчетов
                                  if c>T then  // T порог
                                    begin //Точка принадлежит контуру  
                                    p[i]:=(1*p1[i-uf]+2*p1[i-uf]+1*p1[i-uf]+
                                           2*p2[i-uf]+4*p2[i-uf]+2*p2[i-uf]+ //Blur - сглаживание
                                           1*p3[i-uf]+2*p3[i-uf]+1*p3[i-uf])
                                           shr 4;
                                    end else
                                    begin
                                    p[i]:=p2[i]; // Не контур оставляем как есть.
                                    end;
                                inc(i);
                                end;
                              inc(p,LL);
                              inc(p1,LL);
                              inc(p2,LL);
                              inc(p3,LL);
                              end;


                        Добавлено
                        Цитата hawk1 @
                        Плиз дайте ссылки на описание задачи сглаживания зашумленных контуров.

                        Это у тебя надо спрашивать, что ты хочешь. Или кто ее тебе дал это задание. Потому что под это определение попадает две задачи.
                        Первая убрать шум с изоброжения там где контуры. Вторая убрать шум с формы контура. Это две разные задачи. Если ответ на первую постом выше. То вторая требудет знать параметры контура. Провести векторизация и после уже сглаживат.
                          Вторая. Интересует сама проблематика.
                            hawk1
                            1 задача от 2 не сильно отличается методы применяются все тежи самые.
                            Лучше чтобы контуры были заданы, а не искать их на изоброжении. Но тут надо смотреть в сторону векторизации. Есть волновой алгоритм скелетизации(на русском в гугле найдешь). Его реализуешь, а дальше уже можно сглаживать. Тотже блюр или скользящее среднее или Гаусовское сглаживание или частотная фильтрация. Также можно использовать сплайны и прочее прочее прочее.
                            А ссылки надо искать. ;) На английском можно найти. Я правда с такой постановкой задачи не встричался.
                            Хотя, вроде вспомнил есть старая книжка на русском там что-то было на похожую тему распознование образов востановление контуров что-то в этом духе.

                            Для востановления разрывов можно использовать мат. морфологию. Просто искать пиксели в заданной окресности и соединять.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0304 ]   [ 15 queries used ]   [ Generated: 7.05.24, 12:39 GMT ]