Ir para conteúdo
Fórum Script Brasil
  • 0

Processamento de imagem - como tirar sombras?


Lemberck

Pergunta

Boa tarde,

Gostaria de um ccódigo que fosse capaz de remover a sombra de uma foto captada por câmera.

Estou utilizando o programa exemplo do matlab que identifica objetos redondos, porém ao utilizar uma imagem captada por câmera (ao invés de desenhos de computador), a sombra do objeto é fundida com o objeto no tratamento da imagem do código, retornando uma falsa identificação de objetos o código está abaixo, e um exemplo da imagem que quero utilizar e me livrar da sombra também:

imagem = imread('balao.jpg'); % leitura da figura teste.jpg e armazenamento na variável imagem.

imshow(imagem);%mostra a figura armazenada na variavel imagem (opcional)

cinza = rgb2gray(imagem); %converte a figura armazenada na variavel imagem em escala de cinza e salva na variavel cinza

imshow(cinza); %mostra a figura salva em cinza (opcional)

threshold = graythresh(cinza); %calcula um valor numerico que será armazenado na variavel threshold. Esse valor numérico é usado para converter figuras em escala de cinza para imagem binaria

binaria = im2bw(cinza,threshold); % converte a figura em escala de cinza armazenada na variavel cinza em uma imagem binaria que será armazenada na variavel binaria. O fator de conversao é o armazenado em threshold.

imshow(binaria);%mostra a figura armazenada na variavel binaria (opcional)

%tirar ruídos da imagem - o comando bwareaopen tira os ruídos de pontos BRANCOS(na matriz sâo zeros). Logo, inverterei a imagem binaria (trocar branco com preto->zero com um) e irei retirar os pontos(que viraram zero->brancos).

binaria=~binaria;%inversão da imagem binaria e salvando na propria variavel binaria.

imshow(binaria);%opcional. Observe que o preto trocou com o branco.

bw = bwareaopen(binaria,30); % remove da figura armazenada em binaria objetos brancos com menos de 30 pixels. Salva o resultado em bw.

imshow(bw); %opcional

%Há ruidos que não são apenas pontos. Primeiro deve-se criar uma estrutura para então preenche-la, de forma que a imagem fique uniforme e o ruido seja coberto. Tiraremos o ruido de um dos circulos do cogumelo da esqueda, que está borrado

se = strel('disk',2); %cria estruturas em forma de disco com raio=2 por toda a imagem de tom inverso ao das figuras -> ver help para exemplo ilustrativo

bw = imclose(bw,se); %preenche as estruturas criadas(comando anterior) com a cor de preenchimento das figuras, eliminando ruidos diferentes de pontos dentro das estruturas.

%bw = imfill(bw,'holes'); %optei por não usar esse comando para não sumir com a estampa das figuras (no caso, os círculos dos cogumelos). Esse comando preenche os buracos das figuras. Buracos são objetos na parte interna das figuras que são da cor inversa da mesma.

imshow(bw);%opcional

%Traça os limites(boundaries) das figuras, para posteriormente preenche-las com cores para realizar calculos de métrica

[b,L] = bwboundaries(bw,'holes'); %traça limites para objetos (figuras) e seus buracos.A complexidade é maior. Para algo com melhor performance, usar 'noholes' no lugar de 'holes', os limites serão traçados apenas para objetos, ignorando os buracos. No caso, não quero ignorá-los. O B armazenará o valor dos limites, enquanto L armazenará uma matriz de label(rótulos) dos objetos e buracos.

%Agora transformaremos a imagem bw em uma imagem RGB(colorida)

rgb=label2rgb(L, @jet, [.5 .5 .5]);%transformando bw em rgb, usando a ferramente jet do matlab e tom de red=0.5, green=0.5, blue = 0.5;

hold on %mantém o gráfico atual na área de gráfico, não reescrevendo um gráfico futuro por cima desse.

imshow(rgb);%opcional

%plotando as regioes limites nas figuras da imagem rgb (mantida pelo hold on)

for k = 1:length( B ) % para k=1 até comprimento de B (região limite das figuras)

boundary = B{k};

plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2) %plotando as regiões limites de cada figura - perguntar sobre as configurações

end

%Mensuramento das propriedades das figuras

stats = regionprops(L,'Area','Centroid');% Mensuramento da área e centroide de cada região rotulada pela matriz de label L, salvando na variável stats.

threshold = 0.94;%definindo um novo valor para threshold

% loop nos limites

for k = 1:length( B )

% obtain (X,Y) boundary coordinates corresponding to label 'k'/ obtem o posicionamento da regiao limite correspondente ao rótulo 'k'

boundary = B{k};

% compute a simple estimate of the object's perimeter/conta para estimativa simples de perímetro do objeto

delta_sq = diff(boundary).^2;

perimeter = sum(sqrt(sum(delta_sq,2)));

% obtain the area calculation corresponding to label 'k'

area = stats(k).Area; %não entedi esse comando. Stats tem as medias de area e centroid de cada regiao

% compute the roundness metric /calculando a métrica baseado no quanto o objeto é redondo.

metric = 4*pi*area/perimeter^2;

% display the results

metric_string = sprintf('%2.2f',metric); %formata todos os dados guardados no vetor chamado metric na forma de %2.2f

% mark objects above the threshold with a black circle

if metric > threshold

centroid = stats(k).Centroid; %não entendi o comando

plot(centroid(1),centroid(2),'ko');

end

text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...

'FontSize',14,'FontWeight','bold');

end

title(['Metrics closer to 1 indicate that ',...

'the object is approximately round']);

as imagens: balao.jpg

balao3.jpg

Desde já agradeço!

Editado por Lemberck
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...