OpenCV-Python

OpenCV Python 자르기, 붙이기

rkftks22 2021. 8. 21. 13:02

이미지 자르기는 영상, 이미지에서 특정 영역(관심 가는 부분)만 잘라내는 연산입니다.

이미지를 자르는 것을 흔히 '관심 영역 설정', RoI(Region of Interest)라고 부릅니다.

필요한 특정 영역만 잘라내어 원하는 작업을 한다면 불필요한 연산이 줄어들 것입니다.

 

 

강아지 부분만 잘라내 보겠습니다. 이미지를 자르는 것은 픽셀 값을 넣어주어야 합니다.

해당 부분에 대한 픽셀 값입니다. 자신이 원하는 부분에 픽셀 값이 몇인지 모르겠다 하시는 분들은 그림판으로 그림을

여시고 마우스를 올리시면 마우스가 위치한 곳의 픽셀 값을  아실 수 있습니다.

 

import cv2

dog = cv2.imread("imgs/dog.jpg")

output = dog[60:410, 260:520]

cv2.imshow("img", dog)
cv2.imshow("output", output)
cv2.waitKey()
cv2.destroyAllWindows()

출력 결과

output = img[60:410, 260:520]

img [높이, 너비] : [ ] 대괄호 안에 값을 넣을 때는 y값의 범위, x값의 범위 순으로 적어주셔야 합니다.

                       그렇기 때문에 저의 경우에도 y값 : 60 ~ 410이 앞에 오고 x값 : 260 ~ 520이 뒤쪽에 적었습니다.

                       해당 부분을 공백으로 적을 시 해당 부분은 처음(0)부터 끝까지가 됩니다

                       [ : , : ] : y - 0 ~ 끝, x - 0 ~ 끝(원본 이미지와 다를 게 없겠죠)

                       [100 : , : ] : y - 100 ~ 끝, x - 0 ~ 끝

                       [ : 200 , : 500] : y - 0 ~ 200, x - 0 ~ 500


자르는 작업을 통해 해당 부분에 필요한 작업을 하고 원본 사진에 붙이거나 할 수도 있습니다.

너비, 높이뿐만 아니라 채널도 맞추어주어야 합니다. 위의 이미지는 3 채널(BGR, RGB) 이미지이지만
output을 3 채널이 아닌 1 채널(GRAYSCALE) 이미지로 변환하여 붙일 시 에러가 발생합니다.

강아지 부분만 색 공간을 변경하여 원본 이미지에 붙인 것입니다.

import cv2

dog = cv2.imread("imgs/dog.jpg")

img2 = dog[60:410, 260:520]
output = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

dog[60:410, 260:520] = output

cv2.imshow("img", dog)
cv2.imshow("output", output)
cv2.waitKey()
cv2.destroyAllWindows()

 

출력 결과

dog[60:410, 260:520] = output

output을 그대로 dog [60:410, 260:520] 영역에 붙여 넣으라는 의미입니다.


아니면 반씩 나눠 한쪽은 GRAYSCALE을 한쪽은 또 다른 색변환을 하실 수도 있습니다.

너비, 높이뿐만 아니라 채널도 맞추어주어야 합니다. 위의 이미지는 3 채널(BGR, RGB) 이미지이지만
output을 3 채널이 아닌 1 채널(GRAYSCALE) 이미지로 변환하여 붙일 시 에러가 발생합니다.

이 때는 Numpy 함수인 concatenate를 사용합니다.

import cv2
import numpy as np

dog = cv2.imread("imgs/dog.jpg")

height, width, channel = dog.shape # 그림의 높이, 너비, 채널 수 받아오기
print(f'width : {width}, height = {height}, channel = {channel}') # 높이, 너비, 채널 수



img = dog[:, :335] # 저의 경우 width : 670, height = 447, channel = 3이 나와 너비의 중간값인 335를 주었습니다.
img2 = dog[:, 335:]
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

output = np.concatenate([img, img2], axis=1)  # x방향(axis=1)으로 합치기

cv2.imshow("img", dog)
cv2.imshow("output", output)
cv2.waitKey()
cv2.destroyAllWindows()

 

출력 결과

img = dog[:, :335]
img2 = dog[:, 335:]
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

output = np.concatenate([img, img2], axis=1)  # img, img2를 x방향(axis=1)으로 합치기

numpy의 concatenate 함수는 배열을 이어 붙이는 함수입니다. 이미지는 컴퓨터가 읽을 때 숫자들의 배열로 이루어져 있기 때문에 concatenate 함수를 통해 이어 붙여주는 것입니다. x축 방향으로만 이미지를 잘랐기 때문에 axis=1을 주었습니다. 만약 y축 방향으로 이미지를 자르실 경우엔 axis=0을 주시면 됩니다. 

 

 

위 사진들은 색 변환이 아닌 딥러닝을 이용하여 사진을 변환하여 붙인 것입니다. 딥러닝을 통한 작업이지만 이런 식으로 변환하여 방안의 액자 부분만 따로 변환시켜본다던가 그러면 좋을 것 같습니다.