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