✨ 오늘 공부한 내용
오늘은 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()
🔥 코드 설명
- 이미지 업로드
Colab에서는 files.upload()를 사용해 이미지를 직접 올려야 합니다. - 이미지 읽기 및 색상 변환
OpenCV 기본은 BGR이라 matplotlib으로 보여주려면 RGB로 변환했습니다. - 이미지 자르기
570670, 520620 구간을 잘라서 patch로 저장했습니다.
(100x100 픽셀) - 사각형 그리기
rectangle 함수를 이용해 잘라낸 영역에 파란 박스를 표시했습니다. - 다양한 보간법으로 5배 확대
- INTER_NEAREST: 가장 가까운 픽셀을 복사 ➔ 거칠고 계단현상 심함
- INTER_LINEAR: 주변 픽셀 평균 ➔ 부드럽지만 살짝 뭉개짐
- INTER_CUBIC: 주변 더 많은 픽셀을 사용 ➔ 매우 부드럽고 자연스러움
- 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 방식"이 얼마나 부드럽고 자연스러운지 직접 체험해서 기억에 남았다!
'이미지와 영상처리' 카테고리의 다른 글
| 🎨 마우스로 영상 위에 그림 그리기 – OpenCV 마우스 이벤트 실습 정리 (2-6 ~ 2-9)📅 작성일: 2025년 4월 20일 (0) | 2025.04.20 |
|---|---|
| 🎓 FastText 활용 영화 리뷰 감성 분석 (2024-04-16) (0) | 2025.04.16 |
| 머신러닝 기초 실습 - SVM, 로지스틱 회귀, KNN 분류 모델 비교 (with OpenCV)📅 작성일: 2025년 4월 8일 (0) | 2025.04.08 |
| 📅 2025년 4월 7일 - 머신러닝 모델 비교와 OpenCV 이미지 처리 실습 (0) | 2025.04.07 |