Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 49 additions & 32 deletions Class3/README.md
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -48,10 +62,13 @@
[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/
[how_to_laplacian]:http://robocraft.ru/blog/computervision/460.html
[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/
87 changes: 87 additions & 0 deletions Class3/src/homework.py
Original file line number Diff line number Diff line change
@@ -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()