Rotação Imagens Computação Gráfica

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 11

PARTE 1: ROTAÇÃO DE IMAGENS

Para o primeiro método foi utilizada a transformação geométrica que


permite rotacionar uma imagem em qualquer ângulo, em tordo do origem do
sistema (coordenada 0,0).

As fórmulas utilizadas

x ' =x ∙ cos cos ( θ )− y ∙ sen(θ)

y ' = y ∙ cos cos ( θ ) + x ∙ sen(θ)


O primeiro passo foi converter a coordenada de um pixel da imagem no
sistema de coordenadas da tela para o sistema do mundo real, para que fosse
possível aplicar a rotação. A teoria aplicada está contida nas seguintes
fórmulas:

x r=x i−C xi

y r =Cyi − y i
Onde:

x r e y r −são as coordenadas no sistema do mundo real ( rotação ) .


x i e y i−são as coordenadas no sistema da tela .

cx i e cy i −são as coordenadas do centro da imagem no sistema datela .

Após aplicar a rotação, os valores de x ' e y ' calculados dever ser convertidos de
volta para o sistema da tela. A equação que realiza essa operação está abaixo:

'
x i=x r−C xi
'
y i=Cy i− y r
Quando há transformação entre sistemas de coordenas, deve-se partir da
imagem de destino e procurar o pixel correspondente na imagem da origem.
Isso se deve ao fato de que, ao percorrermos os pixels na imagem original, nem
sempre há garantia de que todos os pontos da imagem destino são preenchidos.
Portanto, as mudanças que devemos realizar para partir da imagem destino são:

1. Assumir o ângulo teta (θ) da primeira equação como negativo;


2. Pegar a cor do pixel calculado e
3. Preencher o pixel lida com essa mesma cor.

Após testar o algoritmo e ajustá-lo diversas vezes o resultado ficou assim:

Para θ=45 º
Para o segundo método foi utilizada a rotação com números complexos
cuja fórmula de Ëuler é aplicada conforme descrita abaixo:

e =cos cos (θ ) +i∙ sen (θ)
Pretendemos rotacionar (x , y ) por um ângulo ∅ da seguinte forma:

z=x +iy
Em que:

x=ℜ { z } e x=ℑ { z }
' iθ i (θ ) i (θ ) i ( θ +∅ )
z =z ∙ e =( r ∙ e )=e =r ∙ e

z ' =r ¿
'
z =r ¿

' ' '


z =x +i ∙ y
Em que:

' '
x =ℜ { z }=r ∙ cos ⁡( θ+∅)
' '
y =ℑ { z } =r ∙ sen ⁡(θ +∅)
Após testar o algoritmo e ajustá-lo diversas vezes o resultado ficou
assim:

Para θ=45 º

Considerações: na construção do algoritmo foram utilizados vários métodos


através dos comandos próprios do Matlab/Octave com a finalidade de ajustar
matrizes, arredondar números para inteiros, conversões entre planos
(cartesianos x polares) além de laços de repetição para promover as respectivas
rotações.
Oportunidade de melhorias: Em comparação com o resultado utilizando a função
pronta imrotate do Matlab/Octave (figura abaixo) os dois métodos perderam
qualidade na imagem e o enquadramento não ficou perfeito. Então fica uma sugestão
para que ajuste esses itens para que se apresenta algo que aproxima melhor da
teoria.

Resultado

Para θ=45 º
PARTE 2: MODIFICAÇÃO EM ESCALA

Nesta parte do trabalho, foi escrito um algoritmo em Octave que realiza


modificações em escala na imagem, a função recebe os fatores de alteração:
dilatação horizontal, compressão horizontal, dilatação vertical e compressão
vertical.
Para que seja realizada a modificação o algoritmos realiza as seguintes etapas,
em ordem para preservar o máximo possível da imagem original :
1 - Dilatação horizontal, por um fator inteiro, com o procedimento de inserção de
zeros, com a utilização de um loop for para percorrer todas as linhas da imagem
original e inserindo zeros a cada n posições, seguido da convolução com a
máscara triangular gerada em função de n em todas as linhas da matriz da
imagem;
2 - Compressão horizontal, por um fator inteiro, da imagem gerada na etapa
anterior, com o procedimento de convolução com a máscara triangular gerada
em função de n, seguido da eliminação de n - 1 pixels a cada n elementos,
realizado agora com um loop while e a remoção da coluna correspondente na
matriz da imagem;
3 - Dilatação vertical, por um fator inteiro, da imagem na etapa anterior, com
procedimento análogo ao da etapa 1, porém feito agora em razão das colunas da
matriz;
4 - Compressão vertical, por um fator inteiro, da imagem na etapa anterior, com
procedimento análogo ao da etapa 2, porém feito agora em razão das colunas da
matriz.
Para cada etapa de convolução é utilizada uma máscara de redução/dilatação,
foi adotada a máscara triangular fixa em nossa abordagem.
Em nosso experimento, foi utilizada a imagem gerada pela função phantom do
Octave, ilustrada abaixo:
Para a modificação em escala horizontal por um fator de 3/2, foi obtido o
seguinte resultado:

