La Web del Programador: Comunidad de Programadores
https://www.lawebdelprogramador.com/foros/Matlab/1313851-Segmentar-una-imagen.html

Segmentar una imágen

Segmentar una imágen

Publicado por Oscar (3 intervenciones) el 22/02/2012 16:44:33
Hola.
Por favor si me pueden colaborar en el siguiente ejercicio:

Necesito tomar una imágen y hacer que tome el borde de la misma y la redibuje. Me explico:

Tengo una imágen binaria (unos y ceros) que importo imread('C:\...\imagen.jpg'); es decir una mancha negra sobre un fondo blanco y necesito que recorra la matriz y cada vez que encuentre un pixel negro (el primero de cada borde) lo almacene en una nueva matriz para luego mostrar únicamente el contorno de la imágen inicial.

Lo que creo que se debe hacer es realizar 4 bucles para recorrer la imágen en los cuatro sentidos (izquierda a derecha, derecha a izquierda, arriba hacia abajo y de abajo hacia arriba) y cuando localice el primer pixel negro lo vaya almacenando en una nueva matriz para luego ser mostrada.
Imágen de perfil de Dave

Segmentar una imágen

Publicado por Dave (1094 intervenciones) el 23/02/2012 22:16:06
Hola Oscar;

De tu consulta noto que tienes claro la funcionalidad de tu programa, creo que lo unico que te falta es programarlo?. Por lo tanto solo te quedaría iniciar a programar, aca en el foro mayormente se apoya en la solución de problemas especificos.

Quizas una alternativa pueda ser que uitlices las funciones de segmentación de imagenes propias de Matlab, te dejo un ejemplo:

% SEGMENTACIÓN
% Si la imagen es RGB, la pasa a escala de grises

if size(imagen,3)==3 %3 planos: RGB
gris=rgb2gray(imagen);
else
gris=imagen;
end

% Binarización con umbral automático *0.60
bina=im2bw(gris,graythresh(gris)*0.60);

% Procesamiento morfológico
bina=bwmorph(bina,'open'); % Eliminar picos
bina=bwmorph(bina,'close'); % Eliminar huecos

% Etiquetar los objetos de la imagen
L=bwlabel(bina);

% Calcular "área" y "caja" de objetos
prop=regionprops(L,{'Area','BoundingBox'});

% Tomar el área máxima
[m pam]=max([prop.Area]);

% "roi" contiene solo la imagen más grande
roi=ismember(L,pam);
ee=strel('disk',18,0);
roi=imdilate(roi, ee);

% Obtener los límites del área máxima
limites=prop(pam).BoundingBox;

% Presentar el área de interés (roi)
imagesc(roi)
colormap gray

Espero que sea de alguna ayuda.

Saludos
Dave Correa
[email protected]
Servicios de Programación Matlab
http://fismatlab.blogspot.com/
Imágen de perfil de Dave

Segmentar una imágen

Publicado por Dave (1094 intervenciones) el 23/02/2012 22:17:20
Hola Oscar;

De tu consulta noto que tienes claro la funcionalidad de tu programa, creo que lo unico que te falta es programarlo?. Por lo tanto solo te quedaría iniciar a programar, aca en el foro mayormente se apoya en la solución de problemas especificos.

Quizas una alternativa pueda ser que uitlices las funciones de segmentación de imagenes propias de Matlab, te dejo un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
% SEGMENTACIÓN
% Si la imagen es RGB, la pasa a escala de grises
 
if size(imagen,3)==3 %3 planos: RGB
gris=rgb2gray(imagen);
else
gris=imagen;
end
 
% Binarización con umbral automático *0.60
bina=im2bw(gris,graythresh(gris)*0.60);
 
% Procesamiento morfológico
bina=bwmorph(bina,'open'); % Eliminar picos
bina=bwmorph(bina,'close'); % Eliminar huecos
 
% Etiquetar los objetos de la imagen
L=bwlabel(bina);
 
% Calcular "área" y "caja" de objetos
prop=regionprops(L,{'Area','BoundingBox'});
 
% Tomar el área máxima
[m pam]=max([prop.Area]);
 
% "roi" contiene solo la imagen más grande
roi=ismember(L,pam);
ee=strel('disk',18,0);
roi=imdilate(roi, ee);
 
