Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab7 / ИССЛабораторная №7

.docx
Скачиваний:
0
Добавлен:
10.05.2024
Размер:
6.82 Mб
Скачать

Лабораторная работа №7

Цель работы: практически ознакомится с методами сегментации, методами обработки изображения в Python

Ход работы

Выбрали произвольное цветное изображение, которое содержит разнообразие оттенков и цветовых сочетаний.

Загрузили изображения и инициализировали библиотеки

import cv2 import numpy as np # Считываем изображение image = cv2.imread('parrot.jpg')

Создали копии изображения, к которым применили операции увеличение и уменьшение разрешения.

resized_image = cv2.resize(image,None, fx=1.5, fy=1.5, interpolation=cv2.INTER_LINEAR) cv2.imshow( 'Resized Image', resized_image) # Уменьшение размера изображения resized_image = cv2.resize(image, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) cv2.imshow( 'Resized Image', resized_image)

Рисунок 1 –Уменьшенное

Создали копии изображения, к которым применили операции дилатации с разными ядрами.

# Дилатация с разными ядрами kernel1 = np.ones((5, 5), np.uint8) dilation1 = cv2.dilate(image, kernel1, iterations=1) cv2.imshow('Dilation Kernel 1', dilation1) kernel2 = np.ones((7, 7), np.uint8) dilation2 = cv2.dilate(image, kernel2, iterations=1) cv2.imshow('Dilation Kernel 2', dilation2) kernel3 = np.ones((9, 9), np.uint8) dilation3 = cv2.dilate(image, kernel3, iterations=1) cv2.imshow('Dilation Kernel 3', dilation3)

Фильтр Дилатация увеличивает область изображения, расширяя его пиксели и тем самым способствуя объединению областей изображения, которые были разделены шумом и др.

Рисунок 2 – Дилатация 1

Рисунок 3 – Дилатация 2

Рисунок 4 – Дилатация 3

Создали копии изображения, к которым применили операции эрозии с разными ядрами.

# Эрозия с разными ядрами erosion1 = cv2.erode(image, kernel1, iterations=1) cv2.imshow('Erosion Kernel 1', erosion1) erosion2 = cv2.erode(image, kernel2, iterations=1) cv2.imshow('Erosion Kernel 2', erosion2) erosion3 = cv2.erode(image, kernel3, iterations=1) cv2.imshow('Erosion Kernel 3', erosion3)

Фильтр Эрозия уменьшает область изображения, приводя к истончению пикселей, расширяя и усиливая светлые места на изображении. Суть данного преобразования состоит в том, что нежелательные вкрапления и шумы размываются, а большие и, соответственно, значимые участки изображения изменениям не подвергаются.

.

Рисунок 5 – Эрозия 1

Рисунок 6 – Эрозия 2

Рисунок 7 – Эрозия 3

Создали копии изображения, к которым применили операции размытия.

# Размытие изображения билатеральное и Гауссово bilateral_blur = cv2.bilateralFilter(image, 9, 75, 75) cv2.imshow('Bilateral Blur', bilateral_blur) gaussian_blur = cv2.GaussianBlur(image, (9, 9), 8) cv2.imshow('Gaussian Blur', gaussian_blur)

Эффект «Двустороннее размытие» выполняет выборочное размытие изображение, сохраняя края и другие детали.

Рисунок 8 –Двустороннее размытие

Рисунок 9 –Гаусс

Создали копии изображения, которые перевели в разные цветовые пространства.

# Перевод в цветовые пространства HSV, YCbCr, Lab hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) cv2.imshow('HSV Image', hsv_image) ycbcr_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb) cv2.imshow('YCbCr Image', ycbcr_image) lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) cv2.imshow('Lab Image', lab_image)

Рисунок 10 – HSV тон, насыщенность, яркость

Рисунок 11 –Цветовое пространства YCbCr

Рисунок 12 –Цветовое пространство Lab

Создали копии изображения, к которым применили операции изменения яркости изображения.

# Применение трех методов изменения яркости изображения brightened_image1 = cv2.convertScaleAbs(image, alpha=1.2, beta=50) cv2.imshow('Brightened Image 1', brightened_image1) brightened_image2 = cv2.convertScaleAbs(image, alpha=38, beta=0) cv2.imshow('Brightened Image 2', brightened_image2) brightened_image3 = cv2.addWeighted(image, 1.5, np.zeros(image.shape, dtype=np.uint8), 8, 0) cv2.imshow('Brightened Image 3', brightened_image3)

Рисунок 13 – Яркое изображение 1

Рисунок 14 – Яркое изображение 2

Рисунок 15 – Яркое изображение 3

Создали копию изображения, к которой применили цветовую сегментацию.

# Сегментация по цветовому порогу

lower_red = np.array([0, 100, 100]) upper_red = np.array([10, 255, 255])

# Создание маски, она накладывается на исходное изображение mask = cv2.inRange(image, lower_blue, upper_blue) segmented_image = cv2.bitwise_and(image, image, mask=mask) cv2.imshow('Color Thresholding', segmented_image)

Рисунок 16 –Маска на исходное изображение

Создали копию изображения, к которой применили сегментацию по краям объектов, варьировали параметры, пока не получилось отделить края объектов.

# Обнаружение граней edges = cv2.Canny(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 108, 208) cv2.imshow('Edges', edges)

