Окрестность пиксела. Связность. Метод сходящихся...

23
с/к Обработка информации, осень 2012 2. Окрестность пиксела. Связность. Метод сходящихся квадратов. Простейшие фильтры www.uralvision.blogspot.com [email protected] УрФУ / ИММ УрО РАН Денис Сергеевич Перевалов

Upload: denis-perevalov

Post on 02-Aug-2015

4.158 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

с/к Обработка информации, осень 20122. Окрестность пиксела. Связность.

Метод сходящихся квадратов. Простейшие фильтры

www.uralvision.blogspot.com [email protected] УрФУ / ИММ УрО РАН

Денис Сергеевич Перевалов

Page 2: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

План лекции1. Понятие окрестности пикселя. 4-, 6-, 8- окрестности. Понятия связной компоненты в применении к изображениям. Морфологические операции - дилатация и эрозия.

2. Простейшие фильтры по окрестности пикселя: простое усреднение и медианный фильтр, фильтры минимума и максимума.

3. Метод сходящихся квадратов для поиска одного и нескольких максимумов яркости.

4’ OpenCV: запись и считывание изображений на диск. Вывод на экран.

5’. Дилатация и эрозия в OpenCV.

6’. Заполнение областей в OpenCV. Выделение областей на бинарном изображении. Пример - поиск биллиардного шара.

7’. Фильтрация в OpenCV: средний, min, max - с помощью выделения подфрагмента.

Page 3: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Окрестность пикселя

Page 4: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Связные множества и компоненты связностиПусть зафиксирован тип окрестности. Если один пиксель лежит в окрестности другого, либо совпадает с ним, то эти пикселы смежны.

Пусть имеется множество пикселей V.V называется связным множеством, если для любой пары пикселей p1, p2 найдется последовательность пикселей,(p1, q0, q1, ..., qm, p2) в которой соседние пиксели смежны. Говорят, например, "восьми-связное множество", хотя это не совсем корректно.

Произвольное множество Q распадается однозначным образом на множество непересекающихся связных множеств V1,..., Vn, которые называются компонентами связности множества Q.

Домашнее задание: докажите утверждение из определения компонент связности. (Решения высылайте до 15 октября на [email protected])

Это множество является 8-связным.Оно не является 4-связным (а состоит из двух компонент связности).

Page 5: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Преимущества 6-связностиХотя 6-связные окрестности используется очень редко, она геометрически более "правильная":1. у нее расстояние до смежных пикселей одинаково (в отличие от 8-связности)2. ее форма ближе к кругу, чем 4-связная окрестность (6-угольник лучше аппроксимирует круг, чем 4-угольник). Это бывает полезно при обработке изображений, когда мы считаем что окрестность пиксела - "как бы круг".

Page 6: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Связь бинарных изображений с множествами пикселей

Если рассмотреть бинарное изображение, то можно собрать пиксели с единичным значениями в множество Q.

И наоборот, по множеству пикселей Q можно построить бинарное изображение.

УтверждениеТаким образом, бинарные изображения находятся в биективном соотношении с множествами пикселей.

Поэтому можно обрабатывать бинарные изображения с помощью обработки соответствующих множеств пикселей.

Page 7: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Связь бинарных изображений с множествами пикселейПоэтому, можно говорить о связных изображениях и компонентах связности изображений.

Кроме того, можно определить внутренние и граничные пиксели бинарного изображения A:

Пиксель из A является внутренним для изображения A, если его окрестность лежит целиком в A.

Пиксель из A является граничным для изображения A, если его окрестность не лежит целиком в A.

Page 8: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Морфологические операцииК бинарным изображениям можно применять различные операции типа "сжатия" и "раздутия" и на один пиксель. Эти вопросы изучает математическая морфология (основана Серра в 1970-х).

Две основные операции - эрозия (сжатия) и дилатация (раздутие) с помощью произвольного множества. Мы рассмотрим в качестве такого множества - дискретный круг радиуса R (самое частое применение).

Эрозия - "R-внутренность" множества. Оставляет во входном множестве Q лишь те пиксели, которые содержались в исходном множестве вместе с кругом R с центром в пикселе.

Дилатация - "R-окрестность" множества. Результатом применения к Q является объединение всех кругов радиуса R с центром в пикселях из Q.

