2012-04-07 15 views
5

Como ve, tengo formas y sus límites blancos. Quiero llenar las formas en color blanco.formas de relleno Matlab por blanco

La entrada es: enter image description here

me gustaría conseguir este resultado: http://s12.postimage.org/z3txnlb3f/untitled33.png

Puede alguien ayudarme por favor con este código? no cambia las elipsis negras a blanco. Muchas gracias:]]

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 
CC = bwconncomp(Ibw); %Ibw is my binary image 
stats = regionprops(CC,'pixellist'); 

% pass all over the stats 
for i=1:length(stats), 
size = length(stats(i).PixelList); 
% check only the relevant stats (the black ellipses) 
if size >150 && size < 600 
    % fill the black pixel by white  
    x = round(mean(stats(i).PixelList(:,2))); 
    y = round(mean(stats(i).PixelList(:,1))); 
    Ibw = imfill(Ibw, [x, y]); 
end; 
end; 

imshow(Ibw); 
+0

relacionada a http://stackoverflow.com/questions/10053651/ obtener los píxeles que pertenecen a una forma – Gray

Respuesta

1

Si las imágenes son todo negro & blanco, y usted tiene el kit de herramientas de procesamiento de imágenes, a continuación, esto se parece a lo que necesita: http://www.mathworks.co.uk/help/toolbox/images/ref/imfill.html

Algo así como:

imfill(image, [startX, startY]) 

donde startX, startY es un píxel en el área que desea llenar.

+0

gracias, pero ¿cómo puedo encontrar los píxeles de cada forma? –

+0

Puede usar bwconncomp (http://www.mathworks.co.uk/help/toolbox/images/ref/bwconncomp.html). Si haces algo como 'c = bwconncomp (imagen)', entonces puedes ver los componentes con 'c.PixelIdxList'. Estos son índices lineales en la imagen, que le indican qué píxeles están en qué componente. Desea ignorar un componente (el fondo), que podría asumir que es la lista más grande en PixelIdxList, o podría buscar una lista que contenga un píxel de borde. Del resto de los componentes en c, debe verificar si son negros. Si lo son, use el relleno en ellos. – Richante

+0

Oh, noté que tu imagen también tiene un gran borde blanco. También quiere ignorar ese componente (así que tal vez ignore los dos componentes más grandes en 'PixelIdxList'). – Richante

3

Su código se puede mejorar y simplificar de la siguiente manera. En primer lugar, negar Ibw y usar BWCONNCOMP para encontrar componentes con 4 conexiones le dará índices para cada región negra. En segundo lugar, ordenar las regiones conectadas por el número de píxeles en ellas y elegir todas menos las dos más grandes le dará índices para todas las regiones circulares más pequeñas. Finalmente, los índices lineales de estas regiones más pequeñas se pueden recopilar y usar para completar las regiones con blanco. Aquí está el código (un poco más corto y que no requieren ningún bucle):

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 

CC = bwconncomp(~Ibw, 4); 
[~, sortIndex] = sort(cellfun('prodofsize', CC.PixelIdxList)); 

Ifilled = Ibw; 
Ifilled(vertcat(CC.PixelIdxList{sortIndex(1:end-2)})) = true; 
imshow(Ifilled); 

Y aquí está la imagen resultante:

enter image description here

+0

hola gnovice, gracias por tu ayuda, no funciona, pero Richante me ayudó ... gracias:] –