[opencv-python] roi 및 속성, 채널

2019. 7. 2. 02:50Python-이론/python-opencv

이번에 해볼 것은 제목의 roi설정 뿐만 아니라 속성을 가져오고 채널을 분할하고 합치는 것을 해보겠습니다. 

 

속성을 가져오기 

코드

import numpy as np
import cv2

img = cv2.imread("../resource/Images/ipad.jpeg")

print(img.shape)
print(img.size)
print(img.dtype)

결과

 

이미지 ROI 

이미지를 처리할 때 특정 영역에서 작업이 이루어지는 경우가 있습니다. 이럴 때 ROI를 사용하여 특정 구역을 인덱싱하여 사용할 수 있습니다. 

 

코드

import numpy as np
import cv2

img = cv2.imread("../resource/Images/ipad.jpeg")
cv2.namedWindow('original', cv2.WINDOW_NORMAL)
cv2.imshow('original', img)

subImg = img[300:400, 350:750]
cv2.namedWindow('cutting', cv2.WINDOW_NORMAL)
cv2.imshow('cutting', subImg)

print(img.shape)
print(subImg.shape)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

코드 설명

img[300:400, 350 : 750]

사용하여 x축 300에서 400까지 y축 350에서 750까지의 구역을 짤라서 보여 줄 수 있다. 

 

결과

왼쪽 오리지널 오른쪽 cutting

이미지 채널 분할 및 합치기

필요시 컬러 이미지의 경우 B, G, R을 채널 별로 픽셀값을 따로 분리해 놓을 수 있다. 그리고 분리한 b, g, r을 다시 합칠 수 도 있습니다. 

 

색 분리 해주는 코드

import numpy as np
import cv2

img = cv2.imread("../resource/Images/ipad.jpeg")

b, g, r = cv2.split(img)

print(img[100, 100])
print(b[100, 100], g[100, 100], r[100, 100])

 

코드 설명 

b, g, r = cv2.split(img)

split을 통해서 이미지의 bgr값을 분리할 수 있습니다. 예를 들어서 위의 코드처럼 b, g, r을 채널별로 나눌 수 있습니다. 

 

결과

 

분리한 채널 보여주기

import numpy as np
import cv2

img = cv2.imread("../resource/Images/ipad.jpeg")

b, g, r = cv2.split(img)


def showImage(window, img):
    cv2.namedWindow(window, cv2.WINDOW_NORMAL)
    cv2.imshow(window, img)


showImage("original", img)
showImage("b", b)
showImage("g", g)
showImage("r", r)

cv2.waitKey(0)
cv2.destroyAllWindows()

분리된 채널의 값을 imshow에 넣어 주었습니다.

결과

분리한 채널을 다시 합치기 코드

mergeImage = cv2.merge((b, g, r))
showImage("merge", mergeImage)

merge 후 showImage에 배열과 window이름을 추가해주면 아래와 같이 원본 사진이 나온다. 

결과

Appendix

split은 성능상으로 좋지 못하다 그래서 numpy inexing을 사용해주면 더 효율적으로 사용할 수 있다. 

b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]