색조 채도 명도 값을 갖는 HSV 색공간을 이용해서 필터를 할것이다.
RGB가 아닌 HSV를 사용해서 필터하는 이유는 RGB는 조합에 따라 바뀌는 색이 많아서 어렵기 때문이다.
image = cv2.imread('images/truck.jpg')
# HSV에서 BLUE 색상의 범위를 정의
lower = np.array([90,0,0])
upper = np.array([135,255,255])
# 이미지를 RBG/BGR에서 HSV로 변환하여 쉽게 필터링
hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 범위 내에서 사용하여 하한과 상한 사이의 값만 캡처
mask = cv2.inRange(hsv_img, lower, upper)
# 마스크와 원래 프레임에 대해 Bitwise AND를 수행합니다
res = cv2.bitwise_and(image, image, mask=mask)
imshow('Original', image)
imshow('mask', mask)
imshow('Filtered Color Only', res)
해당 이미지의 파란색 부분만 표현하는것이 목표
그러기 위해선 파란색에 대한 상하 범위를 정의해야한다.
# HSV에서 BLUE 색상의 범위를 정의
lower = np.array([90,0,0])
upper = np.array([135,255,255])
lower = np.array([90,0,0])는 Hue가 90이고, Saturation과 Value가 최소값인 파란색을 나타내며,
upper = np.array([135,255,255])는 Hue가 135이고, Saturation과 Value가 최대값인 파란색을 나타낸다.
# 범위 내에서 사용하여 하한과 상한 사이의 값만 캡처
mask = cv2.inRange(hsv_img, lower, upper)
hsv_img을 상한 사이의 값만 캡처하면 아래 처럼 출력이 된다.
범위 내에 있는 색상들은 하얀색(255) 으로 표시되고 나머지 색상들은 검은색(0)으로 표현된다.
# 마스크와 원래 프레임에 대해 Bitwise AND를 수행합니다
res = cv2.bitwise_and(image, image, mask=mask)
그런 다음 Bitwise AND 연산을 사용해서 기존에 있던 이미지와 mask를 ADN 연산하면 MASK의 흰색픽셀은 Original 이미지의 해당 픽셀값을 유지하고
검은색(0) 픽셀은 0으로 만든다.
그래서 AND 연산을 한 이미지의 결과값은 아래와 같다.
파란색 범위 내에 있는 이미지를 제외한 나머지들은 다 검은색으로 표현이 됐다.
두가지 색상으로 이미지를 만들고싶으면 두개의 마스크를 만들고 합치면 된다.
필터할 색상은 붉은색인데 좀 넓은 붉은색을 필터해야한다.
아까와 다른점이라면 하나의 범위의 색상인지 두범위의 색상인지이다.
image = cv2.imread("./images/Hillary.jpg")
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# lower mask (0-10)
lower_red = np.array([0,0,0])
upper_red = np.array([10,255,255])
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
# upper mask (170-180)
lower_red = np.array([170,0,0])
upper_red = np.array([180,255,255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
# join masks
mask = mask0+mask1
# Perform Bitwise AND on mask and our original frame
res = cv2.bitwise_and(image, image, mask=mask)
imshow('Original', image)
imshow('mask', mask)
imshow('Filtered Color Only', res)
원본 이미지에서 붉은 계열의 색상을 필터
두개의 마스크를 합쳤기 때문에 우리가 붉은색이라고 인식하는 것 이외에도 붉은색으로 감지
아까와 동일하게 AND 연산을 하여 붉은계열을 제외하고 다 검은색으로 만들어준다.
넓은 범위의 붉은 필터를 사용했기 때문에
웜톤이신 힐러리 클린턴의 얼굴까지 나왔다.