image = cv.imread('balls.png')
# 원하는 크기로 변경
height, width, channel = image.shape # 원래의 크기
new_size = (width // 2, height // 2) # 새로운 크기(원래 크기의 절반)
image = cv.resize(image, new_size) # 크기 변경
show(image)
# 비율로 변경
image = cv.resize(image, (0, 0), fx=0.5, fy=0.5) # 가로, 세로 각각 50% 크기로 축소
show(image)
보간
big = cv.resize(image, None, fx=2.0, fy=2.0, interpolation=cv.INTER_LANCZOS4)
# 가로 2배, 세로 2배로 확대
이미지를 확대, 축소할 때 새로운 픽셀들은 기존의 픽셀을 보간하여 사용
확대:
INTER_NEAREST: 주변 픽셀을 이용. 가장 빠르지만 화질이 낮음
INTER_LINEAR: 주변 2x2 이웃 픽셀을 사용
INTER_CUBIC: 주변 4x4 이웃 픽셀을 사용
INTER_LANCZOS4: 주변 8x8 이웃 픽셀을 사용. 가장 느리지만 화질이 높음
축소:
INTER_AREA: 이미지를 축소할 때 사용. 확대할 때는 사용하지 않음
보간 방법의 비교
더 매끄럽게 보간 됨
Super Resolution
최근에는 딥러닝을 이용하여 이미지를 확대하는 방법도 있음(Super Resolution)
원본(4번째, original)을 축소한 다음 2x2로 보간하여 확대(1번째, bicubic)하면 흐림
딥러닝을 이용하여 확대(3번째, SRGAN)하면 선명하게 확대됨
단, 학습된 패턴을 이용하여 디테일을 채워넣기 때문에 원본과 다른 디테일이 추가될 수 있음
뒤집기
상하로 뒤집기
cv.flip(image, 0)
좌우로 뒤집기(플래그가 0보다 큰 경우)
cv.flip(image, 1)
좌우상하로 뒤집기(플래그가 0보다 작은 경우)
cv.flip(image, -1)
회전
시계 방향으로 90도
cv.rotate(image, cv.ROTATE_90_CLOCKWISE)
180도
cv.rotate(image, cv.ROTATE_180)
반시계 방향으로 90도
cv.rotate(image, cv.ROTATE_90_COUNTERCLOCKWISE)
이미지에서 특정 부분 자르기
height, width, channel = image.shape # 이미지의 높이, 너비, 채널 수
x, y = width // 2, height // 3# 자를 위치(가로 1/2 위치, 세로 1/3 위치)
w, h = width // 4, height // 5# 자를 크기(가로 1/4 크기, 세로 1/5 크기)
cropped = image[y:y+h, x:x+w] # 이미지 자르기
show(cropped)