본문 바로가기

딥러닝(Deep Learning)/OpenCV-Python

cv2.resize의 [dsize]와 [fx,fy]의 관계(open-cv)

import cv2

# 이미지 불러오기 
image = cv2.imread("input_image.jpg", cv2.IMREAD_GRAYSCALE) # 가로x세로 = (1000,1000)이라고 가정

# 이미지의 크기를 반으로 줄이기
resized_image = cv2.resize(image, dsize=(0, 0), fx=0.5, fy=0.5)

# 결과 이미지 출력
cv2.imshow("Resized Image", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

우선 결론을 먼저 말하자면

cv2.resize()를 통해 이미지의 크기를 조절하기 위해서는 dsize와 [fx,fy] 둘 중 하나만 사용해도 된다. 

dsize=(0,0)으로 설정을 할 경우, 이미지의 크기를 0x0으로 설정하겠다는 뜻이 아니라 가로 세로 크기를 설정하지 않겠다는 뜻이다. 

그 대신 fx = 0.5, fy = 0.5를 통해 가로 픽셀 크기 500, fy=0.5를 통해 세로 픽셀 크기 500로 설정을 하고 있다. 

고로 위 코드는 아래와 같이 수정해도 똑같은 결과를 낳는다. 

import cv2

# 이미지 불러오기 
image = cv2.imread("input_image.jpg", cv2.IMREAD_GRAYSCALE) # 가로x세로 = (1000,1000)이라고 가정

# 이미지의 크기를 반으로 줄이기
resized_image = cv2.resize(image, None, fx=0.5, fy=0.5) # None으로 수정됨

# 결과 이미지 출력
cv2.imshow("Resized Image", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

cv2.resize에서 dsize와 [fx,fy]를 동시에 사용할 경우, [fx,fy]는 dszie에 영향을 주지 못한다. 

gray_small1 = cv.resize(gray,dsize=(500,200),fx=2.0,fy=2.0)
gray_small2 = cv.resize(gray,dsize=(500,200))

print("gray_small1",gray_small1.shape)
print("gray_small2",gray_small2.shape)

print(gray_small1 == gray_small2)

실행 결과

[fx,fy]를 설정을 한 것이랑 하지 않은 것이랑 이미지의 결과가 다르지 않음을 확인할 수가 있다. 

그외 여러 [fx,fy]의 상황들을 아래의 코드에 정리해 두었다. 

 가정: 원본 이미지 크기가 400x300
image = cv2.imread("input_image.jpg", cv2.IMREAD_GRAYSCALE)

# 다양한 fx, fy 값에 따른 이미지 크기 조절
resized_image_1 = cv2.resize(image, None, fx=0.5, fy=0.5)  # 축소
resized_image_2 = cv2.resize(image, None, fx=1, fy=1)      # 크기 변경 없음
resized_image_3 = cv2.resize(image, None, fx=2, fy=2)      # 확대

# 결과 이미지 크기 출력
print("Resized Image 1 Shape:", resized_image_1.shape)
print("Resized Image 2 Shape:", resized_image_2.shape)
print("Resized Image 3 Shape:", resized_image_3.shape)