Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Лекция 3 Сегментация

6,930 views

Published on

  • Be the first to comment

  • Be the first to like this

Лекция 3 Сегментация

  1. 1. Сегментация изображений<br />Сайт курса:<br />http://cvbeginner.blogspot.com/<br />1<br />
  2. 2. Из прошлой лекции…<br />Цветовые модели<br />Гистограмма<br />Масочные операции<br />Типы шумов<br />Типы фильтров от шума<br />2<br />
  3. 3. Пример сегментации<br />3<br />
  4. 4. Где используется<br />Медицина<br />Обработка космических снимков<br />Векторизация изображений<br />4<br />
  5. 5. Задача<br />Разделить изображение на области связанные между собой по определенным признакам<br />Часто сегментация зависит от задачи<br />5<br />
  6. 6. Типы сегментации<br />Бинарная<br />Области<br />Примитивы<br />Вопрос: Как бы вы сформулировали что такое хорошая сегментация?<br />6<br />
  7. 7. Хорошая сегментация<br />Области сегментированного изображения должны быть однородны по некоторому признаку<br />Внутренние части сегментированных областей должны иметь простую форму и не содержать большого количества мелких отверстий<br />Смежные сегменты должны существенно отличаться по выбранному признаку<br />7<br />
  8. 8. Пространства<br />Чтобы разделить изображение на области нам нужно выбрать признаки по которым будем делить.<br />Вопрос: Какие пространства можно использовать?<br />8<br />
  9. 9. Пространства<br />Яркость<br />Цвет (RGB,HSV другие)<br />Текстурные признаки<br />Пространственные связи<br />…<br />9<br />
  10. 10. Цветовое пространство<br />RGB<br />HSV<br />10<br />
  11. 11. Текстурные характеристики<br />Энтропия<br />Энергия<br />Инерция<br />Локальный диапазон<br />11<br />
  12. 12. Локальный диапазон<br />12<br />
  13. 13. Энтропия<br />13<br />
  14. 14. Метрики<br />Манхеттен (L1)<br />Эвклида (L2)<br />Есть еще метрики…<br />14<br />
  15. 15. Бинарная сегментация<br />Разделить на два класса: обычно объект фон<br />Обычно выбирается порог l из промежутка [0..255]<br />Если значение яркости пикселя больше порога то присваиваем значение 1, иначе 0<br />15<br />
  16. 16. Пример разные пороги<br />16<br />
  17. 17. Реализация<br />Matlab<br />BW = im2bw(I,0.5)<br />OpenCV<br />threshold(Входное изображение, Выходное изображение, Порог, 255, Тип порога);<br />17<br />
  18. 18. Тип порога в OpenCV<br />18<br />
  19. 19. Мяч<br />19<br />
  20. 20. Бинаризация на основе гистограммы<br />Хотим сделать автоматический выбор порога<br />Для этого можно использовать статистику<br />Простой анализ<br />Метод Otsu<br />20<br />
  21. 21. Простой анализ гистограммы<br />Сгладить гистограмму найти два максимума<br />Найти минимум между ними<br />21<br />
  22. 22. Простой анализ гистограммы<br />L1 = max(hist(1:120));<br />L2 = max(hist(120:255));<br />T = min(hist(L1:L2));<br />22<br />
  23. 23. Метод Otsu<br />Идея<br />Гистограмма содержит две моды<br />Оптимальный порог - минимальная взвешенная сумма внутригрупповых дисперсий<br />Matlab<br />Threshold(Исходное, Результат, 0, 255, THRESH_OTSU);<br />OpenCV<br />graythresh(I)<br />23<br />
  24. 24. Метод Otsu<br />Алгоритм<br />Где H(i) гистограмма, дисперсия первой моды распределения<br />Решается перебором или через полную дисперсию<br />24<br />
  25. 25. Метод Otsu<br />Иллюстрация<br />25<br />
  26. 26. Не всегда работает<br />26<br />Неравномерность освещения<br />
  27. 27. Адаптивная бинаризация<br />Для окрестности R пикселя I(x,y) вычисляется порог T<br />Если I(x,y) > T + C, то B(x,y)=1 иначе B(x,y) = 0<br />T – среднее по области R<br />T – медианна<br />T – (max – min)/2<br />C – произвольная константа<br />27<br />
  28. 28. Различные параметры<br />28<br />
  29. 29. Имплементация<br />OpenCV<br />adaptiveThreshold(Исходное изображение, Выходное изображение, 255, алгоритм выбора T, THRESH_BINARY, Размер окна, константа)<br />29<br />
  30. 30. Кластеризация<br />Разделение пространства на несколько однородных зон<br />Вопрос: Как выбрать количество кластеров?<br />30<br />
  31. 31. K-means (К средних)<br />Выбираем случайно K точек в нашем векторном пространстве<br />Для всех точек из выборки приписываем их к классу к которому они ближе всего<br />Пересчитываем центры кластеровна шаг 2<br />Останавливаемся, когда смещения всех центров масс меньше порога или истекло кол-во итераций<br />31<br />Matlab: Demo<br />
  32. 32. K-means 6 классов<br />32<br />Matlab: Demo<br />
  33. 33. Реализация<br />Matlab<br />Kmeans(M,k)<br />OpenCV<br />KMeans2<br />33<br />
  34. 34. Перерыв<br />Вопросы<br />34<br />
  35. 35. Метод Оландера<br />35<br />
  36. 36. В чем минусы?<br />Работает плохо в случае большого количества мелких объектов<br />Не работает на сильно текстурированных объектах<br />36<br />
  37. 37. Методы основанные на разбиении графа <br />Изображение – граф (V-его элементы, E - дуги)<br />Разрез графа<br />Задача: Минимизировать разрез графа<br />37<br />
  38. 38. Методы основанные на разбиении графа <br />38<br />
  39. 39. Методы основанные на разбиении графа <br />X(i) – место расположение узла I<br />F(i) – вектор признаков<br />Для полутоновых изображений F(i) = I(i)<br />Для цветных F(i)=[v,v*s*sin(h),v*s*cos(h)](i), где h,s,v – цветовая кодировка HSV<br />39<br />
  40. 40. Результат<br />40<br />Demo: Matlab<br />
  41. 41. GrabCut [Rother, Kolmogorov Siggraph’04]<br />41<br />
  42. 42. Минусы<br />Минусы<br />Требует пользователя<br />Плюсы<br />Качественная сегментация<br />42<br />
  43. 43. Реализация<br />OpenCV<br />grabCut(Входное изображение, маска в которой выделены области принадлежащие объекту и фону, прямоугольник внутри которого содержится объект, Выходная маска фона (можно подавать существующую для уточнения), Выходная маска переднего плана, К-во итераций, Режим см. док)<br />См. пример samples/grabcut.cpp<br />43<br />
  44. 44. Выделение краев<br />Задача:<br />Выделить точки по которым проходит разрыв яркости<br />Прямое решение:<br />Взять градиент, например оператор prewittи потом выделить по порогу<br />Вопрос: чем такое решение плохо?<br />44<br />
  45. 45. Толстая линия разрыва<br />45<br />
  46. 46. Связанность областей<br />46<br />
  47. 47. Детектор краев Кенни (Canny)<br />47<br />
  48. 48. Параметры Алгоритма<br />Размер ядра Гаусса<br />ThВерхний порог<br />TlНижний порог (обычно Tl=Th/2)<br />48<br />
  49. 49. Шаги алгоритма<br />Сгладить изображение Гауссом<br />Вычисляем направление градиента и силу градиента<br />Утончаем границы (supress_nonmaxima)<br />Следуем вдоль границ<br />49<br />
  50. 50. Утончение границы (supress_nonmaxima)<br />Если по направлениям градиента (+,-) существует значение с силой больше чем в интересующей точки, то обнуляем точку<br />50<br />Вопрос: Почему по направлению градиента а не по области?<br />
  51. 51. Следовать вдоль границ<br />Ищем во всем изображении точки, в которых сила градиента больше порога Th<br />Найдя такую точку идем помечаем ее как точку контура и проверяем соседние точки<br />Если есть точки больше порога Tlто переходим в эту точку (шаг 2)<br />51<br />
  52. 52. Реализация<br />Matlab<br />BW = edge(G,’canny’);<br />OpenCV<br />void Canny(Серое входной изображение, Выходной бинарное изображение, порог Th, Порог Tl,Размер аппретуры, Метрика вычисления градиента)<br />52<br />
  53. 53. Обнаружение прямых<br />Задача обнаружить прямы на изображении<br />Вопрос: Чем плох прямой подход как в операторе Кенни?<br />53<br />
  54. 54. Преобразование Хафа (Hough)<br />Идея:<br />Перевести черно-белое изображение в пространство параметров прямой<br />Создать новое изображение с параметрами угол и расстояние <br />54<br />
  55. 55. Преобразование Хафа (Hough)<br />for i=1:N<br /> for j=1:M<br />di=rowgrad(I,i,j) <br />dj=colgrad(I,i,j)<br />θ=atan2(di,dj) //Угол<br /> r = |i*cos(θ)-j*sin(θ)|//Расстояние<br /> A(r, θ)+=(|di|+|dj|)/2//Сила градиента<br /> end<br />end<br />A – выходной массив<br />55<br />
  56. 56. Преобразование Хафа (Hough)<br />56<br />
  57. 57. Преобразование Хафа (Hough)<br />57<br />
  58. 58. Реализация<br />Matlab<br />[H,theta,rho] = hough(BW);<br />P = houghpeaks(H)<br />lines = houghlines(BW,theta,rho,P…)<br />OpenCV<br />HoughLines(бинарное изображение, выходной вектор из прямых, шаг дискретизации расстояния, шаг дискретизации угла, порог .. )<br />58<br />
  59. 59. Вопросы<br />59<br />

×