Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 생성, 복사, 부분 영상 추출

AI 꿈나무 2020. 9. 25. 14:56
반응형

영상의 생성, 복사, 부분 영상 추출

 파이썬 OpenCV라이브러리를 활용해서 영상의 생성, 복사, 부분 영상 추출하는 법을 알아보겠습니다.

 

1. 지정한 크기로 새 영상 생성하기

 numpy 명령어를 이용해 배열을 생성하여 영상으로 이용할 수 있습니다.

 

 4가지 방법이 있습니다.

  (a) numpy.empty(shape, dtype=np.unit8, ...) -> arr : 임의의 값으로 초기화된 배열을 생성

  (b) numpy.zeros(shape, dtype=np.unit8, ...) -> arr : 0으로 초기화된 배열을 생성

  (c) numpy.ones(shape, dtype=np.unit8, ...) -> arr : 1로 초기화된 배열을 생성

  (d) numpy.full(shape, full_vaule, dtype=np.unit8, ...) -> arr : fill_value로 초기화된 배열을 생성

 

 shape : 각 차원의 크기. (h,w) 또는 (h,w,3)

 dtype : 원소의 데이터 타입. 일반적인 영상이면 numpy.unit8 지정

 arr : 생성된 영상(numpy.ndarry)

 

 

예제코드

# 새 영상 생성하기
img1 = np.empty((240, 320), dtype=np.uint8)       # grayscale image 임의의 value
img2 = np.zeros((240, 320, 3), dtype=np.uint8)    # color image 모든 픽셀이 0
img3 = np.ones((240, 320), dtype=np.uint8) * 128  # dark gray 모든 픽셀이 1 * 128
img4 = np.full((240, 320, 3), (0, 255, 255), dtype=np.uint8)  # yellow 픽셀을 지정


# 생성된 영상 출력
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey()
cv2.destroyAllWindows()

 

 생성된 영상을 출력한 모습입니다.

 

2. 영상의 참조 및 복사

 영상을 참조하고 복사하는 방법을 알아보겠습니다.

 

예제 코드

# 영상 복사
img1 = cv2.imread('HappyFish.jpg')

img2 = img1        # img1의 주소를 참조하므로 img1을 수정하면 img2도 변경
img3 = img1.copy() # 값을 복사해서 새로운 주소에 복사하므로 img1을 수정해도 안변함

img1.fill(255) # 모든 픽셀을 255로

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()

 

img2 = img1 은 주소를 참조하므로 img1을 수정하면 img2도 변경됩니다. 따라서 img1 or img2 를 변경하면 같이 변합니다.

img3 = img1.copy() 는 값을 복사해서 새로운 메모리에 저장합니다.

img1.fill() 로 모든 픽셀을 변경해줄 수 있습니다.

 

3. 부분 영상 추출

 부분 영상을 추출하여 픽셀의 값을 변경해주면 기존의 영상에서 추출한 영상 크기의 픽셀도 변경됩니다.

 

예제코드

# 부분 영상 추출
img1 = cv2.imread('HappyFish.jpg')

img2 = img1[40:120, 30:150]  # numpy.ndarray의 슬라이싱
img3 = img1[40:120, 30:150].copy()

img2.fill(0) # img1에서 img2 범위만큼 0으로 채워줌, img1에도 영향을 준다

# cv2.circle 원을 그려주는 함수, 50,50 좌표, 반지름 20, BGR값, 두깨는 2
cv2.circle(img2, (50, 50), 20, (0, 0, 255), 2)

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()

 img2는 img1의 부분을 추출하였고 img2을 검은색으로 수정하고 원을 그려주니 img1도 변경되었습니다.

 .copy로 복사한 img3은 아무런 영향도 받지 않았습니다.

 


 

 이상으로 영상의 생성, 복사, 부분 영상 추출하는 법을 알아보았습니다. 감사합니다.

 

반응형