Lab7 / ИССЛабораторная №7
.docxЛабораторная работа №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