Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Técnicas de Super-Resolução | Processamento de Imagens com OpenCV
Fundamentos de Visão Computacional

book
Técnicas de Super-Resolução

As técnicas de super-resolução podem ser amplamente categorizadas em:

  • Métodos tradicionais baseados em interpolação (Bilinear, Bicúbica, Lanczos);

  • Super-resolução baseada em aprendizado profundo (CNNs, GANs, Transformers).

Métodos Tradicionais Baseados em Interpolação

A interpolação é uma das abordagens mais simples para super-resolução, onde pixels ausentes são estimados com base nos valores dos pixels ao redor. Todas as técnicas comuns de interpolação incluem cv2.resize(), mas o parâmetro interpolation difere:

Interpolação por Vizinho Mais Próximo

  • Copia o valor do pixel mais próximo para a nova localização;

  • Produz imagens nítidas, porém com aparência de blocos;

  • Rápido, mas carece de suavidade e detalhes.

Interpolação Bilinear

  • Faz a média de quatro pixels vizinhos para estimar o novo valor do pixel;

  • Produz imagens mais suaves, mas pode introduzir desfoque.

Interpolação Bicúbica

  • Utiliza uma média ponderada de 16 pixels ao redor;

  • Oferece melhor suavidade e nitidez em comparação à interpolação bilinear.

Interpolação Lanczos

  • Utiliza uma função sinc para calcular os valores dos pixels;

  • Proporciona melhor nitidez e mínimo efeito de aliasing.

Embora os métodos baseados em interpolação sejam computacionalmente eficientes, eles frequentemente não conseguem restaurar detalhes e texturas finas.

Super-Resolução Baseada em Deep Learning

Modelos Pré-Treinados de Super-Resolução:

  • ESPCN (Efficient Sub-Pixel Convolutional Network): Rápido e eficiente para SR em tempo real;

  • FSRCNN (Fast Super-Resolution CNN): Rede leve otimizada para velocidade;

  • LapSRN (Laplacian Pyramid SR Network): Utiliza upscaling progressivo para melhores detalhes.

Tarefa

Swipe to start coding

Você recebe uma image com baixa resolução:

  • Aplique o método de interpolação bicúbica com escala 4x e armazene o resultado em bicubic_image;
  • Defina e crie o objeto de rede neural profunda na variável sr;
  • Leia o modelo a partir de model_path;
  • Defina o nome espcn e escala 4x;
  • Aplique o método de super-resolução DNN e armazene o resultado em dnn_image.

Solução

import io
import cv2
import numpy as np
import urllib.request
from PIL import Image
import matplotlib.pyplot as plt

url_img = "https://staging-content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/task_pictures/low_res_puppy.jpg"
with urllib.request.urlopen(url_img) as img_resp:
image_data = img_resp.read()

url_model = "https://staging-content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/functions/ESPCN_x4.pb"
model_path = "ESPCN_x4.pb"
with urllib.request.urlopen(url_model) as model_resp, open(model_path, "wb") as model_file:
model_file.write(model_resp.read())

image = np.array(Image.open(io.BytesIO(image_data)))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Write your code below
bicubic_image = cv2.resize(image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)

sr = cv2.dnn_superres.DnnSuperResImpl_create()
sr.readModel(model_path)
sr.setModel("espcn", 4)

dnn_image = sr.upsample(image)

# Display the results
plt.figure(figsize=(15, 7.5))

plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Low-Resolution Image")

plt.subplot(1, 3, 2)
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 6
single

single

import io
import cv2
import numpy as np
import urllib.request
from PIL import Image
import matplotlib.pyplot as plt

url_img = "https://staging-content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/task_pictures/low_res_puppy.jpg"
with urllib.request.urlopen(url_img) as img_resp:
image_data = img_resp.read()

url_model = "https://staging-content-media-cdn.codefinity.com/courses/ef049f7b-ce21-45be-a9f2-5103360b0655/functions/ESPCN_x4.pb"
model_path = "ESPCN_x4.pb"
with urllib.request.urlopen(url_model) as model_resp, open(model_path, "wb") as model_file:
model_file.write(model_resp.read())

image = np.array(Image.open(io.BytesIO(image_data)))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Write your code below
bicubic_image = ___

sr = ___
sr.___
sr.___

dnn_image = ___

# Display the results
plt.figure(figsize=(15, 7.5))

plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Low-Resolution Image")
plt.axis("off")

plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(bicubic_image, cv2.COLOR_BGR2RGB))
plt.title("Super-Resolved Image (Bicubic)")
plt.axis("off")

plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(dnn_image, cv2.COLOR_BGR2RGB))
plt.title("Super-Resolved Image (ESPCN)")
plt.axis("off")

plt.show()

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

We use cookies to make your experience better!
some-alt