OpenCV Python에서 화질 손실을 최소화하여 이미지를 확대하기 위해 Super Resolution을 사용하는 방법을 소개하고 있습니다.
2022. 11. 5 최초작성
2022. 11. 6 최종작성
OpenCV에선 미리 학습된 Super Resolution 딥러닝 모델을 사용하여 이미지를 확대할 수 있는 방법을 제공합니다.
본 포스팅에서는 실제 사용하는 방법을 소개합니다.
1. 우선 contrib 모듈이 포함된 OpenCV를 설치해야 합니다. 기존에 opencv-python 패키지를 설치한적이 있다면 삭제하고 설치하세요. pip list 명령으로 설치된 패키지 목록을 확인할 수 있습니다.
pip install opencv-contrib-python
2. 미리 학습되어 배포되고 있는 모델을 다운로드합니다.
EDSR 가장 좋은 결과를 얻을 수 있습니다. 모델이 제일 크고 추론 속도가 가장 느립니다.
https://github.com/Saafke/EDSR_Tensorflow/tree/master/models
ESPCN, FSRCNN 작은 모델로 추론 속도가 빠르면서 적당히 좋은 결과를 보여줍니다. 실시간 비디오에 적용할 수 있습니다.
ESPCN https://github.com/fannymonori/TF-ESPCN/tree/master/export
FSRCNN https://github.com/Saafke/FSRCNN_Tensorflow/tree/master/models
LapSRN 중간 크기의 모델입니다.
https://github.com/fannymonori/TF-LapSRN/tree/master/export
몇 배 확대할지에 따라 다운받을 모델을 선택해야 합니다.
예를 들어 ESPCN을 대상으로 포스트를 진행하도록 하겠습니다. 모델에는 N배 확대를 위한 모델 이름에 xN이 적혀있습니다. 따라서 2배 확대를 위해선 ESPCN_x2.pb를 선택하면 됩니다. ESPCN_x2.pb를 클릭합니다.
3. Download를 클릭하면 모델이 다운로드됩니다. 파이썬 코드를 작성할 폴더로 복사해두세요.
4. 다음 코드를 작성하여 실행합니다.
import cv2 # 이미지를 불러옵니다. img = cv2.imread('cat.jpeg') # Super Resolution을 하기 위해 2배 확대를 위한 ESPCN 모델을 사용합니다. sr = cv2.dnn_superres.DnnSuperResImpl_create() # 모델 파일의 이름을 적어주면 됩니다. sr.readModel('ESPCN_x2.pb') # 모델 파일에 적힌 숫자와 일치하도록 적어줘야 합니다. sr.setModel("espcn",2) # img를 입력 받아 결과로 result1를 돌려줍니다. result1 = sr.upsample(img) # OpenCV에서 제공하는 보간법을 사용해봅니다. result2 = cv2.resize(img, dsize=None, fx=2, fy=2) # 입력 이미지와 Super Resolution, OpenCV 보간법 적용 결과를 화면에 보여줍니다. cv2.imshow('origianl', img) cv2.imshow('result - ESPCN', result1) cv2.imshow('result - Opencv', result2) cv2.waitKey(0) |
5. 실행 결과입니다. 어느쪽이 더 나은 결과인지 판단하기 쉽지 않네요.
정확한 비교를 해놓은 다음 참고 사이트에서 확인해보세요.
https://learnopencv.com/super-resolution-in-opencv/
포스트에서 사용한 ESPCN의 경우만 링크에서 가져와 보면 다음과 같습니다. ESPCN을 사용한 경우가 OpenCV에서 사용하는 Bicubic 보간법보단 화질이 더 좋은 걸 볼 수 있습니다. ESPCN은 실시간으로 사용하기 위해 선택을 해본 것이라 화질이 덜 좋을 수 있습니다. 실시간이 필요없다면 더 좋은 화질을 얻을 수 있는 EDSR 모델을 고려해보세요.
참고
https://scieencerepository.data.blog/2020/03/19/deep-learning-based-super-resolution-with-opencv/
https://learnopencv.com/super-resolution-in-opencv/
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV Python 강좌 – 이미지 확대/축소 resize 함수 (0) | 2023.10.12 |
---|---|
OpenCV에서 cudacodec 사용하도록 빌드하기 (0) | 2023.10.11 |
동영상 파일을 RTSP 스트리밍하기 (0) | 2023.10.10 |
fps 표시 및 동영상 파일 저장하며 webcam 영상 보여주는 OpenCV C++ 예제 코드 (0) | 2023.10.10 |
OpenCV로 Aspect Ratio 시각화해보기 (0) | 2023.10.10 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!