# [OPENCV-PYTHON] Chap8-Processing-geometry

`np.meshgrid`가 어떤 역할을 하는지, 그리고 순방향 사상이 어떻게 이뤄지는지 2x2 크기의 원본 이미지를 4x4 크기로 확대하는 예시를 들어 시각적으로 이해하기 쉽게 설명해 드리겠습니다.

---

### 1. `meshgrid`의 결과와 역할 시각화

코드에서 파이썬의 느린 `for` 반복문을 쓰지 않고 모든 픽셀을 한 번에 계산(벡터화)하기 위해 `np.meshgrid`를 사용합니다.

**가정:** 원본 이미지(`img`)가 2x2 크기라고 해봅시다.

- `img.shape[0]` (세로) = 2
- `img.shape[1]` (가로) = 2

**좌표 생성 단계:**

```python
y = np.arange(0, 2, 1) # 결과: [0, 1] (세로 좌표)
x = np.arange(0, 2, 1) # 결과: [0, 1] (가로 좌표)
y, x = np.meshgrid(y, x)
```

`meshgrid`는 이 1차원 좌표들을 조합해서 **이미지의 모든 픽셀 위치(x, y)를 나타내는 2D 행렬**을 만들어냅니다.

**[meshgrid 실행 결과 시각화]**

```text
y 행렬 (원본의 세로 인덱스들)       x 행렬 (원본의 가로 인덱스들)
[[0, 1],                       [[0, 0],
 [0, 1]]                        [1, 1]]
```

두 행렬을 겹쳐서 `(y, x)` 쌍으로 보면, 원본 이미지의 모든 좌표 조합이 완성됩니다.

- 좌측 상단: `(y=0, x=0)`
- 우측 상단: `(y=1, x=0)`
- 좌측 하단: `(y=0, x=1)`
- 우측 하단: `(y=1, x=1)`

이제 `y`와 `x` 행렬을 이용해 원본의 모든 픽셀 좌표를 한 번에 연산할 수 있게 되었습니다.

---

### 2. 순방향 사상 (Forward Mapping) 시각화

**순방향 사상**이란 **"원본 이미지의 좌표를 기준으로, 목적지(결과) 이미지의 어느 위치에 값을 넣을지 계산"**하는 방식입니다.

**가정:** 2x2 원본 이미지를 4x4로 2배 확대합니다. (`ratioY = 2.0`, `ratioX = 2.0`)

**목적지 좌표 계산 단계:**

```python
i, j = np.int32(y * 2.0), np.int32(x * 2.0)
```

위에서 만든 `y`, `x` 행렬의 모든 원소에 2를 곱해줍니다.

```text
i 행렬 (목적지의 세로 좌표)         j 행렬 (목적지의 가로 좌표)
[[0, 2],                       [[0, 0],
 [0, 2]]                        [2, 2]]
```

**사상(Mapping) 실행 단계:**

```python
dst[i, j] = img[y, x]
```

이 코드는 **"원본의 `(y,x)`에 있는 픽셀 색상을, 목적지의 `(i,j)` 위치에 칠해라"**라는 뜻입니다.

**[매핑 과정 시각화]**

원본 이미지 (2x2)의 픽셀들을 `A`, `B`, `C`, `D`라고 해보겠습니다.

```text
[원본 이미지]
(0,0)A  (0,1)B
(1,0)C  (1,1)D
```

이 픽셀들이 4x4 `dst` 배열에 어떻게 들어가는지 볼까요?

- `A(0,0)` 👉 `(0*2, 0*2)` = **(0,0)에 배치**
- `B(0,1)` 👉 `(0*2, 1*2)` = **(0,2)에 배치**
- `C(1,0)` 👉 `(1*2, 0*2)` = **(2,0)에 배치**
- `D(1,1)` 👉 `(1*2, 1*2)` = **(2,2)에 배치**

```text[결과 이미지 (dst) - 4x4 크기]
[  A  ] [ 빈칸] [  B  ] [ 빈칸]
[ 빈칸] [ 빈칸] [ 빈칸] [ 빈칸]
[  C  ] [ 빈칸] [  D  ] [ 빈칸]
[ 빈칸] [ 빈칸] [ 빈칸][ 빈칸]
```

_(참고: 빈칸은 값을 할당받지 못해 초기에 설정된 `np.zeros`의 기본값인 `0(검은색)`으로 남게 됩니다.)_

### 💡 요약 및 순방향 사상의 한계점

1. **`meshgrid`의 역할**: `for`문 없이 한 줄의 코드로 원본 이미지의 모든 픽셀 `(y,x)` 조합을 만들어 벡터(행렬) 연산을 가능하게 해줍니다.
2. **순방향 사상의 특징**: 원본 픽셀 `(y, x)`에 스케일 비율을 곱해서 새 위치 `(i, j)`로 그대로 쏘아 보냅니다.
3. **한계점 (Hole 현상)**: 위 시각화에서 보듯, 이미지를 확대할 때 목적지 이미지(`dst`) 곳곳에 **값이 채워지지 않는 빈 공간(Hole)**이 생기는 치명적인 단점이 있습니다.

_(이러한 빈 공간(Hole) 문제를 해결하기 위해, 실제 영상 처리에서는 반대로 결과 이미지의 픽셀에서 원본의 위치를 추적해 값을 가져오는 **역방향 사상(Backward Mapping)**을 주로 사용합니다.)_
