이미지 값 복사
파이썬은 기본적으로 얕은 복사(shallow copy)이다. 얕은 복사라 함은 새로운 변수에 기존 변수를 대입하면 값이 복사가 되는 것이 아니라 메모리 주소가 복사되는 것을 말한다. 따라서 openCV로 이미지를 다룰 때 일반적인 경우에는 이미지를 공유해서 다루게 된다.
import cv2 as cv
img_gray = cv.imread('sample.png', cv.IMREAD_GRAYSCALE)
img_copyed = img_gray
print(id(img_copyed), id(img_gray))
# 아직은 똑같은 넘파이 배열
# img_gray 에 선을 그으면 img_copyed에도 동일하게 적용
cv.line(img_gray, (0, 0), (100, 100), 0, 10)
cv.imshow('Original', img_gray)
cv.imshow('Copyed', img_copyed)
cv.waitKey(0)
그렇다면 독립적으로 복사해서 다루고 싶을 땐 어떻게 해야할까? 해결 방안으로 두 가지 정도가 있다.
1. 깊은 복사(deep copy)
파이썬 copy모듈에서 copy.deepcopy( 또는 .copy() )메소드를 사용하면 된다.
import cv2 as cv
import copy
img_gray = cv.imread('sample.png', cv.IMREAD_GRAYSCALE)
# 메모리 주소 값이 아닌 값 복사
img_copyed = copy.deepcopy(img_gray)
print(id(img_copyed), id(img_gray))
# img_gray에만 적용
cv.line(img_gray, (0, 0), (100, 100), 0, 10)
cv.imshow('Original', img_gray)
cv.imshow('Copyed', img_copyed)
cv.waitKey(0)
2. openCV 내부 함수 이용
openCV의 내부 함수를 이용하게 되면 새로운 객체를 함수가 return하기 때문에, 독립적으로 사용할 수 있게 된다.
mport cv2 as cv
img_gray = cv.imread('sample.png', cv.IMREAD_GRAYSCALE)
img_copyed = img_gray
print(id(img_copyed), id(img_gray))
cv.line(img_gray, (0, 0), (100, 100), 10, 10)
# img_graya에 openCV 내부 함수를 사용하면
# 다른 객체를 return함으로 서로 다른 메모리 주소를 갖게 된다.
# 내부 함수 중 이진화 함수
ret, img_gray = cv.threshold(img_gray, 50, 255, cv.THRESH_BINARY)
print(id(img_copyed), id(img_gray))
cv.imshow('Original', img_gray)
cv.imshow('Copyed', img_copyed)
cv.waitKey(0)
'openCV' 카테고리의 다른 글
[C++ openCV 도형 인식] 게임 매직 타일 매크로 [2] (완) (0) | 2021.01.28 |
---|---|
[파이썬 openCV 도형 인식] 게임 매직타일 매크로 [1] (0) | 2021.01.27 |
[Python openCV] 유로 트럭2 반자율주행 (1) | 2021.01.25 |
[파이썬 openCV] - 트랙바로 임계값 조정하기 (0) | 2021.01.21 |
[파이썬 openCV] - 픽셀, 컬러와 흑백 이미지 (0) | 2021.01.20 |