03_color_spaces.py

Download
python 268 lines 6.7 KB
  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()