-
Notifications
You must be signed in to change notification settings - Fork 0
/
basic_image_processing.py
144 lines (111 loc) · 6.27 KB
/
basic_image_processing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import cv2
import numpy as np
from introduction_to_image_operations import show_image
def make_images_in_different_color_spaces(image: np.ndarray) -> dict:
"""
Функция перевода исходного изображения в различные цветовые пространства и компановка их в словарь
Parameters
----------
image : np.ndarray
Изображение в виде матрицы чисел
Returns
-------
dict
Словарь изображений в разных цветовых пространствах, ключ словаря - цветовое пространство, значение -
изображение в виде матрицы чисел
"""
color_spaces = ('RGB', 'XYZ', 'HSV', 'HLS', 'LAB', 'LUV', 'YUV', 'GRAY')
color_images = {color: cv2.cvtColor(image, getattr(cv2, 'COLOR_BGR2' + color))
for color in color_spaces}
color_images['BGR'] = image
color_images['CMYK'] = bgr2cmyk(image)
return color_images
def bgr2cmyk(image: np.ndarray) -> np.ndarray:
"""
Функция перевода изображения из цветового пространства bgr в цветовое пространство cmyk
Parameters
----------
image : np.ndarray
Изображение в виде матрицы чисел
Returns
-------
np.ndarray
Изображение в виде матрицы чисел
"""
image = image.astype(float) / 255.
k = 1 - np.max(image, axis=2)
c = (1 - image[..., 2] - k) / (1 - k)
m = (1 - image[..., 1] - k) / (1 - k)
y = (1 - image[..., 0] - k) / (1 - k)
image_cmyk = (np.dstack((c, m, y, k)) * 255).astype(np.uint8)
return image_cmyk
def main():
# Загрузка изображение и отображение его на экране
image = cv2.imread("data/images/pcb.jpg")
show_image(image, 'Изначальное изображение')
# Перевод изображения в различные цветовые пространства
color_space_images = make_images_in_different_color_spaces(image)
for space in color_space_images:
show_image(image=color_space_images[space], image_title=space)
# Разделение изображение на каналы
b, g, r = cv2.split(image)
show_image(b, 'Синий канал')
show_image(g, 'Зеленый канал')
show_image(r, 'Красный канал')
# Обработка одного из каналов изображения с помощью базовых мат. операций
b, g, r = cv2.split(color_space_images['BGR'])
show_image(r, 'Красный канал до обработки')
r = r * 4
show_image(r, 'Увеличение значений красного канаала в 4 раза')
r = r + 5
show_image(r, 'Увеличение значений красного канаала на 5')
r = (r / 2)
r = cv2.normalize(r, None, 255, 0, cv2.NORM_MINMAX, cv2.CV_8UC1)
show_image(r, 'Уменьшение значений красного канаала в 2 раза')
r = r - 2
show_image(r, 'Уменьшение значений красного канаала на 2')
# Объединение каналов разделенного изображения
merged_image = cv2.merge((b, g, r))
show_image(merged_image, 'Изображение из объединенных каналов')
# Тестирование низкочастотных фильтров
image_blur = cv2.blur(image, (20, 20))
show_image(image_blur, 'Изображение обработанное функцией blur')
image_gaussian_blur = cv2.GaussianBlur(image, (19, 19), 0)
show_image(image_gaussian_blur, 'Изображение обработанное функцией GaussianBlur')
image_median_blur = cv2.medianBlur(image, 19)
show_image(image_median_blur, 'Изображение обработанное функцией medianBlur')
image_bilateral_filter = cv2.bilateralFilter(image, 9, 75, 75)
show_image(image_bilateral_filter, 'Изображение обработанное функцией bilateralFilter')
# Тестирование высокочастотных фильтров
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_canny = cv2.Canny(image_gray, 50, 150)
show_image(image_canny, 'Изображение обработанное функцией Canny')
image_laplacian = cv2.Laplacian(image_gray, cv2.CV_64F, ksize=3)
image_laplacian = cv2.convertScaleAbs(image_laplacian)
show_image(image_laplacian, 'Изображение обработанное функцией Laplacian')
grad_sobel_x = cv2.convertScaleAbs(cv2.Sobel(image_gray, cv2.CV_16S, 1, 0))
grad_sobel_y = cv2.convertScaleAbs(cv2.Sobel(image_gray, cv2.CV_16S, 0, 1))
grad_sobel_x = cv2.convertScaleAbs(grad_sobel_x)
grad_sobel_y = cv2.convertScaleAbs(grad_sobel_y)
image_sobel = cv2.addWeighted(grad_sobel_x, 0.5, grad_sobel_y, 0.5, 0)
show_image(image_sobel, 'Изображение обработанное функцией Sobel')
grad_scharr_x = cv2.Scharr(image_gray, cv2.CV_16S, 1, 0)
grad_scharr_y = cv2.Scharr(image_gray, cv2.CV_16S, 0, 1)
grad_scharr_x = cv2.convertScaleAbs(grad_scharr_x)
grad_scharr_y = cv2.convertScaleAbs(grad_scharr_y)
image_scharr = cv2.addWeighted(grad_scharr_x, 0.5, grad_scharr_y, 0.5, 0)
show_image(image_scharr, 'Изображение обработанное функцией Scharr')
# Поиск границ золотой подложки
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(image)
v += 255
image = cv2.merge((h, s, v))
image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.medianBlur(image, 19)
image_x = cv2.convertScaleAbs(cv2.Scharr(image, cv2.CV_16S, 1, 0))
image_y = cv2.convertScaleAbs(cv2.Scharr(image, cv2.CV_16S, 0, 1))
image = cv2.addWeighted(image_x, 0.5, image_y, 0.5, 0)
show_image(image, 'Поиск границ золотой подложки')
if __name__ == '__main__':
main()