일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 정보처리기사필기
- 데이터입출력구현
- 텍스트마이닝
- 데이터분석
- 자바 실습
- html/css
- numpy/pandas
- 자바
- 컴퓨터비전
- CNN
- JSP/Servlet
- 연습문제
- 머신러닝
- C++
- 정수와유리수
- 컴퓨터구조
- 딥러닝
- 혼공머신
- 파이썬
- 중학수학
- 중학1-1
- SQL
- 데이터베이스
- pandas
- 영어공부
- 파이썬라이브러리
- 정보처리기사실기
- 운영체제
- CSS
- 코딩테스트
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
영상 처리 9 - 연습문제 풀기 4 : 문제 9~10번 본문
이어서 남은 두 문제를 마저 풀고 저녁을 먹으려고 한다.
연습문제 풀기 네 번째
문제 9번
프로그램 3-8은 보간 품질을 관찰할 위치를 미리 프로그램 안에 지정해 놓았다. 마우스를 이용해 관찰하고 싶은 곳을 직사각형으로 지정할 수 있게 확장하시오.
◆ 힌트 : 프로그램 2-8을 이용한다.
보간을 이용해 영상의 기하 변환하는 예제
마우스 드래그로 직사각형 그리는 예제
이 두 개의 코드를 이용해서 문제를 풀어보면 될 것 같다.
문제 풀기
여기서는 프로그램 3-8에 프로그램 2-8에서의 마우스 콜백 함수를 이용하여 사용자가 마우스를 드래그하여 원하는 영역을 직사각형으로 지정할 수 있게 확장해 보겠다. 사용자가 드래그한 영역을 patch 변수에 저장하여, 그 영역을 확대하여 표시할 수 있도록 수정할 것이다.
이 부분을 마우스로 드래그하면 직사각형 네모가 표시된다. 그리고 보간법을 활용해서 이미지의 크기가 다음과 같이 확대된다.
코드 설명
- 변수 초기화
- ix, iy, drawing : 드래그 시작 위치와 드래그 여부를 저장하기 위한 변수들이다.
- img, original_img : 이미지 작업을 위한 복사본과 원본 이미지를 유지한다.
- 마우스 콜백 함수 (draw_rectangle)
- EVENT_LBUTTONDOWN : 마우스 왼쪽 버튼을 누르면 드래그를 시작하고 시작 좌표를 저장한다.
- EVENT_MOUSEMOVE : 드래그 중일 때 실시간으로 사각형을 그려서 사용자가 선택한 영역을 시각적으로 보여준다.
- EVENT_LBUTTONUP : 드래그를 끝낼 때, 선택된 영역을 patch로 추출하고 세 가지 보간법을 사용하여 확대된 이미지를 표시한다.
- 보간법
- INTER_NEAREST, INTER_LINEAR, INTER_CUBIC 세 가지 보간법을 사용하여 이미지를 확대하고, 각각을 다른 창에 표시한다.
- 메인 루프
- 원본 이미지를 표시하고, q 키를 누르면 프로그램이 종료된다.
이 코드를 실행하면, 이미지를 열고 마우스로 직사각형을 그려 특정 영역을 선택할 수 있으며, 선택한 영역이 세 가지 보간법으로 확대되어 표시된다.
문제 10번
프로그램 3-9의 실험을 통해 my_cvtGray1이 my_cvtGray2보다 무려 300배 느리다는 사실을 알았다. 이유를 설명하시오.
프로그램 3-9 코드
이유 설명
- 루프 구조와 벡터화의 차이
- my_cvtGray1 함수는 이중 for 루프를 사용하여 각 픽셀을 개별적으로 접근하고 RGB 값을 계산한다. 이중 루프는 각 픽셀에 대해 직접 연산을 수행하므로, 픽셀이 많아질수록 처리 시간이 크게 증가한다.
- 반면 my_cvtGray2 함수는 벡터화 연산을 사용하여 배열 전체에 대해 동시에 계산을 수행한다. NumPy는 벡터화된 연산을 통해 내부적으로 고도로 최적화된 C 또는 Fortran 코드에서 연산을 수행하므로, Python에서 이중 루프를 사용하는 것보다 훨씬 빠르게 결과를 얻을 수 있다.
- Python 루프의 성능 한계
- Python의 기본 for 루프는 C나 Fortran 등 저수준 언어에 비해 느리기 때문에, Python에서 이중 루프를 사용할 경우 성능이 크게 떨어진다.
- NumPy는 내부적으로 이러한 연산을 최적화하므로, 벡터화된 계산을 수행할 때 Python의 루프와는 비교할 수 없을 만큼 빠르게 연산을 수행한다.
- 메모리 접근 효율성
- my_cvtGray1에서는 각 픽셀에 개별 접근하므로, 메모리에서 값을 가져오고 쓰는 작업이 매우 빈번하게 일어난다. 이는 캐시 메모리에 부담을 주어 성능 저하를 유발할 수 있다.
- my_cvtGray2는 벡터화된 연산을 통해 메모리에 한 번 접근하여 전체 연산을 수행하므로 메모리 접근이 더 효율적이다.
my_cvtGray2가 my_cvtGray1보다 300배나 빠른 이유는 Python 루프 대신 NumPy의 벡터화 연산을 사용함으로써 성능 최적화가 이루어졌기 때문이다. 벡터화 연산은 큰 배열에 대한 연산에서 매우 유리하며, Python에서 반복문을 사용하는 것보다 훨씬 빠르게 작업을 완료할 수 있다.
학습을 마치고
이렇게 4시 반부터 7시 반까지 3시간에 걸쳐 쉬지 않고 연습문제 7문제를 풀었고, 점심식사 후에 세 문제를 푼 것까지 하면 4시간 넘게 연습문제를 푸는데 소요되었다. 그래도 이러한 시간을 통해 공부가 정말 많이 되었다.
수학을 잘 못해서 문제를 이해하는데 많은 어려움이 있었지만 그래도 공식과 수식 그리고 행렬을 이해하며 자신감이 생기기도 했다. 이제 저녁 식사 후에 4장 공부에 들어가 볼 것이다.
원래 계획은 화요일까지 컴퓨터 비전 공부를 거의 마치는 거였지만 수요일까지로 늘려야 할 것 같다.
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
에지와 영역 2 - 캐니 에지 (0) | 2024.11.09 |
---|---|
에지와 영역 1 - 에지 검출 (0) | 2024.11.09 |
영상 처리 8 - 연습문제 풀기 3 : 문제 6~8번 (1) | 2024.11.09 |
영상 처리 7 - 연습문제 풀기 2 : 문제 4~5번 (1) | 2024.11.09 |
영상 처리 6 - 연습문제 풀기 1 : 문제 1~3번 (0) | 2024.11.09 |