Contents

Funciones de segmentación

% Partimos de la misma imagen que antes.
img=imread('291.jpg');
img=rgb2gray(img);
imshow(img);
Warning: Image is too big to fit on screen; displaying at 33%

Binarizamos la imagen

imgbw=im2bw(img,90/255);
imshow(imgbw);
Warning: Image is too big to fit on screen; displaying at 33%

Etiquetamos la imagen

Se parte de la imagen binarizada y se usa una vecindad a 8 Como los objetos de interés son los puntos, invertimos la imagen

[imgL,numobj] = bwlabel(~imgbw,8);

imshow(label2rgb(imgL))
Warning: Image is too big to fit on screen; displaying at 33%

Calculamos las características de los objetos

datos_obj = regionprops(imgL,'all')
datos_obj = 

152x1 struct array with fields:
    Area
    Centroid
    BoundingBox
    SubarrayIdx
    MajorAxisLength
    MinorAxisLength
    Eccentricity
    Orientation
    ConvexHull
    ConvexImage
    ConvexArea
    Image
    FilledImage
    FilledArea
    EulerNumber
    Extrema
    EquivDiameter
    Solidity
    Extent
    PixelIdxList
    PixelList
    Perimeter

Seleccionar los puntos

% El diámetro de los puntos es de aproximadamente 40 pixels. Por ello, un
% posible criterio para seleccionar los puntos es que el eje mayor y el eje
% menor sean aproximadamente iguales a 40. Se fijara una holgura de +- 7 pixels

puntos=find(abs([datos_obj(:).MajorAxisLength]-40)<7 & abs([datos_obj(:).MinorAxisLength]-40)<7);

% En la variable puntos queda almacenado el número de los objetos que cumplen la
% condición fijada. Usaremos esta información para marcar los centros.
centros=reshape([datos_obj(puntos).Centroid],2,length(puntos))';
imshow(img);
hold on;
axis ij;
plot(centros(:,1),centros(:,2),'rx','LineWidth',2,'MarkerSize',10);
hold off
Warning: Image is too big to fit on screen; displaying at 33%