728x90
반응형
오늘은 opencv에 있는 GrabCut 알고리즘을 사용해보자.
GrabCut Algorithm Method:
- 초기 마스크 설정: 사용자는 초기 마스크를 설정하여 이미지의 전경(객체)과 배경을 대략적으로 지정한다. 일반적으로 사각형 영역으로 전경을 지정한다.
- 그래프 모델 생성: 이미지의 픽셀을 노드로 하는 그래프를 생성하고, 각 노드는 전경과 배경 클래스에 연결된다. 이 그래프는 두 개의 가상 노드(전경과 배경)와 연결되어 있다.
- 비용 함수 정의: 각 픽셀에 대해 전경과 배경으로 분류될 비용을 정의한다. 이 비용은 픽셀의 색상 및 주변 픽셀과의 관계를 기반으로 한다.
- 최적화: GrabCut 알고리즘을 사용하여 그래프의 최적 분할을 찾는다. 이 단계에서는 전경과 배경을 최적의 방식으로 분리하는 최적화가 수행된다.
- 최종 마스크 생성: 최적화 결과를 사용하여 최종 전경과 배경 마스크를 생성합니다.
import cv2
import numpy as np
# 이미지 불러오기
image = cv2.imread('/my_dir/person.jpg')
# 초기 마스크 설정
mask = np.zeros(image.shape[:2], np.uint8)
# 임시 배열 생성
bgd_model = np.zeros((1, 65), np.float64)
fgd_model = np.zeros((1, 65), np.float64)
# 사각형으로 전경 영역 지정 (x, y, 너비, 높이)
rect = (50, 50, 450, 290)
# GrabCut 알고리즘 적용
cv2.grabCut(image, mask, rect, bgd_model, fgd_model, 5, cv2.GC_INIT_WITH_RECT)
# 전경과 배경 분리
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
result = image * mask2[:, :, np.newaxis]
# 결과 출력
cv2.imwrite('/my_dir/cut_person/jpg',result)
cv2.imshow('Original Image', image)
cv2.imshow('GrabCut Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
오늘은 여기까지
728x90
반응형
'OpenCV' 카테고리의 다른 글
[OpenCV] 이미지 처리 (색상변환) (0) | 2024.08.18 |
---|---|
[OpenCV] 이미지 처리 (Feature Extraction) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (Canny) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (Laplacian) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (비디오 crop) (0) | 2024.08.18 |