관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

영상 처리 9 - 연습문제 풀기 4 : 문제 9~10번 본문

인공지능/컴퓨터 비전

영상 처리 9 - 연습문제 풀기 4 : 문제 9~10번

huenuri 2024. 11. 9. 19:41

이어서 남은 두 문제를 마저 풀고 저녁을 먹으려고 한다.


 

 

 

연습문제 풀기 네 번째

 

문제 9번

프로그램 3-8은 보간 품질을 관찰할 위치를 미리 프로그램 안에 지정해 놓았다. 마우스를 이용해 관찰하고 싶은 곳을 직사각형으로 지정할 수 있게 확장하시오.

◆ 힌트 : 프로그램 2-8을 이용한다.

 

 

보간을 이용해 영상의 기하 변환하는 예제


 

 

 

마우스 드래그로 직사각형 그리는 예제

 

이 두 개의 코드를 이용해서 문제를 풀어보면 될 것 같다.


 

 

 

문제 풀기

여기서는 프로그램 3-8에 프로그램 2-8에서의 마우스 콜백 함수를 이용하여 사용자가 마우스를 드래그하여 원하는 영역을 직사각형으로 지정할 수 있게 확장해 보겠다. 사용자가 드래그한 영역을 patch 변수에 저장하여, 그 영역을 확대하여 표시할 수 있도록 수정할 것이다.

 

 

이 부분을 마우스로 드래그하면 직사각형 네모가 표시된다. 그리고 보간법을 활용해서 이미지의 크기가 다음과 같이 확대된다.

 

 

 

 

 

 

 

 

 

 

 

코드 설명

  1. 변수 초기화
    • ix, iy, drawing : 드래그 시작 위치와 드래그 여부를 저장하기 위한 변수들이다.
    • img, original_img : 이미지 작업을 위한 복사본과 원본 이미지를 유지한다.
  2. 마우스 콜백 함수 (draw_rectangle)
    • EVENT_LBUTTONDOWN : 마우스 왼쪽 버튼을 누르면 드래그를 시작하고 시작 좌표를 저장한다.
    • EVENT_MOUSEMOVE : 드래그 중일 때 실시간으로 사각형을 그려서 사용자가 선택한 영역을 시각적으로 보여준다.
    • EVENT_LBUTTONUP : 드래그를 끝낼 때, 선택된 영역을 patch로 추출하고 세 가지 보간법을 사용하여 확대된 이미지를 표시한다.
  3. 보간법
    • INTER_NEAREST, INTER_LINEAR, INTER_CUBIC 세 가지 보간법을 사용하여 이미지를 확대하고, 각각을 다른 창에 표시한다.
  4. 메인 루프
    • 원본 이미지를 표시하고, q 키를 누르면 프로그램이 종료된다.

이 코드를 실행하면, 이미지를 열고 마우스로 직사각형을 그려 특정 영역을 선택할 수 있으며, 선택한 영역이 세 가지 보간법으로 확대되어 표시된다.


 

 

 

 

문제 10번

프로그램 3-9의 실험을 통해 my_cvtGray1이 my_cvtGray2보다 무려 300배 느리다는 사실을 알았다. 이유를 설명하시오.

 

프로그램 3-9 코드

 

 

 

이유 설명

  1. 루프 구조와 벡터화의 차이
    • my_cvtGray1 함수는 이중 for 루프를 사용하여 각 픽셀을 개별적으로 접근하고 RGB 값을 계산한다. 이중 루프는 각 픽셀에 대해 직접 연산을 수행하므로, 픽셀이 많아질수록 처리 시간이 크게 증가한다.
    • 반면 my_cvtGray2 함수는 벡터화 연산을 사용하여 배열 전체에 대해 동시에 계산을 수행한다. NumPy는 벡터화된 연산을 통해 내부적으로 고도로 최적화된 C 또는 Fortran 코드에서 연산을 수행하므로, Python에서 이중 루프를 사용하는 것보다 훨씬 빠르게 결과를 얻을 수 있다.
  2. Python 루프의 성능 한계
    • Python의 기본 for 루프는 C나 Fortran 등 저수준 언어에 비해 느리기 때문에, Python에서 이중 루프를 사용할 경우 성능이 크게 떨어진다.
    • NumPy는 내부적으로 이러한 연산을 최적화하므로, 벡터화된 계산을 수행할 때 Python의 루프와는 비교할 수 없을 만큼 빠르게 연산을 수행한다.
  3. 메모리 접근 효율성
    • my_cvtGray1에서는 각 픽셀에 개별 접근하므로, 메모리에서 값을 가져오고 쓰는 작업이 매우 빈번하게 일어난다. 이는 캐시 메모리에 부담을 주어 성능 저하를 유발할 수 있다.
    • my_cvtGray2는 벡터화된 연산을 통해 메모리에 한 번 접근하여 전체 연산을 수행하므로 메모리 접근이 더 효율적이다.

my_cvtGray2가 my_cvtGray1보다 300배나 빠른 이유는 Python 루프 대신 NumPy의 벡터화 연산을 사용함으로써 성능 최적화가 이루어졌기 때문이다. 벡터화 연산은 큰 배열에 대한 연산에서 매우 유리하며, Python에서 반복문을 사용하는 것보다 훨씬 빠르게 작업을 완료할 수 있다.

 


 

 

 

학습을 마치고

이렇게 4시 반부터 7시 반까지 3시간에 걸쳐 쉬지 않고 연습문제 7문제를 풀었고, 점심식사 후에 세 문제를 푼 것까지 하면 4시간 넘게 연습문제를 푸는데 소요되었다. 그래도 이러한 시간을 통해 공부가 정말 많이 되었다.

수학을 잘 못해서 문제를 이해하는데 많은 어려움이 있었지만 그래도 공식과 수식 그리고 행렬을 이해하며 자신감이 생기기도 했다. 이제 저녁 식사 후에 4장 공부에 들어가 볼 것이다. 

 

원래 계획은 화요일까지 컴퓨터 비전 공부를 거의 마치는 거였지만 수요일까지로 늘려야 할 것 같다.