openCV

[파이썬 openCV] - 이미지 데이터 공유 & 복사

이미지 값 복사

 파이썬은 기본적으로 얕은 복사(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)

copy 메소드 이용시

 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)

내부 함수 이용시