Python/OpenCV

[OpenCV 튜토리얼] 5. 관심영역 ROI(Region Of Interest)

Hannah_ko 2020. 11. 24. 09:55
SMALL

ROI는 뜻 그대로 이미지나 영상 내에서 내가 관심있는 부분을 뜻한다.

이미지 상의 특정 오브젝트나 특이점을 찾는 것을 목표로 할 때 쓴다.

(비슷한 용어로는 COI(Channel Of Interest)라는 관심 채널이 있다.)

 

이미지나 영상을 처리할 때 관심영역(ROI)를 지정하는 것은 매우 중요하다.

관심영역을 지정하는 것은 불필요한 영역에 대한 이미지 처리를 방지할 수 있어 여러 리소스를 절약할 수 있다.

 

OpenCV에서는 selectROI 함수와 selectROIs 함수를 이용해 관심영역을 지정할 수 있다.

 


 

1. ROI의 평균값으로 이미지 나타내기

import cv2
import numpy as np

src = cv2.imread("C:\\Users\\user\\Desktop\\img.jpg")
dst = np.zeros(src.shape, dtype=src.dtype)

N = 256
height, width, _ = src.shape

h = height // N
w = width // N

for i in range(N):
    for j in range(N):
        y = i * h
        x = j * w
        roi = src[y:y + h, x:x + w]
        dst[y:y + h, x:x + w] = cv2.mean(roi)[0:3]
        
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

src로 원본 이미지의 속성을 받아온 뒤, src의 크기와 데이터 타입과 같은 0으로 채워진 dst를 생성해준다.

나눌 블록의 크기를 w * h로 설정하고 x, y는 왼쪽 상단부터의 좌표를 나타낸다.

roi = src[y:y + h, x:x + w]는 원본 영상의 ROI를 계산해 그 평균값을 계산한다.

평균값을 타나내는 것으로 N의 값이 커질수록 원본 영상과 비슷해지고 N이 작을수록 원본 영상의 전체 평균 값과 비슷해져 구분하기 어려워진다.

 

N = 32
N = 256

 

2. 마우스로 ROI 영역 나타내기

import cv2

src = cv2.imread('C:\\Users\\user\\Desktop\\img.jpg')
roi = cv2.selectROI(src)

print('roi = ', roi)

img = src[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2]]

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

ROI 마우스 클릭 이벤트

 

이미지가 생성된 뒤 원하는 영역을 마우스로 클릭하게 되면 해당 영역만 선택되어 새로운 이미지가 생성된다.

그 후 생성된 이미지들을 모두 종료하면 해당 영역의 ROI 값이 출력되게 된다.

 

selected ROI

 

3. 마우스로 다중 ROI 영역 나타내기

import cv2

src = cv2.imread('C:\\Users\\user\\Desktop\\img.jpg', cv2.IMREAD_GRAYSCALE)
rects = cv2.selectROIs('src', src, False, True)

print('rects: ', rects)

for r in rects:
    cv2.rectangle(src, (r[0], r[1]), (r[0] + r[2], r[1] + r[3]), 255)
    
cv2.imshow('src', src)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.selectROIs('src', src, False, True) src라는 생성된 이미지에 격자 표시 안함(False), 마우스 클릭 위치에서 드래그하여 박스 선택(True)을 설정해준다.

하나의 박스를 생성한 후, 엔터를 누르고 또 다른 박스를 생성하고 esc를 누르면 선택한 다중 영역이 화면에 표시되고

해당 영역의 ROI값이 출력된다.

ROI 다중 영역 선택


[참고 문헌]

 

1. OpenCV reference

2. 김동근(2018), "Python으로 배우는 Open CV 프로그래밍", 가메출판사

LIST