"Открытие" = эрозия + дилатация. Устранение наростов и мелких шумов.

"Замыкание" = дилатация + эрозия. Устранение мелких дырок.

Page 9: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Морфологические операции

Page 10: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Выделение скелетаРассмотрим фигуру на плоскости. Множество точек центров вписанных окружностей называется скелетом фигуры. Скелет является компактным описанием фигуры, с помощью него может быть удобным распознавать фигуру. (Например, с помощью анализа структуры скелета с точки зрения топологии и как метрического графа).

Скелет можно найти с помощью морфологических операций:

Алгоритм1. A0 - исходное множество. Берем его открытие T0. Запоминаем точки A0\T0 ("\" означает разность множеств".2. A1 = эрозия(A0). Берем его открытие T1. Запоминаем точки A1\T1....Повторяем до тех пор, пока An не станет пустым множеством.

Все запомненные точки - образуют скелет множества.

ПримечаниеОписанный алгоритм простой и быстро работает. Но нужно помнить, что он неустойчив к малым возмущениями изображений. Поэтому в реальных задачах, как правило, нужно предварительно сглаживать изображение с помощью

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

Page 11: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

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

F( A )(x,y) = f( A(x1,y1): (x1,y1) из O(x,y) ) - значение фильтра определяется функцией f, заданной на окрестности пикселя, и мы рассматриваем случай, когда применяемая функция не зависит от геометрического положения пикселя.Это преобразование изображения более сложное, чем попиксельная обработка.

Примеры:(приводим формулы - для 8-связных окрестностей, но можно рассматривать любые окрестности, круги радиуса R и пр.)

1. сглаживающий фильтр F(A)(x,y) = 1/9 * sum( a=-1..1, b=-1..1 ) A(x+a, y+b)

2. минимум, максимумF(A)(x,y) = min{ A(x+a, y+b): a=-1..1, b=-1..1 }F(A)(x,y) = max{ A(x+a, y+b): a=-1..1, b=-1..1 } Примечание: для бинарных изображений минимум - это эрозия, максимум - это дилатация, поэтому, продолжая аналогию, определяют эрозию и дилатацию для полутоновых изображений как описанные min и max.

3. медианный фильтрF(A)(x,y) = медиана множества { A(x+a, y+b): a=-1..1, b=-1..1 }

Page 12: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

Метод сходящихся квадратов(Converging squares).Изобретен в 1984 году Л. Горманом.

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

Алгоритм итерационный. Считаем изображение квадратным, размером sxs.1. Берем Ts - квадрат на всё изображение.2. Строим T(s-1): в Ts имеется четыре квадрата размером s-1. Выбираем среди них тот, в котором сумма яркостей изображения максимальная, обозначаем его T(s-1).3. Строим T(s-2)...шаг s. T0 - имеет размер 1x1 пиксель, и является рещультатом работы алгоритма

Домашнее заданиеРеализовать метод сходящихся квадратов и протестировать на полутоновой картинке (нарисовать в Gimp/Photoshop).

Page 13: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

OpenCV: запись, считывание, показ изображений на экране#include "highgui.h"

Mat img = imread( "image.png" ); //считывание с дискаimwrite( "image.png", img ); //запись на диск

imshow( "image", img ); //показ на экране//после этого надо cvWaitKey(0) чтоб показалось и ждало нажатия//или cvWaitKey( N ) для ожидания N миллисекунд, например, N=1.

Page 14: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

OpenCV: дилатация и эрозия

Для этих операций нужно сначала задать изображение структурирующего элемента. Его проще всего создать с помощью функции Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1)); //форма, размер, и центральный пиксел (по умолчанию - центр картинки элемента).

где форма может быть следующей:MORPH_RECT - прямоугольникMORPH_CROSS - крестикMORPH_ELLIPSE - эллипс.

Например, для 4-связной окрестности:Mat kernel = getStructuringElement(MORPH_CROSS, cv::Size( 3, 3 ));Для 8-связной окрестности:Mat kernel = getStructuringElement(MORPH_RECT, cv::Size( 3, 3 ));

Функции эрозии и дилатации:erode( img1, img2, kernel ); dilate( img1, img2, kernel );

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

Page 15: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

OpenCV: простейшая фильтрация

Усреднение:mean( img ) - возвращает cv::Scalar.

