diff --git a/Class3/README.md b/Class3/README.md index 87f497a..b35369e 100644 --- a/Class3/README.md +++ b/Class3/README.md @@ -1,43 +1,57 @@ # Третий урок 1. Morphological transformations - `Erosion` \- размытие, разрушение - - пример: [`image_erosion.py`][image_erosion] - - изменить размеры массива `kernel`, проанализировать результат - - заменить генерацию массива `np.ones` на `np.zeroes`, проанализировать - - написать размытие видеопотока с камеры; [вариант решения][video_erosion] - - подробнее о работе алгоритма размытия читать [здесь][how_to_erosion] + - Пример: [`image_erosion.py`][image_erosion] + - Изменить размеры массива `kernel`, проанализировать результат + - Заменить генерацию массива `np.ones` на `np.zeroes`, проанализировать + - Написать размытие видеопотока с камеры; [вариант решения][video_erosion] + - Подробнее о работе алгоритма размытия читать [здесь][how_to_erosion] - `Dilation` \- растяжение - - пример: [`video_dilation.py`][video_dilation] - - написать версию для обработки изображения - - подробнее о работе алгоритма растяжения читать [здесь][how_to_dilation] + - Пример: [`video_dilation.py`][video_dilation] + - Написать версию для обработки изображения + - Подробнее о работе алгоритма растяжения читать [здесь][how_to_dilation] - `Opening` & `Closing` - - `opening` \- сокращенное название для алгоритма `dilation` который обрабатывает изображение, уже подвергнутое `erosion` - - функция полезна для устранения шума - - [сравнение][video_opening] отдельной функции и соединения `erosoin & dilation` - - `closing` \- алгоритм, обратный `opening` - - кусок кода: closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) - - функция полезна для устранения мелких точек на изображении - - написать сравнение результата при обработке двумя функциями и обработке встроенной функцией + - `Opening` \- сокращенное название для алгоритма `dilation` который обрабатывает изображение, уже подвергнутое `erosion` + - Функция полезна для устранения шума + - [Сравнение][video_opening] отдельной функции и соединения `erosoin & dilation` + - `Closing` \- алгоритм, обратный `opening` + - Кусок кода: closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) + - Функция полезна для устранения мелких точек на изображении + - Написать сравнение результата при обработке двумя функциями и обработке встроенной функцией 2. Gradients - `Sobel & Scharr derivatives` (опрераторы [Собеля и Щарра][sobel_scharr]) - - [принцип работы алгоритмов][how_to_sobel] - - [пример кода][sobel_conturs] - - изменить размеры `ksize` (могут варьироваться от 1 до 31, обязательно нечётное число) - - сделать оба изображения полупрозрачными и наложить друг на друга - - даст ли нам предыдущий шаг нужные нам контуры? обьяснить почему + - [Принцип работы алгоритмов][how_to_sobel] + - [Пример кода][sobel_conturs] + - Изменить размеры `ksize` (могут варьироваться от 1 до 31, обязательно нечётное число) + - Сделать оба изображения полупрозрачными и наложить друг на друга + - Даст ли нам предыдущий шаг нужные нам контуры? обьяснить почему - `Laplacian` - - [принцип работы алгоритма][how_to_laplacian] - - [пример кода][laplscian_conturs] -3. Canny edge detector - - cтатья на [википедии][canny_edge] - - отличный туториал по алгоритму [здесь][how_to_canny] - - [реализация][canny_edge_detector] алгоритма - - изменить порог обработки (2ой и 3ий аргумент функции `cv2.Canny()`) - - скомбирировать с ранее изученными морфологическими трансфорамциями -4. `Усложненная` домашняя работа - - выделить синий канал изображения из видеопотока - - применить морфологические трансформации для устранения шумов - - сигнализировать о детекции синего объекта, путем рисования прямоугольника вокруг него + - [Принцип работы алгоритма][how_to_laplacian] + - [Пример кода][laplscian_conturs] +3. Filtration + - `Convolution` + - Фильтрация методом свертки + - Что такое свертка читать [здесь][what_is_convolution] + - Что такое свертка [понятным языком][convolution_easy] + - Реализовать программу по алгоритму, данному по ссылке выше +4. Canny edge detector + - Статья на [википедии][canny_edge] + - Отличный туториал по алгоритму [здесь][how_to_canny] + - [Реализация][canny_edge_detector] алгоритма + - Изменить порог обработки (2ой и 3ий аргумент функции `cv2.Canny()`) + - Скомбирировать с ранее изученными морфологическими трансформациями +5. `Усложненная` домашняя работа + - Сжать исходное изображение + - Выделить синий канал изображения + - Применить морфологические трансформации для устранения шумов + - Найти крайние границы редуцированного обьекта + - Сигнализировать о детекции синего объекта + - [Решение][homework] +6. Почитать к следующему занятию: + - [Fourier transformation](http://docs.opencv.org/3.1.0/de/dbc/tutorial_py_fourier_transform.html#gsc.tab=0) + - [Hough Transform](http://docs.opencv.org/3.1.0/d6/d10/tutorial_py_houghlines.html#gsc.tab=0) + - [Hough Circle Transform](http://docs.opencv.org/3.1.0/da/d53/tutorial_py_houghcircles.html#gsc.tab=0) + - [Теория](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A5%D0%B0%D1%84%D0%B0) По возникшим вопросам, писать в телеграме: @piaxar , @Somal1996 @@ -48,6 +62,7 @@ [sobel_conturs]:./src/sobel_conturs.py [laplscian_conturs]:./src/laplscian_conturs.py [canny_edge_detector]:./src/canny_edge_detector.py +[homework]:./src/homework.py [how_to_erosion]:http://homepages.inf.ed.ac.uk/rbf/HIPR2/erode.htm [how_to_dilation]:http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm [how_to_sobel]:https://habrahabr.ru/post/128753/ @@ -55,3 +70,5 @@ [how_to_canny]:http://dasl.mem.drexel.edu/alumni/bGreen/www.pages.drexel.edu/_weg22/can_tut.html [canny_edge]:https://en.wikipedia.org/wiki/Canny_edge_detector [sobel_scharr]:https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F +[what_is_convolution]:https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7) +[convolution_easy]:https://habrahabr.ru/post/62738/ diff --git a/Class3/src/homework.py b/Class3/src/homework.py new file mode 100644 index 0000000..c53ed0c --- /dev/null +++ b/Class3/src/homework.py @@ -0,0 +1,87 @@ +import cv2 +import numpy as np + + +def find_edges(array): + numrows = len(array) + numcols = len(array[0]) + + # find first white element starting from the top + # main loop is rows from 0 to the last + # inner loop is columns from 0 to the last + top, _ = find_first(array, 0, numrows, 1, 0, numcols, 1, True) + + # find first white element starting from the bottom + # main loop is rows from last to the first + # inner loop is columns from 0 to the last + bottom, _ = find_first(array, numrows-1, -1, -1, 0, numcols, 1, True) + + # find first white element starting from the left side + # main loop is columns from 0 to the most right + # inner loop is rows from 0 to the last + _, left = find_first(array, 0, numcols, 1, 0, numrows, 1, False) + + # find first white element starting from the left side + # main loop is columns from the last to thefirst + # inner loop is rows from 0 to the last + _, right = find_first(array, numcols-1, -1, -1, 0, numrows, 1, False) + return top, bottom, left, right + + +def find_first(array, first_row, second_row, dest1, + first_column, second_column, dest2, order): + # look through array until finding first nonzero element + for row in range(first_row, second_row, dest1): + for column in range(first_column, second_column, dest2): + if order and array[row, column] != 0: + return (row, column) + break + elif (not order) and array[column, row] != 0: + return (column, row) + break + # if find nothing, return zeros + return (0, 0) + +if __name__ == '__main__': + cap = cv2.VideoCapture(0) + while(1): + # get frame + ret, initial_frame = cap.read() + # reduce size of image + reduced_image = cv2.resize(initial_frame, None, fx=0.1, fy=0.1, + interpolation=cv2.INTER_LINEAR) + # convert from BGR to HSV + hsv_image = cv2.cvtColor(reduced_image, cv2.COLOR_BGR2HSV) + # boundaries of color to find + lower_blue = np.array([110, 100, 100]) + upper_blue = np.array([150, 255, 255]) + # select only pixels with color in boundaries + hsv_mask = cv2.inRange(hsv_image, lower_blue, upper_blue) + # kernel for morphological transformations + kernel = np.ones((3, 3), np.uint8) + # erode mask, to reduce noise + erosion = cv2.erode(hsv_mask, kernel, iterations=1) + # if necessary, we can apply laplacian, + # but in this example it works witout it + # laplacian = cv2.Laplacian(erosion, cv2.CV_64F) + + # get boundary pixels and multiply them by 10 + # because we reduce original image in 10 times + top, bottom, left, right = find_edges(erosion) + top = top*10 + bottom = bottom*10 + left = left*10 + right = right*10 + + # variable to check, if cropped image is nonzero + required_piece_exists = True + + if (bottom == 0) or (right == 0): + required_piece_exists = False + if required_piece_exists: + crop_image = initial_frame[top:bottom, left:right] + cv2.imshow('Blue_object', crop_image) + cv2.imshow('Original image', initial_frame) + if cv2.waitKey(20) & 0xFF == 27: + break + cv2.destroyAllWindows()