Skip to main content

이미지 변형

크기 변경

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)

배경 색을 이용해 자르기

src = cv.imread('nut.png')
bg_color = src[0, 0] # 왼쪽 상단 픽셀 색상 (배경색으로 가정)
error = 10
low = np.where(bg_color > error, bg_color - error, 0)
high = np.where(bg_color < 255 - error, bg_color + error, 255)
mask = cv.inRange(src, low, high) # 배경색과 유사한 색상 검출
mask_inv = cv.bitwise_not(mask) # 배경색이 아닌 부분 검출
coords = cv.findNonZero(mask_inv) # 실제 그림이 있는 좌표 추출
x, y, w, h = cv.boundingRect(coords) # 사각형으로 경계 추출
trimmed = src[y:y+h, x:x+w] # 실제 그림 부분만 자름

퀴즈