Image Processing/Cv2

Cv2 를 이용해서 이미지 crop하고 나머지 mask 하기

jinmc 2021. 3. 3. 17:34
반응형

이미지 프로세싱을 하다보면 cropping을 할 때가 종종 있습니다.

cropping이란, 잘라내는 걸 뜻합니다.

그럼 큰 사이즈의 이미지가 작은 사이즈가 되는, 잘라지기가 시행됩니다.

import numpy as np
import cv2

image = cv2.imread('download.jpg')
y=0
x=0
h=500
w=500
crop = image[y:y+h, x:x+w]
cv2.imshow('Image', crop)
cv2.waitKey(0)
~            

 

하지만 이걸 사이즈를 그대로 유지한 채, 그 부분의 이미지만 보이고, 

나머지 부분은 mask, 즉, 검은색으로 칠하는 건 어떻게 할 수 있을까요?

이런 식의 cropping은 특정한 부위에서만 이미지 프로세싱이 필요할 때 필요합니다

 

import numpy as np
import cv2

image = cv2.imread('download.jpg')

# roi 좌표 정리 시작
roi = "0,0,300,0,300,300,0,300"
cl = roi.split(",")
clist = []
for i in range(0, len(cl), 2):
    clist.append([int(cl[i]), int(cl[i+1])])
# 여기까지 roi 좌표 정리

mask = np.zeros((image.shape[0], image.shape[1])) # 검은색 그림판 제공
pts = np.array(clist) # roi 를 numpy list로 변환

cv2.fillConvexPoly(mask, pts, 1) # 검은색 도화지에 흰색으로 칠함
mask = mask.astype(np.bool) # 0 과 1을 true 랑 false로 바꿈

out = np.zeros_like(image) # image 와 같은 size의 0으로 가득한 array를 만듬
out[mask] = image[mask] # mask의 true 인 곳만 나오게 함!

주석으로 코드 설명을 다 해놨네요.

결과물은,

 

 

이런 것이,

 

이렇게 됨을 볼 수 있습니다.

반응형