Неделя 2 - Базовые операции с изображениями
1. Изменение размера изображения
Функция cv2.resize() позволяет изменять размер изображения с различными методами интерполяции.
Основные методы интерполяции:
cv2.INTER_LINEAR (билинейная, по умолчанию)
cv2.INTER_NEAREST (ближайший сосед)
cv2.INTER_CUBIC (бикубическая)
cv2.INTER_AREA (лучше для уменьшения)
python
Copy
import cv2
image = cv2.imread("image.jpg")
# Изменение размера до 400x400
resized = cv2.resize(image, (400, 400), interpolation=cv2.INTER_LINEAR)
# Изменение с сохранением пропорций
height, width = image.shape[:2]
scale = 0.5 # Уменьшение в 2 раза
resized_proportional = cv2.resize(image, (int(width*scale), int(height*scale)))
cv2.imshow("Original", image)
cv2.imshow("Resized", resized)
cv2.imshow("Resized Proportional", resized_proportional)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. Обрезка изображений (Cropping)
Обрезка выполняется с помощью слайсинга NumPy массива.
python
Copy
# Обрезка области (y1:y2, x1:x2)
cropped = image[100:300, 200:400] # Высота 200px, ширина 200px
# Автоматическая обрезка центра
height, width = image.shape[:2]
start_row, start_col = int(height*0.25), int(width*0.25)
end_row, end_col = int(height*0.75), int(width*0.75)
cropped_center = image[start_row:end_row, start_col:end_col]
cv2.imshow("Cropped", cropped)
cv2.imshow("Center Cropped", cropped_center)
cv2.waitKey(0)
3. Поворот изображения
Поворот выполняется с помощью матрицы преобразования.
(1) Поворот на произвольный угол
python
Copy
height, width = image.shape[:2]
center = (width//2, height//2)
# Матрица поворота (центр, угол, масштаб)
rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0) # 45 градусов
rotated = cv2.warpAffine(image, rotation_matrix, (width, height))
(2) Поворот с обрезкой черных областей
python
Copy
# Вычисление новых размеров после поворота
angle = 30
new_height = int(width * abs(np.sin(np.radians(angle))) + int(height * abs(np.cos(np.radians(angle))))
new_width = int(height * abs(np.sin(np.radians(angle))) + int(width * abs(np.cos(np.radians(angle))))
# Корректировка матрицы поворота
rotation_matrix[0, 2] += (new_width - width) / 2
rotation_matrix[1, 2] += (new_height - height) / 2
rotated_no_black = cv2.warpAffine(image, rotation_matrix, (new_width, new_height))
4. Арифметические операции с изображениями
OpenCV поддерживает поэлементные операции.
(1) Сложение изображений
python
Copy
added = cv2.add(image1, image2) # Ограничение на 255
(2) Вычитание изображений
python
Copy
subtracted = cv2.subtract(image1, image2) # Ограничение на 0
(3) Наложение с прозрачностью
python
Copy
alpha = 0.7 # Вес первого изображения
beta = 0.3 # Вес второго изображения
blended = cv2.addWeighted(image1, alpha, image2, beta, 0)
5. Битвые операции
Полезны для работы с масками.
python
Copy
# Создание прямоугольника и круга
rectangle = np.zeros((300, 300), dtype="uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
circle = np.zeros((300, 300), dtype="uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
# Битвые операции
bitwise_and = cv2.bitwise_and(rectangle, circle)
bitwise_or = cv2.bitwise_or(rectangle, circle)
bitwise_xor = cv2.bitwise_xor(rectangle, circle)
bitwise_not = cv2.bitwise_not(rectangle)
6. Практическое задание
1. Загрузите изображение и измените его размер до 50% от оригинала.
2. Обрежьте центральную область размером 200x200 пикселей.
3. Поверните изображение на 30 градусов с сохранением всех пикселей.
4. Создайте маску с кругом и примените битвые операции к изображению.
7. Итоги
Изменение размера: cv2.resize()
Обрезка: слайсинг массива
Поворот: cv2.getRotationMatrix2D() + cv2.warpAffine()
Арифметические операции: cv2.add(), cv2.subtract()
Битвые операции: AND, OR, XOR, NOT
Следующая тема: Работа с цветами и цветовыми пространствами.