CENTRO DE TECNOLOGIA
DEPARTAMENTO DE INFORMÁTICA
PROGRAMA DE PÓS-GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO
Alunos:
a) Rotação de imagens
b) Redimensionamento de imagens
Algoritmo 1: Rotação de imagem
Objetivo:
Dada uma imagem, solicitar ao usuário um grau de rotação (0-360) e aplicá-lo na imagem.
Ao girar uma imagem retangular sabemos que seus cantos se deslocam para cima e para baixo,
e para que a imagem inteira seja exibida é preciso aumentar a matriz da imagem resultante ou
reduzir a imagem calculada. Para calculo da dimensão necessária para a imagem de saída
utilizamos o calculo abaixo:
Desta forma não será preciso fazer cortes na imagem. Uma vez criada a matriz destino que
formaria a imagem de saída, varemos todos os pontos dessa matriz e realizamos o
“mapeamento inverso” (pra cada ponto de saída, calculamos qual o ponto na imagem origem
ele deve representar).
Outro problema encontrado foi que ao rotacionar a imagem ela se deslocava em relação ao
centro e conforme o ângulo informado a imagem “fugia” do quadro. Tivemos que fazer um
controle do centro da imagem origem/destino para que ela pudesse ficar centralizada e sem
cortes.
Demonstração
emonstração do experimento:
1 – Tela do Pyzo com o código carregado iniciando a execução,, solicita o ângulo de rotação:
Objetivo:
Dada uma imagem, solicitar um valor percentual para ampliação (>100) ou redução (<100) e
aplicar na imagem de origem e exibi
exibi-la em tela.
Demonstração
emonstração do experimento:
1 – Tela do Pyzo com o código carrega
carregado e solicitando no prompt do console o valor da
ampliação.. Valor informado no exemplo: 50
2- Em seguida são exibidas a imagem original e a imagem com a escala informada aplicada:
Repare na área do prompt que exibimos as dimensões da imagem original e da imagem final
(220x220 110x110), pelos valores confirma
confirma-se
se que ocorreu a redução de escala.
Repare na área do prompt que exibimos as dimensões da imagem original e da imagem final
(220x220 385x385), pelos valores confirma
confirma-se
se que ocorreu a ampliação de escala.
Objetivo: Dada uma imagem, obter um valor de angulo para rotacionar a image
imagem original
"""
import cv2
importnumpy as np
import math
frommatplotlib import pyplot as plt
angulo = math.radians(float(angulo))
sin = math.sin(angulo)
cos = math.cos(angulo)
centroX = 0.5 * (float(largura) - 1.0)
centroY = 0.5 * (float(altura) - 1.0)
### calculamos a nova largura da imagem final para poder encaixar a imagem inclinada
n_largura = ( (altura * abs(sin)) + (largura * abs(cos))) #nova largura
n_altura = ( (altura * abs(cos)) + (largura * abs(sin))) #nova altura
### Mapeamento inverso: Varre cada ponto da imagem final, puscando na imagem origem o
ponto a mapear
forcoluna in range(n_largura):
for linha in range(n_altura):
# Formula página 57, adicionando o desclocamento dos centros
#x= v*cos(ang) - w* sen(ang)
#y= v*sen(ang) + w* cos(ang)
colOrigem = int((float(coluna) - n_centroX) * cos - (float(linha) - n_centroY) * sin +
centroX)
linOrigem = int((float(coluna) - n_centroX) * sin + (float(linha) - n_centroY) * cos +
centroY)
### o mapeamento inverso encontrou uma coordenada dentro da figura original,
entaotransfere ele
if (colOrigem>= 0) and (colOrigem< largura) and (linOrigem>= 0) and (linOrigem< altura):
imgFinal[coluna][linha] = imgOriginal[colOrigem][linOrigem]
Objetivo: Dada uma imagem, obter um valor % de escala para ampliar ou reduzir a imagem
original
"""
import cv2
importnumpy as np
def novasMedidas(p_percent):
#rotina que recalcula as novas medidas da nova imagem que sera gerada.
#p_percent e o percentual informado pelo usuario<100 diminui>100 aumenta
largura = int(imgOriginal.shape[0]*p_percent/100)
altura = int(imgOriginal.shape[1]*p_percent/100)
return(largura,altura)
fileName = "C:\\Temp\\lena.png"
imgOriginal = cv2.imread(fileName,1)
#Escala por mapeamento inverso, p/cada pto da img destino pegamos na origem o pto a ser
representado
forcolunaDestino in range(novaLarg):
forlinhaDestino in range(novaAlt):
colunaOrigem = colunaDestino * imgOriginal.shape[0] // novaLarg
linhaOrigem = linhaDestino * imgOriginal.shape[1] // novaAlt
imgFinal[colunaDestino][linhaDestino] = imgOriginal[colunaOrigem][linhaOrigem]
#imgFinal.set(colunaDestino, linhaDestino, imgOriginal.get(colunaOrigem,
linhaOrigem))
print("Tamanho original:",imgOriginal.shape[0],"x",imgOriginal.shape[1])
print("Tamanho Final:",imgFinal.shape[0],"x",imgFinal.shape[1])