OpenCV/OpenCV-Chapter
CH04 Opencv-Python Cartoon_filter
kiimy
2021. 12. 18. 18:26
def cartoon_filter(frame):
# 축소한 이미지에서 blur 진행시 단순화가 더 효과적으로 나타남
(h, w) = frame.shape[:2]
frame2 = cv2.resize(frame, (w//2, h//2)) # 영상에선 가로 * 세로
# resize안하고 그대로 진행하면 좀 느림? resize 진행하고 적용
blr = cv2.bilateralFilter(frame2, -1, 10, 5)
# 내부에서 grayscale변환함
# cv2.Canny로만 사용하면 edge가 흰색(255)가되고 배경이 검정(0)
# so, 255 - cv2.Canny() : 반전 됨
# 가장자리 검출 cv2.Canny()
edge = 255 - cv2.Canny(frame2, 60, 150)
# cv2.Canny() gray ==> BGR
edge = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
# cv2.bitwise_and 연산
dst = cv2.bitwise_and(blr, edge)
# 축소된 이미지 다시 복원
# 자연스러운 느낌보다는 값이 급격하게 바뀌는 느낌(cv2.INTER_NEAREST)
dst = cv2.resize(dst, (w,h), interpolation=cv2.INTER_NEAREST)
return dst
def pencil_sketch(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blr = cv2.GaussianBlur(gray, (0,0), 3)
# gray % blr (영상 그래프 참조)
# blr값이 더 큰 부분은 1보다 작은 값
# blr값이 더 작은 부분은 1보다 큰 값
# 255를 곱해줌으로써 edge 근방에서 어두운 영역을 검정색으로 밝은 영역은 흰색으로
dst = cv2.divide(gray, blr, scale=255)
dst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
return dst