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
Question
Lemberck
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:
Desde já agradeço!
Edited by LemberckLink 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.