ДАЛЕЧЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕНИЕ: Както се извлича информация от документи, така и от изображения. Например, если вам нужно узнать, какие пиксели в изображении являются границей, вы можете использовать следующий код:
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
edges = cv2.Canny(image, 100, 200)
```
В этом примере мы используем функцию `Canny` из библиотеки OpenCV для обнаружения границ. Первый аргумент - это изображение, которое мы хотим обработать, а второй и третий аргументы - это пороги, которые мы хотим использовать для обнаружения границ. Все пиксели с интенсивностью ниже 100 будут считаться неполезными, а все пиксели с интенсивностью выше 200 будут считаться границами. Пороги могут быть изменены в зависимости от изображения.
После того, как мы обнаружили границы, мы можем использовать функцию `findContours` для поиска контуров. Эта функция возвращает список контуров, каждый из которых представляет собой список точек (x, y) на изображении, образующих контур.
```python
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
Первый аргумент - это изображение, на котором мы ищем контуры. Второй аргумент - это метод аппроксимации контуров. В нашем случае мы используем `cv2.RETR_EXTERNAL`, чтобы получить только внешние контуры. Третий аргумент - это метод аппроксимации контуров. В нашем случае мы используем `cv2.CHAIN_APPROX_SIMPLE`, чтобы сжать горизонтальные, вертикальные и диагональные сегменты и оставить только их конечные точки.
В результате мы получаем список контуров, каждый из которых представляет собой массив точек (x, y). В нашем случае каждый контур представляет собой прямоугольник, поэтому он состоит из 4 точек.
Мы можем отрисовать все контуры на изображении, используя функцию `cv2.drawContours`:
```python
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
```
Первый аргумент - это изображение, на котором мы рисуем контуры. Второй аргумент - это список контуров. Третий аргумент - это индекс контура, который мы хотим нарисовать. Если передать `-1`, то будут нарисованы все контуры. Четвертый аргумент - это цвет контура. Пятый аргумент - это толщина линии контура.
Вот полный код:
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

### 2. Поиск контуров на изображении
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

### 3. Поиск контуров на изображении с использованием аппроксимации
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

### 4. Поиск контуров на изображении с использованием аппроксимации и фильтрации
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
if len(approx) == 4:
cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

### 5. Поиск контуров на изображении с использованием аппроксимации, фильтрации и сортировки
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
if len(approx) == 4:
x, y, w, h = cv2.boundingRect(approx)
if w > 100 and h > 100:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

### 6. Поиск контуров на изображении с использованием аппроксимации, фильтрации, сортировки и перспективы
```python
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
if len(approx) == 4:
x, y, w, h = cv2.boundingRect(approx)
if w > 100 and h > 100:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, 'Rectangle', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
В результате мы получим следующее изображение:

## Заключение
В этом уроке мы рассмотрели, как использовать фильтрацию и аппроксимацию для обнаружения контуров на изображении. Мы использовали функцию `Canny` для обнаружения границ, функцию `findContours` для поиска контуров, функцию `approxPolyDP` для аппроксимации контуров и функцию `drawContours` для отрисовки контуров на изображении. Мы также рассмотрели, как можно использовать фильтрацию и аппроксимацию для нахождения прямоугольников на изображении