Рисунок 17 – Обнаружение граней

Для изображения выбрали пороги цветовой изображения для красного цвета.

lower_red = np.array([0, 100, 100]) upper_red = np.array([10, 255, 255])

Перевели сегментированное изображение в бинарное изображение, заполнили в объектах полые участки и удалили объекты меньших n пикселей, n выбрали исходя из полученного изображения.

# Преобразование сегментированного изображения в бинарное binary_image = cv2.cvtColor(segmented_image, cv2.COLOR_BGR2GRAY) ret, binary_image = cv2.threshold(binary_image, 8, 255, cv2.THRESH_BINARY) # Заполнение полых участков contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) filled_image = np.zeros_like(binary_image) for contour in contours: cv2.fillPoly(filled_image, [contour], 255) # Удаление объектов меньших размеров n = 100 # Пороговое значение для удаления объектов меньше и пикселей contours, _ = cv2.findContours(filled_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: if cv2.contourArea(contour) < n: cv2.fillPoly(filled_image, [contour], color=0) # Отображение бинарного изображения cv2.imshow('Filled Binary Image', filled_image) cv2.waitKey(0) cv2.destroyAllWindows()

Рисунок 18 – Отображение бинарного изображения

Листинг программы:

import cv2 import numpy as np # Считываем изображение image = cv2.imread('parrot.jpg') # Увеличение размера изображения resized_image = cv2.resize(image,None, fx=1.5, fy=1.5, interpolation=cv2.INTER_LINEAR) cv2.imshow( 'Resized Image', resized_image) # Уменьшение размера изображения resized_image = cv2.resize(image, None, fx=0.5, fy=8.5, interpolation=cv2.INTER_LINEAR) cv2.imshow( 'Resized Image', resized_image) # Дилатация с разными ядрами kernel1 = np.ones((5, 5), np.uint8) dilation1 = cv2.dilate(image, kernel1, iterations=1) cv2.imshow('Dilation Kernel 1', dilation1) kernel2 = np.ones((7, 7), np.uint8) dilation2 = cv2.dilate(image, kernel2, iterations=1) cv2.imshow('Dilation Kernel 2', dilation2) kernel3 = np.ones((9, 9), np.uint8) dilation3 = cv2.dilate(image, kernel3, iterations=1) cv2.imshow('Dilation Kernel 3', dilation3) # Эрозия с разными ядрами erosion1 = cv2.erode(image, kernel1, iterations=1) cv2.imshow('Erosion Kernel 1', erosion1) erosion2 = cv2.erode(image, kernel2, iterations=1) cv2.imshow('Erosion Kernel 2', erosion2) erosion3 = cv2.erode(image, kernel3, iterations=1) cv2.imshow('Erosion Kernel 3', erosion3) # Размытие изображения билатеральное и Гауссово bilateral_blur = cv2.bilateralFilter(image, 9, 75, 75) cv2.imshow('Bilateral Blur', bilateral_blur) gaussian_blur = cv2.GaussianBlur(image, (9, 9), 8) cv2.imshow('Gaussian Blur', gaussian_blur) # Перевод в цветовые пространства HSV, YCbCr, Lab hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) cv2.imshow('HSV Image', hsv_image) ycbcr_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb) cv2.imshow('YCbCr Image', ycbcr_image) lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) cv2.imshow('Lab Image', lab_image) # Применение трех методов изменения яркости изображения brightened_image1 = cv2.convertScaleAbs(image, alpha=1.2, beta=50) cv2.imshow('Brightened Image 1', brightened_image1) brightened_image2 = cv2.convertScaleAbs(image, alpha=38, beta=0) cv2.imshow('Brightened Image 2', brightened_image2) brightened_image3 = cv2.addWeighted(image, 1.5, np.zeros(image.shape, dtype=np.uint8), 8, 0) cv2.imshow('Brightened Image 3', brightened_image3) # Сегментация по цветовому порогу lower_red = np.array([0, 100, 100]) upper_red = np.array([10, 255, 255]) # Создание маски, она накладывается на исходное изображение mask = cv2.inRange(image, lower_red, upper_red) segmented_image = cv2.bitwise_and(image, image, mask=mask) cv2.imshow('Color Thresholding', segmented_image) # Обнаружение граней edges = cv2.Canny(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 108, 208) cv2.imshow('Edges', edges) # Преобразование сегментированного изображения в бинарное binary_image = cv2.cvtColor(segmented_image, cv2.COLOR_BGR2GRAY) ret, binary_image = cv2.threshold(binary_image, 8, 255, cv2.THRESH_BINARY) # Заполнение полых участков contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) filled_image = np.zeros_like(binary_image) for contour in contours: cv2.fillPoly(filled_image, [contour], 255) # Удаление объектов меньших размеров n = 100 # Пороговое значение для удаления объектов меньше и пикселей contours, _ = cv2.findContours(filled_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: if cv2.contourArea(contour) < n: cv2.fillPoly(filled_image, [contour], color=0) # Отображение бинарного изображения cv2.imshow('Filled Binary Image', filled_image) cv2.waitKey(0) cv2.destroyAllWindows()

Вывод: в ходе лабораторной работы ознакомились ознакомится с методами сегментации, методами обработки изображения в Python