Sei sulla pagina 1di 5

Relatório n.

1 de atividades

Autor: Jugurta Montalvão, Grupo Biochaves

São Cristóvão, 04 de julho de 2018


________________________________________________

Descrição do problema: Dada uma imagem como a seguinte (asa de abelha),

1536 x 2048

Mesma imagem em níveis de cinza


deseja-se implementar uma rotina computacional para encontrar automaticamente a parte da imagem que
mais se parece com um dado template de detalhe. A título de exemplo, o template poderia ser uma pequena
matriz de pixels como a seguinte:

81 x 81
Detalhe a ser buscado na imagem maior
Solução possível: Usar como função critério a ser maximizada o produto escalar entre o template e
pedaços de mesmo tamanho da imagem total, centrados no pixel cujas coordenadas (linha e coluna)
definem uma posição no espaço de busca/otimização. Importante: para uso apropriado do produto escalar
como critério, tanto o template quanto pedaço de imagem devem ser previamente convertidos em vetores e
normalizados.
As figuras seguintes ilustram a complexidade do critério usado na otimização. O código correspondente é
apresentado em seguida.
Função objetivo (critério) na vizinhança da posição ótima, segundo a medida de produto escalar.

Curvas de nível da função objetivo na vizinhança do ponto ótimo.

Código em Matlab:

% Abertura da imagem e sua importação sob a forma de 3 matrizes, uma por canal
de cor:
im = double(imread('A. mellifera1.jpg'));

% Pré-tratamento da imagem:
M=im(:,:,3); % Apenas o canal azul (3) é usado neste exemplo
M=max(M(:))-M;
M=M/max(M(:));
% Parâmetro de sub-imagem
Margem=40;
Viz=80;

% Captura de sub-imagem via mouse:


subplot(2,2,1)
imagesc(M)
colormap('gray')
[x0,y0]=ginput(1);
x0=round(x0);
y0=round(y0);
B=M(y0-Margem:y0+Margem, x0-Margem:x0+Margem);
B=B-mean(B(:));
B=B/sqrt(sum(B(:).^2));
subplot(2,2,2)
imagesc(B)
drawnow

% Comparação de subimagem no seu entorno, usando produto escalar como medida:


clear J;
for i=-Viz:Viz,
for j=-Viz:Viz,
C=M(y0+i-Margem:y0+i+Margem, x0+j-Margem:x0+j+Margem);
C=C-mean(C(:)); C=C/sqrt(sum(C(:).^2));
J(i+Viz+1,j+Viz+1)=B(:)'*C(:);
end,
end
subplot(2,1,2)
surf(J)
%contour(J)

Desdobramento do problema e solução melhorada: Na escala original, tanto a imagem completa quanto
o template possuem muitos detalhes que são responsáveis por grande parte da complexidade do ''relevo''
da função critério sem, no entanto, serem favoráveis à busca. Além disso, mesmo com busca exaustiva, o
risco de falsos encaixes é grande para templates pequenos. Isso sugere que a busca pode se beneficiar de
uma estratégia em multi-escala, começando com imagens pequenas (na ilustração, escolhi arbitrariamente
a dimensão 80x80 pixels como sendo a resolução mais grosseira em que ainda se podem ver os detalhes
das ramificações nas asas do inseto), e gradualmente refinando as posições encontradas na busca para
escalas mais finas, até chegar à representação original.
É relevante notar a analogia dessa abordagem com a ''têmpera simulada'' ou o simulated annealing, em
particular com o ''deterministic simulated annealing'', onde a função critério é inicialmente suavizada e
gradualmente vai reestabelecendo seus detalhes finos durante o processo de busca/otimização que simula
um resfriamento.
A título de ilustração da solução em multi-escala, a imagem seguinte mostra, em azul, um detalhe escolhido
via mouse na imagem com resolução alta. Isto é, há agora duas imagens: uma de referência, onde se deve
escolher um ponto central do que será o template de busca, e outra imagem de busca, onde será procurada
a posição do pedaço de imagem que mais se parece com o template escolhido.
Uma vez escolhido um ponto (possivelmente um marco anatômico da asa) na imagem de referência, um
pedaço 20x20 dessa imagem, no entorno do ponto escolhido, é capturado como template.
Tanto a imagem de referência quanto a imagem de busca são submetidos a uma sequência de
subamostragens com filtragem anti-aliasing até que a imagem original tenha uma de suas dimensões menor
que 80 pixels. A subamostragem com anti-aliasing é feita pela seguinte rotina:
function N=subamostra(M)
N=M(1:2:$-1,1:2:$-1)+M(2:2:$,1:2:$-1)+M(1:2:$-1,2:2:$)+M(2:2:$,2:2:$);
N=(1/4)*N;
endfunction

Na resolução mais grosseira, a busca então é feita. A figura seguinte indica a região encontrada na busca
mais grosseira.

Template na
escala mais
grosseira (toma
quase toda a
estrutura da asa)

Região
Estimativa grosseira da posição do grosseira na
pixel central (primeira estimativa da imagem de
posição equivalente ao ponto busca em que o
escolhido na imagem de referância). template melhor
se encaixa.

A partir da estimação grosseira assim obtida para a posição do pixel central, uma nova busca exaustiva –
limitada contudo ao entorno desse ponto – é feita na resolução menos grosseira logo ‘’acima’’. Esse
processo de busca local exaustiva e refinamento é iterado até que a resolução original da imagem seja
atingida, como ilustrado a seguir.
Vale notar que o
template representa cada Refinando a
vez mais finamente o escala/busca
detalhe no entorno do
ponto escolhido.

Atualmente, esse processo está sendo implementado num protótipo para estimação automática das
coordenadas de marcos anatômicos escolhidos em uma imagem de referência. No caso típico de mais de
um marco anatômico na mesma imagem, as estimações simultâneas das posições correspondentes dos
vários marcos podem ser associadas a uma tolerância limite à deformação para correção de desvios
grosseiros nas estimações relativas das posições dos marcos. Isso será tratado no próximo relatório.

Potrebbero piacerti anche