Post

Manipulador de Quadrantes de Imagem 🖼️

Um programa simples de processamento de imagem foi concebido para manipular quadrantes de uma imagem. Este programa oferece aos usuários a capacidade de selecionar quadrantes da imagem original e reposicioná-los conforme desejado na imagem resultante.

Seja $M$ uma matriz representando a imagem original com dimensões $M \times N$, onde $M$ é o número de linhas (altura da imagem) e $N$ é o número de colunas (largura da imagem).

Para dividir a imagem em quadrantes, podemos criar quatro submatrizes $Q_0$, $Q_1$, $Q_2$, $Q_3$, onde:

\[\begin{array}{c|c} Q_0 & Q_1 \\ \hline Q_2 & Q_3 \\ \end{array}\]
  • $Q_0$ corresponde à região superior esquerda da imagem original.
  • $Q_1$ corresponde à região superior direita da imagem original.
  • $Q_2$ corresponde à região inferior esquerda da imagem original.
  • $Q_3$ corresponde à região inferior direita da imagem original.

Cada uma dessas submatrizes terá dimensões $\frac{M}{2} \times \frac{N}{2}$.

Portanto, podemos expressar matematicamente as submatrizes da seguinte forma:

\[\begin{align*} Q_0 &= M[0:\frac{M}{2}, 0:\frac{N}{2}] \\ Q_1 &= M[0:\frac{M}{2}, \frac{N}{2}:N] \\ Q_2 &= M[\frac{M}{2}:M, 0:\frac{N}{2}] \\ Q_3 &= M[\frac{M}{2}:M, \frac{N}{2}:N] \end{align*}\]

Onde $M[a:b, c:d]$ representa uma submatriz de $M$ que vai da linha $a$ até a linha $b$ e da coluna $c$ até a coluna $d$. Com os quadrantes $Q_0$, $Q_1$, $Q_2$ e $Q_3$ definidos, podemos realizar a substituição na matriz original.

Este processo de divisão de quadrantes pode ser facilmente realizado no OpenCV da seguinte forma em C++:

1
2
3
4
5
cv::Mat quadrants[4];
quadrants[0] = image(cv::Rect(0, 0, image.cols / 2, image.rows / 2));
quadrants[1] = image(cv::Rect(image.cols / 2, 0, image.cols / 2, image.rows / 2));
quadrants[2] = image(cv::Rect(0, image.rows / 2, image.cols / 2, image.rows / 2));
quadrants[3] = image(cv::Rect(image.cols / 2, image.rows / 2, image.cols / 2, image.rows / 2));

Para realizar a substituição e montar uma nova imagem a partir dos novos quadrantes, podemos utilizar a seguinte função em C++:

1
2
3
4
5
6
7
8
9
cv::Mat mountImage(cv::Mat quadrants[4])
{
  cv::Mat image, quadrantsTop, quadrantsBottom;
  cv::hconcat(quadrants[0], quadrants[1], quadrantsTop);
  cv::hconcat(quadrants[2], quadrants[3], quadrantsBottom);
  cv::vconcat(quadrantsTop, quadrantsBottom, image);

  return image;
};

Para verificar o código completo, acesse: Github.com/ErnaneJ/pdi/quadrants

Executar 🚀

1
make main && ./main

Para usar uma imagem diferente de “biel.png”, altere a linha 5 correspondente à macro IMAGE_FILE.

Saída 🖼️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
🖼️  Quadrants - [biel.png] 🖼️

──────────────────────────────────────────────

📍 Which quadrant do you want to replace 1º (1-4)? 3
📍 Which quadrant do you want to replace 2º (1-4)? 2
📍 Which quadrant do you want to replace 3º (1-4)? 4
📍 Which quadrant do you want to replace 4º (1-4)? 1

💡 Do you want to show the quadrants individually (y/n)? y

✅ Quadrants successfully manipulated!

──────────────────────────────────────────────

🎓 Sudent: Ernane Ferreira - DCA0445
OriginalQuadrantes Manipulados
originalquadrantes
EsquerdaDireita
quadrante 1quadrante 2
quadrante 3quadrante 4
Esta postagem está licenciada sob CC BY 4.0 pelo autor.