Бинарные изображения.ppt
- Количество слайдов: 62
Бинарные изображения
План 1. Введение в компьютерное зрение. Примеры решаемых задач. Краткие основы представления изображений внутри компьютера. 2. Получение бинарных изображений. Анализ бинарных изображений. Подсчет и маркировка связанных компонент. Распространенные операции над бинарными изображениями и их практическое применение. 3. Основы распознавания образов - классификация изображений. Выделение признаков и представление объекта в виде вектора признаков. Деревья решений. Байесовский подход к принятию решений. Нейровнные сети (отсылка в сторону соответствующего курса). 4. Фильтрация изображений и обнаружение низкоуровневых признаков. Выравнивание гистограммы, удаление шума, удаление малых компонент. Сглаживание изображения. Обнаружение краев. 5. Обнаружение локальных особенностей изображения. Sift, Surf, примеры использования.
Но вначале n Open Source Computer Vision (opencv) – библиотека с набором функций по обработке изображений с целью компьютерного зрения. Поддерживает C, C++, Python (поддержка Java в процессе), работает в Windows, Linux/Mac. Os, Android.
Примеры кода https: //github. com/servy/cv
Что такое бинарное изображение Это изображение, которое состоит только из двух типов пикселей. Назовем их пиксели переднего плана и пиксели заднего плана. Обозначим их, соответственно, 1 и 0.
Пороговая бинаризация import cv full. Color. Image = cv. Load. Image(". . /Images/sos-dan. jpg") grayscale. Image = cv. Create. Image((full. Color. Image. width, full. Color. Image. height), cv. IPL_DEPTH_8 U, 1) cv. Cvt. Color(full. Color. Image, grayscale. Image, cv. CV_RGB 2 GRAY) binary. Image = cv. Create. Image((full. Color. Image. width, full. Color. Image. height), cv. IPL_DEPTH_8 U, 1) # threshold binarization threshold = 100 for i in xrange(binary. Image. height): for j in xrange(binary. Image. width): if grayscale. Image[i, j] > threshold: binary. Image[i, j] = 255 else: binary. Image[i, j] = 0 cv. Show. Image("fullcolor", full. Color. Image) cv. Show. Image("grayscale", grayscale. Image) cv. Show. Image("binary", binary. Image) cv. Wait. Key() cv. Destroy. All. Windows()
Пороговая бинаризация threshold = 100 for i in xrange(binary. Image. height): for j in xrange(binary. Image. width): if grayscale. Image[i, j] > threshold: binary. Image[i, j] = 255 else: binary. Image[i, j] = 0
Пороговая бинаризация средствами Open. Cv threshold(const Mat& src, Mat& dst, double thresh, double max. Val, int threshold. Type) src – Source array (single-channel, 8 -bit of 32 -bit floating point) dst – Destination array; will have the same size and the same type as src thresh – Threshold value max. Val – Maximum value to use with THRESH_BINARY and THRESH_BINARY_INV thre sholding types threshold. Type – Thresholding type
Пороговая бинаризация средствами Open. Cv cv. Threshold(grayscale. Image, binary. Image, 100, 255, cv. CV_THRESH_BINARY)
Бинарные изображения Пороговая бинаризация n Другие алгоритмы n
Окрестности пикселя Четырехсвязная (p[y-1, x], p[y+1, x], p[y, x 1], p[y, x+2]) n Возьмисвязная (четырехсвязная + p[y-1, x-1], p[y-1, x+1], p[y+1, x-1]) n
Маски Множества координат пикселей, которым сопоставлены различные веса. У маски есть начало координат (например, находящиеся в ее центре)
Примеры масок 1 1 1 2 4 2 1 1 1 1 1
Применение масок В результате применения маски к изображению получается выходное изображение такого же размера. Маска совмещается с изображением так, что центр маски совпадает с текущим обрабатываемым пикселем. Вес каждого пикселя маски умножается на значение соответствующего пикселя. Эти произведения складываются.
Применение масок Что делать с граничными строками и колонками, когда при наложении маски она выходит за изображение? Как правило, добавляются «виртуальные» ряды и столбцы пикселей, значения которых равны значениям граничных рядов и столбцов.
Code time! def apply. Mask. To. Pixel(image, resimage, mask, pixel, center): r = 0 mask. Sum = 0 for i in xrange(mask. height): for j in xrange(mask. width): # координаты в маске - i, j # координаты в изображении? y = pixel[0] + (i - center[0]) x = pixel[1] + (j - center[1]) r += image[y, x] * mask[i, j] mask. Sum += mask[i, j] resimage[pixel] = r / mask. Sum
Code time! full. Color. Image = cv. Load. Image(". . /Images/sos-dan. jpg") grayscale. Image = cv. Create. Image((full. Color. Image. width, full. Color. Image. height), cv. IPL_DEPTH_8 U, 1) cv. Cvt. Color(full. Color. Image, grayscale. Image, cv. CV_RGB 2 GRAY) mask = cv. fromarray(numpy. array([ [1, 2, 1], [2, 4, 2], [1, 2, 1] ])) result = cv. Create. Image((full. Color. Image. width, full. Color. Image. height), cv. IPL_DEPTH_8 U, 1) for i in xrange(1, result. height-1): for j in xrange(1, result. width-1): apply. Mask. To. Pixel(grayscale. Image, result, mask, (i, j), (1, 1)) cv. Show. Image("fullcolor", full. Color. Image) cv. Show. Image("grayscale", grayscale. Image) cv. Show. Image("result", result) cv. Wait. Key() cv. Destroy. All. Windows()
Применение маски средствами Open. Cv filter 2 D(src, ddepth, kernel[, dst[, anchor[, delta[, border. Type]]]]) src – input image. dst – output image of the same size and the same number of channels as src. ddepth – desired depth of the destination image; if it is negative, it will be the same as src. depth(); the following combinations of src. depth() and ddepth are supported: src. depth() = CV_8 U, ddepth = -1/CV_16 S/CV_32 F/CV_64 F src. depth() = CV_16 U/CV_16 S, ddepth = -1/CV_32 F/CV_64 F src. depth() = CV_32 F, ddepth = -1/CV_32 F/CV_64 F src. depth() = CV_64 F, ddepth = -1/CV_64 F when ddepth=-1, the output image will have the same depth as the source. kernel – convolution kernel (or rather a correlation kernel), a single-channel floating point matrix; if you want to apply different kernels to different channels, split the image into separate color planes usingsplit() and process them individually. anchor – anchor of the kernel that indicates the relative position of a filtered point within the kernel; the anchor should lie within the kernel; default value (-1, -1) means that the anchor is at the kernel center. delta – optional value added to the filtered pixels before storing them in dst. border. Type – pixel extrapolation method (see border. Interpolate() for details).
Применение маски средствами Open. Cv mask = cv. fromarray(numpy. array([ [1 , 2, 1], [2, 4, 2], [1, 2, 1] ]) / 16. 0) #. . . cv. Filter 2 D(grayscale. Image, result, mask, (1, 1))
Задача: подсчет объектов на изображении Например, подсчет количества отверстий на бинаризованном изображении
Одно из решений 0 0 1 Маски для нахождения углов! 0 1 1 0 0 Внешних: 0
Одно из решений Маски для нахождения углов! Внутренних: 1 1 0 0 1 1 1
Возьмем произвольную фигуру Фигура, и ее внешние и внутренние углы.
Формула! Количество объектов = (Количество внешних углов – Количество внутренних углов) / 4.
Алгоритм для подсчета количества объектов Пусть маска совпадает с пикселем, если при наложении маски на этот пиксель, все пиксели маски равны пикселям изображения, на которые они наложены.
Алгоритм для подсчета количества объектов Пусть external. Match(i, j) возвращает true, если пиксель (i, j) совпадает с любой и масок внешних углов. Пусть internal. Match(i, j) возвращает true, если пиксель (i, j) совпадает с любой и масок внутренних углов.
Алгоритм подсчета количества объектов E = 0 I = 0 for y in xrange(image. height-1): for x in xrange(image. width-1): if external. Match(y, x): E += 1 if internal. Match(y, x): I += 1 return (E - I) / 4
Маркировка связаных компонент Два пикселя a и b считаются связными по значению v, если есть такой набор пикселей p 0. . pn, что: p 0=a pn=b pi и pi+1 – соседи (находятся в окресности друга). Таким образом, последовательность p 0. . pn образует связный путь от пикселя a до пикселя b.
Маркировка связанных компонент Связанная компонента со значением v – это множество C таких пикселов, которые имеют значение v и каждая пара этих пикселов является связной по значению v.
Маркировка связанных компонент n Под маркировкой связанных компонент бинарного изображения B будем понимать формирование маркированного изображения LB, в котором каждому пикселу присвоена метка связной компоненты, к которой он принадлежит.
Алгоритмы маркировки связанных компонент Много для разных случаев. Придумайте свой .
Морфология бинарных изображений Основными операциями бинарной морфологии являются: n наращивание (dilation) n эрозия (erosion) n замыкание (closing) n размыкание (opening)
Морфология бинарных изображений Изначально – операции над множествами. n Морфология подразумевает описание свойств формы или структуры объектов. n
Структурирующие элементы
Операция переноса множества пикселей X на вектор t задается в виде: Xt = {x + t | x ∈ X}
Наращивание изображения B структурирующим элементом S обозначается U – оператор объединения
Наращивание Если пиксель=1, то применяется перенос и логическое сложение (логическое или) с соответствующими пикселами выходного бинарного изображения.
Эрозия изображения B структурирующим элементом S обозначается:
Эрозия Если каждый единичный пиксель структурирующего элемента совпадает с единичным пикселем бинарного изображения, происходит логическое сложение центрального пикселя и структурирующего элемента.
Замыкание Обозначается точкой: Вначале наращивание, потом эрозия.
Размыкание Вначале эрозия, потом наращивание.
Применение бинарной морфологии
Применение бинарной морфологии Применим: n Размыкание для разделения образов отдельных органов (DISK(13)) n Замыкание для устранения малых отверсти (DISK(2)).
Результат
Процедура инспекционного контроля шестеренок
Процедура инспекционного контроля шестеренок hole_ring – кольцо пикселов, диаметр которого немного превышает диаметр четырех внутренних отверстий. Использовался для отметки нескольких пикселей в качестве предполагаемых центров отверстий.
Процедура инспекционного контроля шестеренок
Процедура инспекционного контроля шестеренок hole_mask – шестиугольник, площадь которого немного превышает площадь внутренних отверстий.
Процедура инспекционного контроля шестеренок
Процедура инспекционного контроля шестеренок размыкание элементом gear_body (отделение зубцов), наращивание элементом sampling_ring_spacer (смещение кольца к основанию зубцов) [1], наращивание sampling_ring_width для переноса изображения кольца к вершинам зубцов. Полученный результат вычитается из [1].
Процедура инспекционного контроля шестеренок gear_body – дисковый структурирующий элемент с радиусом, равным внешнему радиусу шестеренки, уменьшенному на высоту зубца. n sampling_ring_spacer – дисковый элемент, для смещения выборочного кольца по направлению от центра. n
Процедура инспекционного контроля шестеренок n sampling_ring_width – дисковый элемент, для наращивания в направлении вершин зубцов.
Процедура инспекционного контроля шестеренок
Процедура инспекционного контроля шестеренок
Процедура инспекционного контроля шестеренок n tip_spacing – дисковый элемент, диаметр которого соответствует промежутку между зубцами.
Процедура инспекционного контроля шестеренок
n defect_cue – дисковый структурирующий элемент, предназначенный для наращивания в областях дефектов, чтобы они были явно заметны пользователям.
Нерассмотренные вопросы n n морфология - условное наращивание; свойства областей (центр тяжести, длина периметра, округлость, описывающий прямоугольник + предельные точки, моменты, длина и направление осей эллипса, главные оси). графы смежности между областями изображения. выбор порога бинаризации (по гистограмме, метод Оцу).
Бинарные изображения.ppt