Чтобы посчитать среднее значение 1-канального изображения в окрестности:float value = mean( img( cv::Rect( x-1, y-1, 3, 3 ) ) );

Есть функция blur - делает сглаживание квадратным окном (такие сглаживания будем подробнее далее изучать).

min, max:можно попиксельно, можно с помощью дилатации и эрозии на полутоновых изображениях.

медианная:void medianBlur(const Mat& src, Mat& dst, int ksize)Smoothes image using median filterParameters:

● src – The source 1-, 3- or 4-channel image. When ksize is 3 or 5, the image depth should be CV_8U , CV_16U orCV_32F . For larger aperture sizes it can only be CV_8U

● dst – The destination array; will have the same size and the same type as src● ksize – The aperture linear size. It must be odd and more than 1, i.e. 3, 5, 7 ...

Page 16: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

OpenCV: выделение связных областей

floodFill - выделение связных областей

Page 17: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - описание

Функция floodFill осуществляет заливку области, начиная из некоторого пиксела (x, y), с заданными границами останова,используя 4- или 8- смежность пикселов.

Важно: она портит исходное изображение - так как заливает его.

1. Чаще всего она применяются для выделения областей, выделенных путем пороговой обработки, для последующего их анализа. 2. Также ее можно использовать для удаления мелких шумов на бинарном изображении (в отличие от способа "эрозия + дилатация" - не портит границы больших областей).

3.Если расширить габаритный бокс найденной области на 1 пиксел со всех сторон и произвести заливку, то таким способом можно устранить внутренние дырки в области.

Page 18: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - список параметровОбъявление и описание списка параметров:

int floodFill(Mat& image, Point seed, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4) image - входное изображение, 1- или 3-канальное, 8 или 32-битное. seed - пиксел, с которого начать заливку rect - габаритный прямоугольник найденной области loDiff, upDiff - допустимая разность с соседями (либо - с зародышевым пикселом, если flags |= FLOODFILL_FIXED_RANGE) то есть, новый пиксел valueNew должен удовлетворять value - loDiff <= valueNew <= value + upDiff. flags = 4 или 8 - связность.

Результирующее значение - число пикселов в залитой области.

Page 19: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - список параметров

Примечание про типы OpenCV: Point - целочисленная точка с полями int x, y;Rect - целочисленный прямоугольник с полями int x, y, width, height;Scalar - представление цвета, например, Scalar( 255 ) - 1-канальный цвет, Scalar( 255, 255, 255 ) - 3-канальный цвет

Page 20: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - пример примененияЗадача - на изображении биллиардного полян найти биллиардные шары - то есть. вычислить их центры и размеры. Идея - используя результат примера с threshold, перебрать все связные области с помощью floodFill, и среди найденных областей считать шарами те, размеры которых лежат в заранее заданных границах.

const int minRectDim = 25; //макс и мин размеры шаровconst int maxRectDim = 35;

//перебор пикселов изображения for (int y=0; y<gray.rows; y++) { for (int x=0; x<gray.cols; x++) { int value = gray.at<uchar>(y, x); if ( value == 255 ) { //если значение - 255, то заливаем //значением 200 Rect rect; //сюда запишется габаритный прямоугольник

int count = floodFill( gray, Point( x, y ), Scalar( 200 ), &rect );

Page 21: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - пример применения //проверка размера if ( rect.width >= minRectDim && rect.width <= maxRectDim && rect.height >= minRectDim && rect.height <= maxRectDim ) { //центр int x = rect.x + rect.width / 2; int y = rect.y + rect.height / 2;

//радиус int rad = ( rect.width + rect.height ) / 4;

//рисуем окружность толщиной 2 пиксела circle( image, Point( x, y ), rad, Scalar( 255, 0, 255 ), 2 ); } } } } imshow( "out", image );

Page 22: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - пример применения

Page 23: Окрестность пиксела. Связность.  Метод сходящихся квадратов. Простейшие фильтры

floodFill - пример применения

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

Для реального применения, требуется более детальный анализ областей.В первую очередь это связано с тем, что если шары расположены близко друг от друга, то они могут "слипаться" в одну связную область.

Возможные подходы решения такой проблемы: 1. Залить внутренность области, выделить контур полученной области и проанализировать его участки выпуклости и вогнутости для выделения шаров.

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