귀퉁이 서재
OpenCV - 21. 블러링을 활용한 모자이크 처리, 이미지 스케치 효과 적용하기 본문

이번 포스팅에서는 블러링을 활용한 모자이크 처리와 이미지에 스케치 효과를 적용하는 방법에 대해 알아보겠습니다. 이번 포스팅 역시 '파이썬으로 만드는 OpenCV 프로젝트(이세우 저)'를 정리한 것임을 밝힙니다.
코드: github.com/BaekKyunShin/OpenCV_Project_Python/tree/master/06.filter
블러링을 활용한 모자이크 처리
마우스로 드래그하여 선택한 부분을 블러링 효과로 모자이크 처리를 해보겠습니다. 마우스 드래그 후 엔터를 눌러주면 됩니다.
# 블러링을 활용한 모자이크 (workshop_mosaic2.py)
import cv2
ksize = 30 # 블러 처리에 사용할 커널 크기
win_title = 'mosaic' # 창 제목
img = cv2.imread('../img/taekwonv1.jpg') # 이미지 읽기
while True:
x,y,w,h = cv2.selectROI(win_title, img, False) # 관심영역 선택
if w > 0 and h > 0: # 폭과 높이가 음수이면 드래그 방향이 옳음
roi = img[y:y+h, x:x+w] # 관심영역 지정
roi = cv2.blur(roi, (ksize, ksize)) # 블러(모자이크) 처리
img[y:y+h, x:x+w] = roi # 원본 이미지에 적용
cv2.imshow(win_title, img)
else:
break
cv2.destroyAllWindows()
이미지에 스케치 효과 적용하기
카메라로 찍은 이미지에 2D 스케치 효과를 적용해보겠습니다. 세부적인 코드는 지금까지 배웠던 것들입니다.
# 스케치 효과 (workshop_painting_cam.py)
import cv2
import numpy as np
# 카메라 장치 연결
cap = cv2.VideoCapture(0)
while cap.isOpened():
# 프레임 읽기
ret, frame = cap.read()
# 속도 향상을 위해 영상크기를 절반으로 축소
frame = cv2.resize(frame, None, fx=0.5, fy=0.5, \
interpolation=cv2.INTER_AREA)
if cv2.waitKey(1) == 27: # esc키로 종료
break
# 그레이 스케일로 변경
img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 잡음 제거를 위해 가우시안 플러 필터 적용(라플라시안 필터 적용 전에 필수)
img_gray = cv2.GaussianBlur(img_gray, (9,9), 0)
# 라플라시안 필터로 엣지 검출
edges = cv2.Laplacian(img_gray, -1, None, 5)
# 스레시홀드로 경계 값 만 남기고 제거하면서 화면 반전(흰 바탕 검은 선)
ret, sketch = cv2.threshold(edges, 70, 255, cv2.THRESH_BINARY_INV)
# 경계선 강조를 위해 침식 연산
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
sketch = cv2.erode(sketch, kernel)
# 경계선 자연스럽게 하기 위해 미디언 블러 필터 적용
sketch = cv2.medianBlur(sketch, 5)
# 그레이 스케일에서 BGR 컬러 스케일로 변경
img_sketch = cv2.cvtColor(sketch, cv2.COLOR_GRAY2BGR)
# 컬러 이미지 선명선을 없애기 위해 평균 블러 필터 적용
img_paint = cv2.blur(frame, (10,10) )
# 컬러 영상과 스케치 영상과 합성
img_paint = cv2.bitwise_and(img_paint, img_paint, mask=sketch)
# 결과 출력
merged = np.hstack((img_sketch, img_paint))
cv2.imshow('Sketch Camera', merged)
cap.release()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
OpenCV - 23. 허프 변환(Hough Transformation) (0) | 2020.10.24 |
---|---|
OpenCV - 22. 컨투어(Contour) (7) | 2020.10.20 |
OpenCV - 20. 이미지 피라미드(Image Pyramid) (0) | 2020.10.12 |
OpenCV - 19. 모폴로지(Morphology) 연산 (침식, 팽창, 열림, 닫힘, 그레디언트, 탑햇, 블랙햇) (2) | 2020.10.11 |
OpenCV - 18. 경계 검출 (미분 필터, 로버츠 교차 필터, 프리윗 필터, 소벨 필터, 샤르 필터, 라플라시안 필터, 캐니 엣지) (4) | 2020.10.08 |
Comments