Para a modificação em escala vertical por um fator de 4/5, foi obtido o seguinte
resultado:

Em ambos experimentos foi observado que o algoritmo não está otimizado para
execução, é perceptível a lentidão de execução, principalmente em imagens de
tamanhos grandes, inicialmente também, havia a alteração em brilho da imagem,
que foi resolvido após comentário do professor em aula, da necessidade de
dividir a matriz resultante da operação de saída na operação de compressão pela
soma dos valores da máscara triangular.
Foi observado também, que aparentemente o algoritmo não lida bem com a
suavização de bordas.
CONCLUSÃO
No procedimento de rotação de imagem percebemos nos dois métodos
utilizados a muito a se explorar e que o conhecimento adquirido em sala
contribuiu para que se chegasse a um resultado satisfatório. As dificuldades
foram essenciais para o desenvolvimento deixando margem para evoluir o que
foi aplicado.
Em relação à aplicação correção gamma (𝜸) representamos as imagens
afetados por esse ajuste no brilho que são claramente identificados nos
resultados. Há margens a serem exploradas como o refinamento do algoritmo e
a experimentação de imagens mais apropriadas para embasar a teoria dessa
técnica importante para Computação Gráfica.
No procedimento de modificação em escala foi percebido que a
performance do algoritmo não é boa, devido a existência de loops for dentro de
loops for, gerando o que conhecemos como complexidade quadrática, Por
último, em tentativas com imagens de fotografias o algoritmo não funcionou,
exibindo sempre uma imagem completamente em branco.
ANEXOS
ALGORITMOS (SCRIPTS) UTILIZADOS NA RESOLUÇÃO DA ATIVIDADES
PARTE 1: Rotação de Imagens

Utilizando a função do Matlab imrotate obtivemos o seguinte resultado:


Comandos
I = imread('Tabuleiro.jpg');
imshow(I)
J = imrotate(I,45);
imshow(J)

ALGORITMO 1:

%%COMPUTAÇÃO GRÁFICA - 1º % Girar


SEM_2021 - PROF. THIAGO - nx = cx*cos(teta)-cy*sin(teta);
Rotação de Imagens ny = cx*sin(teta)+cy*cos(teta);

% Vizinho mais próximo


br = imread('Tabuleiro2.jpg'); nx = round(nx);
[a b c]= size(br); ny = round(ny);
br2 = zeros(a,b,c);
br2 = uint8(br2); % Retornar sistema antigo
teta = input('Digite o ângulo de cx = nx + centroX;
rotação:'); cy = centroY + ny;
angleInRadians = degtorad(- if (cx>0)
teta); if (cy>0)
if (cx<=b)
centroX = 50; if (cy<=a)
centroY = 50; br2(y,x,:) =
br(cy,cx,:);
for x = 1 : b end
for y = 1 : a end
end
end
% Do sistema de tela para o
end;
sistema central
end;
figure(1);
% Sistema de coordenadas do subplot(1,2,1);imshow(br);title(
centro 'Antes da Rotação')
cx = x - centroX; subplot(1,2,2);imshow(br2);title
cy = centroY - y; ('Após a Rotação')
ALGORITMO 2:

%%COMPUTAÇÃO GRÁFICA - 1º t1 = radtodeg(t) + deg;


SEM_2021 - PROF. THIAGO - %Converter de graus para
Rotação de Imagens radianos
t = degtorad(t1);
img = imread('Tabuleiro.jpg'); %Converter para
coordenadas cartesianas
x1 = [x,y] = pol2cart(t,r);
zeros([size(img,1)*size(img,2) x1(m) = round(x+midx);
1]); x2(m) = round(y+midy);
x2 =
zeros([size(img,2)*size(img,1) m = m+1;
1]);
end
%Especifique o grau end
deg = input('Digite o ângulo de
rotação:'); %verifica se os valores estão
dentro do tamanho da imagem.
%Muda o tamanho da imagem
C = uint8(zeros([size(img,1) x1(find(x1 < 1)) = 1;
size(img,2) 3 ])); x2(find(x2 < 1)) = 1;
m = 1;
n = 1;
%Encontre o ponto médio for i=1:size(img,1)
midx = ceil((size(C,1)+1)/2); for j=1:size(img,2)
midy = ceil((size(C,2)+1)/2);
C(x1(n),x2(n),:)=img(i,j,:);
for i = 1:size(img,1) n=n+1;
i1 = i-midx; end
for j = 1:size(img,2)
%convertido de end
cartesiano para polar subplot(1,2,1);imshow(img);title
[t,r] = cart2pol(i1,j- ('Antes da Rotação')
midy); subplot(1,2,2);imshow(C);title('
%Converter de radianos Após a Rotação')
para graus e adicionar o valor
do grau
PARTE 2: MODIFICAÇÃO EM ESCALA

Você também pode gostar