이미지 변형
크기 변경
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)
show(image)
보간
big = cv.resize(image, None, fx=2.0, fy=2.0, interpolation=cv.INTER_LANCZOS4)
- 이미지를 확대, 축소할 때 새로운 픽셀들은 기존의 픽셀을 보간하여 사용
- 확대:
- 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
w, h = width // 4, height // 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]
퀴즈