Filtering Colors

김성빈·2024년 5월 3일
0

Modern Computer Vision

목록 보기
24/117

목표

  1. HSV 색공간을 이용하여 색별로 필터링하는 방법

색조 채도 명도 값을 갖는 HSV 색공간을 이용해서 필터를 할것이다.

RGB가 아닌 HSV를 사용해서 필터하는 이유는 RGB는 조합에 따라 바뀌는 색이 많아서 어렵기 때문이다.

1. HSV 색공간을 이용하여 색별로 필터링하는 방법

A. 한가지색 필터

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 연산을 한 이미지의 결과값은 아래와 같다.

파란색 범위 내에 있는 이미지를 제외한 나머지들은 다 검은색으로 표현이 됐다.

B. 두가지색 필터

두가지 색상으로 이미지를 만들고싶으면 두개의 마스크를 만들고 합치면 된다.

필터할 색상은 붉은색인데 좀 넓은 붉은색을 필터해야한다.

아까와 다른점이라면 하나의 범위의 색상인지 두범위의 색상인지이다.

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 연산을 하여 붉은계열을 제외하고 다 검은색으로 만들어준다.

넓은 범위의 붉은 필터를 사용했기 때문에

웜톤이신 힐러리 클린턴의 얼굴까지 나왔다.

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글