이미지와 영상처리

📚 OpenCV 실습: 이미지 자르기, 사각형 표시, 다양한 확대 방법 비교 (2025-04-28)

EasyHanAI 2025. 4. 29. 00:02

 

✨ 오늘 공부한 내용

오늘은 OpenCV를 이용해서
이미지의 일부를 잘라내고,
그 영역을 다양한 방법으로 확대하는 실습을 진행했습니다.

사진을 그냥 보는 것과, 특정 부분을 확대해서 보는 것의 차이를 직접 체험해봤고,
확대할 때 사용하는 방법(보간법)에 따라 결과가 얼마나 다른지도 알게 되었습니다.

공부하면서 느낀 것, 부족했던 점, 개선할 부분도 같이 정리했습니다!


📌 작업한 파일 및 주요 내용

  • 파일명: plant2_test1.jpg
  • 주요 변경 사항:
    • 사진의 일부분(100x100)을 잘라서 patch로 저장
    • 자른 부분을 원본 사진에 파란색 네모로 표시
    • 잘라낸 patch를 3가지 방법(NEAREST, LINEAR, CUBIC)으로 5배 확대
    • 각각 다른 방식으로 확대된 결과를 비교

🛠️ 오늘 작성한 전체 코드

import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files

# 파일 업로드 창 띄우기
uploaded = files.upload()

# 업로드된 파일 이름 가져오기
filename = list(uploaded.keys())[0]

# 이미지 불러오기 (컬러 이미지)
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # OpenCV는 BGR, matplotlib은 RGB라 변환 필요

# 100x100 크기로 잘라낼 영역 지정
patch = img[570:670, 520:620, :]

# 자른 영역을 원본 이미지에 파란색 사각형으로 표시
img_with_rectangle = img.copy()
cv2.rectangle(img_with_rectangle, (520, 570), (620, 670), (255, 0, 0), 3)  # (BGR: 파란색)

# 잘라낸 patch를 5배 확대 (3가지 보간 방법 사용)
patch1 = cv2.resize(patch, dsize=(0,0), fx=5, fy=5, interpolation=cv2.INTER_NEAREST)  # 가장 가까운 픽셀 복사
patch2 = cv2.resize(patch, dsize=(0,0), fx=5, fy=5, interpolation=cv2.INTER_LINEAR)   # 주변 픽셀 선형 평균
patch3 = cv2.resize(patch, dsize=(0,0), fx=5, fy=5, interpolation=cv2.INTER_CUBIC)    # 3차 함수로 부드럽게 확대

# 결과 출력 (matplotlib 사용)
plt.figure(figsize=(15, 10))

plt.subplot(2,2,1)
plt.title('Original with Rectangle')
plt.imshow(img_with_rectangle)
plt.axis('off')

plt.subplot(2,2,2)
plt.title('Resize Nearest')
plt.imshow(patch1)
plt.axis('off')

plt.subplot(2,2,3)
plt.title('Resize Bilinear')
plt.imshow(patch2)
plt.axis('off')

plt.subplot(2,2,4)
plt.title('Resize Bicubic')
plt.imshow(patch3)
plt.axis('off')

plt.show()

🔥 코드 설명

  1. 이미지 업로드
    Colab에서는 files.upload()를 사용해 이미지를 직접 올려야 합니다.
  2. 이미지 읽기 및 색상 변환
    OpenCV 기본은 BGR이라 matplotlib으로 보여주려면 RGB로 변환했습니다.
  3. 이미지 자르기
    570670, 520620 구간을 잘라서 patch로 저장했습니다.
    (100x100 픽셀)
  4. 사각형 그리기
    rectangle 함수를 이용해 잘라낸 영역에 파란 박스를 표시했습니다.
  5. 다양한 보간법으로 5배 확대
    • INTER_NEAREST: 가장 가까운 픽셀을 복사 ➔ 거칠고 계단현상 심함
    • INTER_LINEAR: 주변 픽셀 평균 ➔ 부드럽지만 살짝 뭉개짐
    • INTER_CUBIC: 주변 더 많은 픽셀을 사용 ➔ 매우 부드럽고 자연스러움
  6. matplotlib으로 결과 출력
    OpenCV는 imshow를 쓰기 어렵기 때문에, Colab에서는 matplotlib로 결과를 한 화면에 출력했습니다.

📈 이번 실습을 통해 배운 점

  • patch: 이미지를 원하는 부분만 잘라서 따로 다룰 수 있다.
  • rectangle: 단순히 "네모"를 그려주는 함수일 뿐, 확대나 이동은 따로 처리해야 한다.
  • resize: 이미지 크기를 조정할 때 다양한 방법(interpolation)이 있다.
  • INTER_NEAREST / INTER_LINEAR / INTER_CUBIC 방식 차이를 확실히 체감했다.
    • Nearest는 거칠다
    • Linear는 적당하다
    • Cubic은 제일 부드럽다
  • Colab에서는 꼭 RGB 변환을 해야 색상이 제대로 보인다.

🧠 부족했던 점 (솔직히 느낀 것)

  • 처음에는 rectangle 함수가 확대를 하는 줄 착각했다.
    (실제로는 그냥 사각형 테두리를 그리는 것!)
  • resize 함수 안에 dsize=(0,0)을 넣고, fx, fy로 크기를 설정하는 걸 처음엔 헷갈렸다.
  • interpolation 종류별 결과 차이를 직접 보기 전에는 "뭐가 그렇게 다른가?" 싶었는데, 해보니까 정말 확연히 차이가 났다!

🔥 개선하고 싶은 점

  • 다음에는 잘라내는 영역을 (x,y) 직접 코드에 고정하지 말고,
    사용자 마우스로 클릭해서 선택할 수 있게 만들어보고 싶다.
  • 또, 확대뿐만 아니라 축소도 실험해서 INTER_NEAREST가 얼마나 더 차이 나는지도 비교해보고 싶다.
  • 시간이 된다면, Gaussian Blur 같은 흐림 효과와 Resize를 같이 비교해보면 더 재미있을 것 같다!

✨ 최종 요약

오늘은 OpenCV를 이용해서

  • 이미지를 자르고
  • 사각형을 그리고
  • 다양한 보간 방법으로 확대하는
    실습을 진행했다.

사진을 다룰 때 "단순히 픽셀을 복사하는 것"과 "부드럽게 계산해서 늘리는 것"의 차이를 확실히 느낄 수 있었다.

특히 "CUBIC 방식"이 얼마나 부드럽고 자연스러운지 직접 체험해서 기억에 남았다!