Ajuste os coeficientes de cisalhamento horizontal (shx) e vertical (shy) para observar a deformação angular da imagem via mapeamento reverso de coordenadas.
2.12.8 EP02_08 🔀 Cisalhamento (Shear)
Nesta atividade, você deve implementar a transformação de cisalhamento em uma imagem. O cisalhamento é uma transformação afim que desloca cada ponto em uma direção fixada, por um valor proporcional à sua distância de uma reta paralela a essa direção, resultando em um efeito de inclinação.
- Leia dois inteiros L e C, representando as dimensões da matriz.
- Leia dois valores reais \(sh_x\) (cisalhamento horizontal) e \(sh_y\) (cisalhamento vertical).
- Leia uma string representando o método de interpolação (
nearestoubilinear). - Leia os valores inteiros da matriz original.
- Aplique a transformação mantendo o tamanho original da imagem (cortando o que ultrapassar os limites).
- Imprima a matriz resultante com as dimensões \(L \times C\).
- Ver na Figura 2.19 uma simulação deste EP.
📌 Importante:
- Mapeamento Inverso: Para cada pixel \((x', y')\) da imagem de destino, calcule a posição correspondente na origem \((x, y)\) utilizando a matriz de cisalhamento inversa.
- Preenchimento: Coordenadas que resultarem em posições fora da matriz original devem ser preenchidas com 0.
- Coordenadas: Para fins desta implementação, considere \(x\) como o índice da linha e \(y\) como o índice da coluna.
2.12.8.1 🧠 Distorção Afim
O cisalhamento altera a geometria da imagem inclinando seus eixos. A relação entre as coordenadas originais \((x, y)\) e as transformadas \((x', y')\) é dada por:
\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & sh_x & 0 \\ sh_y & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]
Isso resulta nas equações:
- \(x' = x + sh_x \cdot y\)
- \(y' = y + sh_y \cdot x\)
2.12.8.2 📋 Tarefa (especificação para VPL)
Entrada:
A primeira linha contém L.
A segunda linha contém C.
A terceira linha contém os fatores shx e shy.
A quarta linha contém o método interp (nearest ou bilinear).
As linhas seguintes contêm os elementos da matriz \(L \times C\).
Saída:
A matriz transformada com as mesmas dimensões \(L \times C\).
2.12.8.3 📌 Exemplos
| Entrada | Saída | Observação |
|---|---|---|
| 3 3 0.5 0.0 nearest 10 20 30 40 50 60 70 80 90 |
10 20 30 0 40 50 0 0 70 |
Cisalhamento horizontal: linha \(i\) desloca \(\lfloor i \cdot 0.5 \rfloor\) pixels. Linha \(0→0\)px, linha \(1→0\)px, linha \(2→1\)px. Os pixels deslocados para fora são descartados e as posições vazias preenchidas com \(0\). |
| 2 2 0.0 1.0 nearest 10 20 30 40 |
10 0 30 20 |
Cisalhamento vertical: coluna \(j\) desloca \(\lfloor j \cdot 1.0 \rfloor\) pixels para baixo. Coluna \(0→0\)px (inalterada), coluna \(1→1\)px: \(20\) desce para \((1,1)\) e \((0,1)\) fica \(0\). |
%%writefile EP02_08.cpp
// sua soluçãoOverwriting EP02_08.cpp
TestSuite("EP02_08.cpp").run()✔️ EP02_08.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_08.cases
🔍 Testando C++: EP02_08.cpp
⚠️ EP02_08.cpp: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.