영상의 생성, 복사, 부분 영상 추출
파이썬 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은 아무런 영향도 받지 않았습니다.
이상으로 영상의 생성, 복사, 부분 영상 추출하는 법을 알아보았습니다. 감사합니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 그리기 함수 - line, rectangle, circle, polyines, putText (0) | 2020.09.25 |
---|---|
[파이썬 OpenCV] 마스크 연산과 ROI - cv2.copyTo 함수 이용 방법 (0) | 2020.09.25 |
[파이썬 OpenCV] 영상의 속성과 픽셀 값 참조 (0) | 2020.09.25 |
[파이썬 OpenCV] 이미지 슬라이드 쇼 - Image Slide Show (0) | 2020.09.25 |
[파이썬 OpenCV] Matplotlib를 이용한 영상 출력 (0) | 2020.09.25 |