@@ -24,7 +24,8 @@ def __init__(self, target_rgb_list, intensity): # 팀 주정뱅이: 30, 150, 15
24
24
25
25
self .target_rgb_list = target_rgb_list
26
26
self .target_hsv_list = None
27
- self .tolerance = None
27
+ self .pencil_tolerance = None
28
+ self .color_tolerance = None
28
29
self .intensity = intensity
29
30
30
31
self .alpha_channel = None
@@ -43,38 +44,48 @@ def masking(self, image_rgb): # important
43
44
44
45
self .masks = np .zeros (image_hsv .shape [:2 ], dtype = np .uint8 )
45
46
self .target_hsv_list = rgb_to_hsv_list (self .target_rgb_list )
47
+ if self .intensity == 0 : # 강도 약하게
48
+ self .color_tolerance = (5 , 180 , 160 ) # 튀는 색상펜 특화
49
+ self .sharp_tolerance = (150 , 30 , 60 ) # 샤프 특화
50
+ lower_min_v = 50
51
+ elif self .intensity == 1 : # 강도 중간
52
+ self .color_tolerance = (15 , 180 , 160 ) # 튀는 색상펜 특화
53
+ self .sharp_tolerance = (150 , 30 , 60 ) # 샤프 특화
54
+ lower_min_v = 30
55
+ else : # 강도 강하게
56
+ self .color_tolerance = (30 , 180 , 160 ) # 튀는 색상펜 특화
57
+ self .sharp_tolerance = (150 , 40 , 90 ) # 샤프 특화
58
+ lower_min_v = 10
59
+
46
60
for target_hsv in self .target_hsv_list :
47
61
circle_mask = None
48
- if self .intensity == 0 or (self .intensity == 1 and target_hsv [1 ] <= 25 ): # 샤프 특화
49
- self .tolerance = (150 , 35 , 80 )
50
- lower_bound = np .array ([max (0 , target_hsv [0 ] - self .tolerance [0 ]),
51
- max (0 , target_hsv [1 ] - self .tolerance [1 ]),
52
- max (50 , target_hsv [2 ] - self .tolerance [2 ])])
53
- upper_bound = np .array ([min (179 , target_hsv [0 ] + self .tolerance [0 ]),
54
- min (200 , target_hsv [1 ] + self .tolerance [1 ]),
55
- min (150 , target_hsv [2 ] + self .tolerance [2 ])])
56
- elif self .intensity == 2 or (self .intensity == 1 and target_hsv [1 ] > 25 ):
57
- self .tolerance = (30 , 180 , 160 ) # 튀는 색상펜 특화
58
- lower_bound = np .array ([max (0 , target_hsv [0 ] - self .tolerance [0 ]),
59
- max (20 , target_hsv [1 ] - self .tolerance [1 ]),
60
- max (10 , target_hsv [2 ] - self .tolerance [2 ])])
61
- upper_bound = np .array ([min (179 , target_hsv [0 ] + self .tolerance [0 ]),
62
- min (255 , target_hsv [1 ] + self .tolerance [1 ]),
63
- min (255 , target_hsv [2 ] + self .tolerance [2 ])])
64
- lower_hue = target_hsv [0 ] - self .tolerance [0 ]
65
- upper_hue = target_hsv [0 ] + self .tolerance [0 ]
66
- # 빨간색 순환처리
67
- if lower_hue < 0 :
62
+ if target_hsv [1 ] <= 25 : # 색상의 채도가 낮다면 -> 펜슬 간주
63
+ lower_bound = np .array ([max (0 , target_hsv [0 ] - self .sharp_tolerance [0 ]),
64
+ max (0 , target_hsv [1 ] - self .sharp_tolerance [1 ]),
65
+ max (lower_min_v , target_hsv [2 ] - self .sharp_tolerance [2 ])])
66
+ upper_bound = np .array ([min (180 , target_hsv [0 ] + self .sharp_tolerance [0 ]),
67
+ min (30 , target_hsv [1 ] + self .sharp_tolerance [1 ]),
68
+ min (150 , target_hsv [2 ] + self .sharp_tolerance [2 ])])
69
+ else : # 색상의 채도가 있다면 -> 색상펜 간주
70
+ lower_bound = np .array ([max (0 , target_hsv [0 ] - self .color_tolerance [0 ]),
71
+ max (20 , target_hsv [1 ] - self .color_tolerance [1 ]),
72
+ max (lower_min_v , target_hsv [2 ] - self .color_tolerance [2 ])])
73
+ upper_bound = np .array ([min (180 , target_hsv [0 ] + self .color_tolerance [0 ]),
74
+ min (255 , target_hsv [1 ] + self .color_tolerance [1 ]),
75
+ min (255 , target_hsv [2 ] + self .color_tolerance [2 ])])
76
+ lower_hue = target_hsv [0 ] - self .color_tolerance [0 ]
77
+ upper_hue = target_hsv [0 ] + self .color_tolerance [0 ]
78
+ if lower_hue < 0 : # 빨간색 순환처리
68
79
circle_lower_bound = lower_bound .copy ()
69
80
circle_upper_bound = upper_bound .copy ()
70
- circle_lower_bound [0 ] = (target_hsv [0 ] - self .tolerance [0 ] + 180 ) % 180
71
- circle_upper_bound [0 ] = 179
81
+ circle_lower_bound [0 ] = (target_hsv [0 ] - self .color_tolerance [0 ] + 180 ) % 180
82
+ circle_upper_bound [0 ] = 180
72
83
circle_mask = cv2 .inRange (image_hsv , circle_lower_bound , circle_upper_bound )
73
- elif upper_hue > 179 :
84
+ elif upper_hue > 180 :
74
85
circle_lower_bound = lower_bound .copy ()
75
86
circle_upper_bound = upper_bound .copy ()
76
87
circle_lower_bound [0 ] = 0
77
- circle_upper_bound [0 ] = (target_hsv [0 ] + self .tolerance [0 ] - 180 ) % 180
88
+ circle_upper_bound [0 ] = (target_hsv [0 ] + self .color_tolerance [0 ] - 180 ) % 180
78
89
circle_mask = cv2 .inRange (image_hsv , circle_lower_bound , circle_upper_bound )
79
90
80
91
temp_mask = cv2 .inRange (image_hsv , lower_bound , upper_bound )
0 commit comments