PDI+VC · Exercício de Programação

EP02_07 — 🔍 Redimensionamento (Escala)

2.12.7 EP02_07 🔍 Redimensionamento (Escala)

Nesta atividade, você deve implementar o redimensionamento de uma imagem utilizando fatores de escala. Diferente da subamostragem simples, aqui utilizaremos técnicas de interpolação para permitir tanto a ampliação quanto a redução da imagem.

  • Leia dois inteiros L e C, representando as dimensões da matriz original.
  • Leia dois valores reais \(s_x\) (escala nas linhas) e \(s_y\) (escala nas colunas).
  • Leia uma string representando o método de interpolação (nearest ou bilinear).
  • Leia os valores inteiros da matriz original.
  • Calcule as novas dimensões: \(L' = \text{round}(L \times s_x)\) e \(C' = \text{round}(C \times s_y)\).
  • Imprima a matriz resultante com as novas dimensões.
  • Ver na Figura 2.18 uma simulação deste EP.

📌 Importante:

  • Mapeamento Inverso: Para cada pixel \((x', y')\) da imagem de destino, encontre a posição correspondente na origem usando \((x, y) = (x'/s_x, y'/s_y)\).

  • Interpolação:

  • nearest: Seleciona o valor do pixel mais próximo (arredondamento das coordenadas).

  • bilinear: Realiza uma interpolação linear dupla entre os quatro pixels vizinhos mais próximos na imagem original.

  • Bordas: Certifique-se de que o mapeamento não tente acessar índices fora do intervalo \([0, L-1]\) e \([0, C-1]\).

2.12.7.1 🧠 Interpolação para Ampliação/Redução

Redimensionar uma imagem por fatores \((s_x, s_y)\) exige o preenchimento de vazios (na ampliação) ou a fusão de informações (na redução). O método de interpolação define a qualidade visual do resultado:

Método Funcionamento Efeito Visual
Nearest Pega o valor do vizinho mais próximo. Rápido, mas gera efeito “pixelado” ou blocos.
Bilinear Média ponderada dos 4 vizinhos (\(2 \times 2\)). Suaviza a imagem, reduzindo o serrilhamento.

2.12.7.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 sx e sy.

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 redimensionada com dimensões \(L' \times C'\).

2.12.7.3 📌 Exemplos

Entrada Saída Observação
2
2
2.0 2.0
nearest
1 2
3 4
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
Ampliação 2×: cada pixel original é replicado em um bloco 2×2. A imagem \(2\times2\) vira \(4\times4\).
2
2
0.5 0.5
nearest
10 20
30 40
10 Redução 0.5×: a imagem \(2\times2\) vira \(1\times1\). Com nearest, o único pixel de saída amostra a posição \((0,0)=10\).
🔍 Simulador EP02_07: Redimensionamento e Interpolação (sx = sy) Nearest vs Bilinear

Ajuste o fator de escala (s) para comparar a interpolação por vizinho mais próximo (réplica discreta) com a interpolação bilinear (média ponderada dos 4 vizinhos).

1.0
Fator = 1.0 → Tamanho Original (3×3)  |  Fator = 2.0 → 6×6  |  Fator = 4.0 → 12×12
Original (3×3)
🔲 Nearest Neighbor
🌀 Interpolação Bilinear
Fator = 1.00 → tamanho 3×3 (sem alteração)
Figura 2.18: Simulador EP02_07: Redimensionamento Espacial e Interpolação (Nearest Neighbor vs Bilinear)
%%writefile EP02_07.py
# Código Python
import numpy as np
from morph import mm

# 1. Leitura das dimensões, fatores e método
l = int(input())
c = int(input())
sx, sy = map(float, input().split())
interp = input().strip()

# 2. Leitura da imagem original
img = mm.readImg(l, c)

# 3. Novas dimensões
l_new = round(l * sx)
c_new = round(c * sy)

# 4. Redimensionamento usando mm.resize
# cv2.resize usa (largura, altura) = (colunas, linhas)
resultado = mm.resize(img, (c_new, l_new), method=interp)

# 5. Exibição
print(mm.drawImg(resultado))
Overwriting EP02_07.py
TestSuite("EP02_07.py").run()
✔️ EP02_07.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_07.cases

🔍 Testando Python: EP02_07.py
✔️ Caso1_Ampliacao_2x_Nearest: OK
✔️ Caso2_Reducao_05x_Nearest: OK
✔️ Caso3_Sem_Escala: OK
✔️ Caso4_Ampliacao_Bilinear: OK
✔️ Caso5_Escala_Assimetrica: OK

📊 Resultado: 5/5 (100.0%)
🎉 Parabéns! Todos os testes passaram.