Postado em 13 de Abril, 2019
Os dois primeiros exercícios, para a disciplina de Processamento Digital de Imagens, consistiam em manipular a matriz de uma imagem de duas formas diferentes: o primeiro inverte os tons de cinza em uma região provida pelo usuário e o segundo troca os quadrantes que compõem a imagem.
Para o primeiro programa (regions.cpp, disponível aqui), era necessário coletar do usuário dois pontos da imagem, ou seja: quatro coordenadas. Duas para o ponto 1 e duas para o ponto 2, como se pode ver no trecho abaixo.
A partir da leitura, a coordenada X do ponto 1 está armazenada na variável xp1 e a coordenada Y do ponto 1 está armazenada na variável yp1, com o mesmo se repetindo para o ponto 2. Afim de evitar que o programa apresentasse algum problema durante o laço de repetição para pintar a área submetida, com o recebimento de coordenadas do ponto 2 menores que as do ponto 1, escrevi um trecho condicional para trocar os valores das variáveis.
Com isso, os laços for aninhados podem partir do menor para o maior valor, tanto em X quanto em Y e subtrair de 255 o valor do tom de cinza existente em cada pixel da matriz. Segue o código completo:
E para o segundo programa, era necessário que os quadrantes da imagem fossem substituídos diagonalmente. A maior dificuldade aqui foi perceber que existem duas formas diferentes de copiar a matriz de uma imagem, no OpenCV. Uma delas é uma cópia "rasa", quando você atribui outro nome (nesse caso, variável) para a mesma matriz, e outra é a cópia "profunda", que cria matrizes distintas, para variáveis diferentes, através do comando clone(). Após conhecer essa diferença, o restante do código saiu depressa. Fiz uma cópia separada da imagem original (deep copy) e fiz um par de laços para cada quadrante, modificando a variável de saída de acordo com a posição original dos quadrantes, na imagem original. Aqui está código final: