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