티스토리 뷰

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
##OpenCV 임포트
import cv2
import matplotlib.pyplot as plt
 
##image를 RGB 형태로 리드, 이를 Space(공간)
image = cv2.imread(test_df['img_path'][9000])
 
##grabcut 적용 s 
##cvtColor는 색의 공간변화 (데이터, 옵션값)
image_rgb = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
##전경이미지 추출 사각형 세팅
rect = (120,70180300)
 
#3차원 벡터에서 HW 2차원으로 0이 H*W로 만든 2차원 벡터 초기 마스킹생성
mask = np.zeros(image_rgb.shape[:2], np.uint8)
# grabCut에 사용할 임시 배열 생성
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)
#grabCut 
cv2.grabCut(image_rgb, # 색변환 이미지
           mask,       # 마스크
           rectangle,  # 사각형
           bgdModel,   # 배경을 위한 임시 배열
           fgdModel,   # 전경을 위한 임시 배열 
           5,          # 반복 횟수
           cv2.GC_INIT_WITH_RECT) # 사각형을 위한 초기화)
 
# 배경인 곳은 0, 그 외에는 1로 설정한 마스크 생성
mask_2 = np.where((mask==2| (mask==0), 01).astype('uint8')
 
#np.newaxis 차원증가 2차원->3차원
image_nobg= image_rgb * mask_2[:,:, np.newaxis]
 
#시각화 
plt.figure(figsize=(20,8))
ax1 = plt.subplot(2,2,1)
ax1.imshow(image_nobg)
ax2 = plt.subplot(2,2,2)
ax2.imshow(image)
plt.show()
 
##shape 확인
print(image_nobg.shape)
print(image.shape)
##grabcut 적용 E
 
cs

 

시각화 확인 

좌측이 배경이 제거된 이미지 우측이 원본사진

위 결과를 보면 배경이 제거 안된부분이 있다 이럴때는 매뉴얼로 마스킹을 해줘야 한다고 하는데.

자동으로 배경제거 하는방법을 더 찾아서 업데이트 예정