1"""
203. ์์ ๊ณต๊ฐ
3- BGR, RGB, HSV, LAB, YCrCb
4- cvtColor ๋ณํ
5- ์ฑ๋ ๋ถ๋ฆฌ/๋ณํฉ
6- ์์ ๊ธฐ๋ฐ ๊ฐ์ฒด ์ถ์ถ
7"""
8
9import cv2
10import numpy as np
11
12
13def create_color_image():
14 """๋ค์ํ ์์์ ํ
์คํธ ์ด๋ฏธ์ง ์์ฑ"""
15 img = np.zeros((300, 400, 3), dtype=np.uint8)
16
17 # ๋ฌด์ง๊ฐ ์์
18 colors = [
19 [0, 0, 255], # ๋นจ๊ฐ
20 [0, 128, 255], # ์ฃผํฉ
21 [0, 255, 255], # ๋
ธ๋
22 [0, 255, 0], # ์ด๋ก
23 [255, 255, 0], # ์ฒญ๋ก
24 [255, 0, 0], # ํ๋
25 [255, 0, 128], # ๋ณด๋ผ
26 ]
27
28 width = 400 // len(colors)
29 for i, color in enumerate(colors):
30 img[:, i*width:(i+1)*width] = color
31
32 return img
33
34
35def bgr_rgb_demo():
36 """BGR vs RGB ๋ฐ๋ชจ"""
37 print("=" * 50)
38 print("BGR vs RGB")
39 print("=" * 50)
40
41 img = create_color_image()
42
43 # OpenCV๋ BGR ์์
44 print("OpenCV๋ BGR ์์ ์ฌ์ฉ")
45 print(f"๋นจ๊ฐ์ ํฝ์
BGR: {img[150, 25]}") # [0, 0, 255]
46
47 # RGB๋ก ๋ณํ
48 rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
49 print(f"๋ณํ ํ RGB: {rgb[150, 25]}") # [255, 0, 0]
50
51 # matplotlib์ RGB ์ฌ์ฉ
52 # plt.imshow(rgb) # ์ฌ๋ฐ๋ฅธ ์์
53 # plt.imshow(img) # ์์ ๋ค๋ฐ๋
54
55 cv2.imwrite('color_bgr.jpg', img)
56 cv2.imwrite('color_rgb.jpg', rgb)
57
58
59def hsv_demo():
60 """HSV ์์ ๊ณต๊ฐ ๋ฐ๋ชจ"""
61 print("\n" + "=" * 50)
62 print("HSV ์์ ๊ณต๊ฐ")
63 print("=" * 50)
64
65 img = create_color_image()
66
67 # BGR -> HSV ๋ณํ
68 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
69
70 # HSV ์ฑ๋ ๋ถ๋ฆฌ
71 h, s, v = cv2.split(hsv)
72
73 print("HSV ๋ฒ์:")
74 print(" H (Hue): 0-179")
75 print(" S (Saturation): 0-255")
76 print(" V (Value): 0-255")
77
78 # ๋นจ๊ฐ์ ์์ญ์ HSV
79 print(f"\n๋นจ๊ฐ์ HSV: {hsv[150, 25]}")
80 print(f" H={hsv[150, 25, 0]}, S={hsv[150, 25, 1]}, V={hsv[150, 25, 2]}")
81
82 # ์ฑ๋๋ณ ์ ์ฅ
83 cv2.imwrite('hsv_h.jpg', h)
84 cv2.imwrite('hsv_s.jpg', s)
85 cv2.imwrite('hsv_v.jpg', v)
86 print("\nHSV ์ฑ๋ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
87
88 return hsv
89
90
91def color_extraction_demo():
92 """์์ ๊ธฐ๋ฐ ๊ฐ์ฒด ์ถ์ถ ๋ฐ๋ชจ"""
93 print("\n" + "=" * 50)
94 print("์์ ๊ธฐ๋ฐ ๊ฐ์ฒด ์ถ์ถ")
95 print("=" * 50)
96
97 # ๋ค์ํ ์์์ ์ด๋ฏธ์ง ์์ฑ
98 img = np.zeros((300, 400, 3), dtype=np.uint8)
99 cv2.circle(img, (100, 150), 50, (0, 0, 255), -1) # ๋นจ๊ฐ ์
100 cv2.circle(img, (200, 150), 50, (0, 255, 0), -1) # ์ด๋ก ์
101 cv2.circle(img, (300, 150), 50, (255, 0, 0), -1) # ํ๋ ์
102
103 # HSV ๋ณํ
104 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
105
106 # ๋นจ๊ฐ์ ๋ฒ์ (HSV)
107 # ๋นจ๊ฐ์์ H=0 ๋๋ H=180 ๊ทผ์ฒ
108 lower_red1 = np.array([0, 100, 100])
109 upper_red1 = np.array([10, 255, 255])
110 lower_red2 = np.array([170, 100, 100])
111 upper_red2 = np.array([180, 255, 255])
112
113 # ๋ง์คํฌ ์์ฑ
114 mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
115 mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
116 red_mask = cv2.bitwise_or(mask1, mask2)
117
118 # ๋นจ๊ฐ์ ์ถ์ถ
119 red_only = cv2.bitwise_and(img, img, mask=red_mask)
120
121 # ์ด๋ก์ ๋ฒ์
122 lower_green = np.array([40, 100, 100])
123 upper_green = np.array([80, 255, 255])
124 green_mask = cv2.inRange(hsv, lower_green, upper_green)
125 green_only = cv2.bitwise_and(img, img, mask=green_mask)
126
127 # ํ๋์ ๋ฒ์
128 lower_blue = np.array([100, 100, 100])
129 upper_blue = np.array([130, 255, 255])
130 blue_mask = cv2.inRange(hsv, lower_blue, upper_blue)
131 blue_only = cv2.bitwise_and(img, img, mask=blue_mask)
132
133 cv2.imwrite('original_circles.jpg', img)
134 cv2.imwrite('red_extracted.jpg', red_only)
135 cv2.imwrite('green_extracted.jpg', green_only)
136 cv2.imwrite('blue_extracted.jpg', blue_only)
137 print("์์ ์ถ์ถ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
138
139
140def lab_demo():
141 """LAB ์์ ๊ณต๊ฐ ๋ฐ๋ชจ"""
142 print("\n" + "=" * 50)
143 print("LAB ์์ ๊ณต๊ฐ")
144 print("=" * 50)
145
146 img = create_color_image()
147
148 # BGR -> LAB ๋ณํ
149 lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
150
151 # LAB ์ฑ๋ ๋ถ๋ฆฌ
152 l, a, b = cv2.split(lab)
153
154 print("LAB ๋ฒ์:")
155 print(" L (Lightness): 0-255")
156 print(" a (Green-Red): 0-255 (128์ด ์ค๋ฆฝ)")
157 print(" b (Blue-Yellow): 0-255 (128์ด ์ค๋ฆฝ)")
158
159 cv2.imwrite('lab_l.jpg', l)
160 cv2.imwrite('lab_a.jpg', a)
161 cv2.imwrite('lab_b.jpg', b)
162 print("LAB ์ฑ๋ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
163
164
165def ycrcb_demo():
166 """YCrCb ์์ ๊ณต๊ฐ ๋ฐ๋ชจ"""
167 print("\n" + "=" * 50)
168 print("YCrCb ์์ ๊ณต๊ฐ")
169 print("=" * 50)
170
171 img = create_color_image()
172
173 # BGR -> YCrCb ๋ณํ
174 ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
175
176 # YCrCb ์ฑ๋ ๋ถ๋ฆฌ
177 y, cr, cb = cv2.split(ycrcb)
178
179 print("YCrCb ๋ฒ์:")
180 print(" Y (Luminance): 0-255")
181 print(" Cr (Red-difference): 0-255")
182 print(" Cb (Blue-difference): 0-255")
183
184 cv2.imwrite('ycrcb_y.jpg', y)
185 cv2.imwrite('ycrcb_cr.jpg', cr)
186 cv2.imwrite('ycrcb_cb.jpg', cb)
187 print("YCrCb ์ฑ๋ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
188
189
190def grayscale_methods():
191 """๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ ๋ฐฉ๋ฒ"""
192 print("\n" + "=" * 50)
193 print("๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ")
194 print("=" * 50)
195
196 img = create_color_image()
197
198 # ๋ฐฉ๋ฒ 1: cvtColor
199 gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
200
201 # ๋ฐฉ๋ฒ 2: ๊ฐ์ค์น ํ๊ท (์ง์ ๊ณ์ฐ)
202 # Gray = 0.299*R + 0.587*G + 0.114*B
203 b, g, r = cv2.split(img)
204 gray2 = (0.299 * r + 0.587 * g + 0.114 * b).astype(np.uint8)
205
206 # ๋ฐฉ๋ฒ 3: ๋จ์ ํ๊ท
207 gray3 = np.mean(img, axis=2).astype(np.uint8)
208
209 cv2.imwrite('gray_cvtcolor.jpg', gray1)
210 cv2.imwrite('gray_weighted.jpg', gray2)
211 cv2.imwrite('gray_average.jpg', gray3)
212 print("๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ")
213
214 print(f"\n๋ณํ ๊ฒฐ๊ณผ ๋น๊ต (ํน์ ํฝ์
):")
215 print(f" cvtColor: {gray1[150, 25]}")
216 print(f" ๊ฐ์ค์น: {gray2[150, 25]}")
217 print(f" ํ๊ท : {gray3[150, 25]}")
218
219
220def color_conversion_table():
221 """์์ ๋ณํ ์ฝ๋ ํ"""
222 print("\n" + "=" * 50)
223 print("์ฃผ์ ์์ ๋ณํ ์ฝ๋")
224 print("=" * 50)
225
226 conversions = [
227 ("BGR -> Gray", "cv2.COLOR_BGR2GRAY"),
228 ("BGR -> RGB", "cv2.COLOR_BGR2RGB"),
229 ("BGR -> HSV", "cv2.COLOR_BGR2HSV"),
230 ("BGR -> LAB", "cv2.COLOR_BGR2LAB"),
231 ("BGR -> YCrCb", "cv2.COLOR_BGR2YCrCb"),
232 ("HSV -> BGR", "cv2.COLOR_HSV2BGR"),
233 ("Gray -> BGR", "cv2.COLOR_GRAY2BGR"),
234 ]
235
236 for desc, code in conversions:
237 print(f" {desc:15} -> {code}")
238
239
240def main():
241 """๋ฉ์ธ ํจ์"""
242 # BGR vs RGB
243 bgr_rgb_demo()
244
245 # HSV
246 hsv_demo()
247
248 # ์์ ์ถ์ถ
249 color_extraction_demo()
250
251 # LAB
252 lab_demo()
253
254 # YCrCb
255 ycrcb_demo()
256
257 # ๊ทธ๋ ์ด์ค์ผ์ผ
258 grayscale_methods()
259
260 # ๋ณํ ์ฝ๋ ํ
261 color_conversion_table()
262
263 print("\n์์ ๊ณต๊ฐ ๋ฐ๋ชจ ์๋ฃ!")
264
265
266if __name__ == '__main__':
267 main()