% Obtener los límites del área máxima
limites=prop(pam).BoundingBox;
 
% Presentar el área de interés (roi)
imagesc(roi)
colormap gray

Espero que sea de alguna ayuda.

Saludos
Dave Correa
[email protected]
Servicios de Programación Matlab
http://fismatlab.blogspot.com/

Segmentar una imágen

Publicado por Oscar (3 intervenciones) el 23/02/2012 22:37:29
Hola Dave.

Muchas gracias por responder a mi pregunta.

Voy a probar el código, aunque me hubiese gustado poder manejarlo desde algo más básico, pues la idea es entender cómo Matlab trabaja este tipo de funciones ya implementadas; claramente usando algo de programación estructurada (ciclos for, while, condiciones if, etc).
Imágen de perfil de Dave

Segmentar una imágen

Publicado por Dave (1094 intervenciones) el 23/02/2012 22:43:41
Hola Oscar;

De hecho que lo mejor es desarrollar sus propios códigos y entender todo lo que se hacer, pero para eso es necesario saber programar o contratar los servicios de un programador. Pero de todas maneras, serpia bueno que lo intentes.

Espero que sea de alguna ayuda.

Saludos
Dave Correa
[email protected]
Servicios de Programación Matlab
http://fismatlab.blogspot.com/
Imágen de perfil de Dave

Segmentar una imágen

Publicado por Dave (1094 intervenciones) el 01/03/2012 02:30:35
Hola Oscar;

Como te fue con el desarrollo de tu código.

Espero que sea de alguna ayuda.

Saludos
Dave Correa
[email protected]
Servicios de Programación Matlab
http://fismatlab.blogspot.com/

Segmentar una imágen

Publicado por Jorge (1 intervención) el 29/05/2014 01:32:18
Mira que eres un capo man....gracias, me has ayudado mucho en mi proyecto.

Segmentar una imágen

Publicado por Shirley Fuentes (1 intervención) el 13/04/2015 02:35:02
Tal vez este otro ejemplo te puede ayudar, es usando el algoritmo de conectividad con blucles

para la siguiente imagen:

http://static2.bigstockphoto.com/thumbs/5/3/4/large2/43502047.jpg



%% IMAGEN A BW %%
imag=imread('images.jpg');
grises=rgb2gray(imag);
%figure, imshow(blne);
%B=logical(grises)
level = graythresh(imag);
BW1 = im2bw(imag,level);
figure, imshow(imag), figure, imshow(grises), figure, imshow(BW1);

BW = ~BW1;
BW = 1-BW1;
BW = (BW1 == 0);
%imwrite(BW,'ss1.png');
figure,imshow(BW);


%% ETIQUETADO %%
[mfilas,ncols]=size(BW);
rbin=size(BW);
%v=zeros(197:256);
v=[3:1:600];
a=0;

for t=2:mfilas %para cada fila
for r=2:ncols %para cada columna

if BW(t,r)==0; %mientras el pixel sea cero seguira siendo la misma
rbin(t,r)=0;
end

if (BW(t,r)==1 && BW(t,r-1)==0 && BW(t-1,r)==0);%Si t=0 y r=0 asignar nueva
a=a+1;
z=v(a);
rbin(t,r)=z;
end


if (BW(t,r-1)==1 && BW(t-1,r)==0);%Si t=0 y r=0 asignar nueva
VC=rbin(t,r-1);
end


if (BW(t,r-1)==0 && BW(t-1,r)==1);%Si t=0 y r=0 asignar nueva
VD=rbin(t-1,r);
end

if (BW(t,r)==1 && BW(t,r-1)==1 && BW(t-1,r)==1);%Si t=0 y r=0 asignar nueva
VE=rbin(t-1,r);
rbin(t,r)=VE;
CH1=rbin(t,r-1);
CH2=rbin(t-1,r);
rbin(rbin==CH1) = CH2;
end

end
end

Segmentar una imágen

Publicado por Alejandro (3 intervenciones) el 12/06/2015 18:08:22
Y si por ejemplo en vez de pasarla a escala de grises ciha imagen RGB, la quiero pasar a HSV o indexxarla?podria segmentar igual dicha imagen??