본문 바로가기
OpenCV/OpenCV-Chapter

CH02 OpenCV-Python 기초(imread, mask,ROI)

by kiimy 2021. 12. 18.
728x90
728x90

OpenCV는 영상 데이터를 numpy.ndarray로 표현

img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

 

img1, img2 = np.ndarray

  •  ndim: 차원 수. len(img.shape)과 같음.
  •  shape: 각 차원의 크기. (h, w)= gray 또는 (h, w, 3) = color
  •  size: 전체 원소 개수
  •  dtype: 원소의 데이터 타입. 영상 데이터는 uint8.

그레이스케일 영상: cv2.CV_8UC1numpy.uint8, shape = (h, w)

컬러 영상: cv2.CV_8UC3numpy.uint8, shape = (h, w, 3)

영상생성

img1 = np.empty((480, 640), dtype=np.uint8) # grayscale image
img2 = np.zeros((480, 640, 3), dtype=np.uint8) # color image(but black image)
img3 = np.ones((480, 640), dtype=np.uint8) * 255 # white(연산 가능)
img4 = np.full((480, 640, 3), (0, 255, 255), dtype=np.uint8) # yellow

'''
▪ numpy.empty() 함수는 임의의 값으로 초기화된 배열을 생성
▪ numpy.zeros() 함수는 0으로 초기화된 배열을 생성
▪ numpy.ones() 함수는 1로 초기화된 배열을 생성
▪ numpy.full() 함수는 fill_value로 초기화된 배열을 생성
'''
--> arr(np.ndarray)

영상 참조

img1 = cv2.imread('HappyFish.jpg')
img2 = img1[40:120, 30:150] # numpy.ndarray의 슬라이싱
img3 = img1[40:120, 30:150].copy()
img2.fill(0)

'''
img2.fill(0) == 
img2[:, :] = (0, 0, 0)

img2, img1이 서로 공유하고 있기 때문에 img1에 crop부분 검은색
'''

Mask연산과 ROI(Region of Interest, 관심영역)

  • Region of Interest, 관심 영역(사과의 흰색부분)
  • 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

이미지를 처리함에 있어서 객체를 탐지하거나 검출하는 경우,

이부분을 명확하게 관심 영역이라 지정할 수 있다.

Mask 연산

OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상을 인자로 함께 전달해야 함

(e.g.) cv2.copyTo(), cv2.calcHist(), cv2.bitwise_연산, cv2.matchTemplate(), etc

 

마스크 영상cv2.CV_8UC1 타입(그레이스케일 영상)

마스크 영상의 픽셀 값이 0이 아닌 위치에서만 연산이 수행됨(255 흰색에서만 연산)

==> 마스크 영상으로는 0 또는 255로 구성된 이진 영상(binary image)을 사용

src = cv2.imread('airplane.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('mask_plane.bmp', cv2.IMREAD_GRAYSCALE)
dst = cv2.imread('field.bmp', cv2.IMREAD_COLOR)
cv2.copyTo(src, mask, dst)

'''
src, mask, dst는 모두 크기가 같아야 함.
src와 dst는 같은 타입이어야 하고, mask는 그레이스케일 타입의 이진 영상
'''

# NumPy의 불리언 인덱싱(Boolean indexing)을 이용한 마스크 연산
dst[mask > 0] = src[mask > 0]
728x90

댓글