Jump to content
Fórum Script Brasil
  • 0

Processamento de imagem - como tirar sombras?


Lemberck

Question

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!

Edited by Lemberck
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...