Hello guys and Image analyst. Why cannot my code detect every circle as blob ? As it only detect 1 blob.
Here my code, if you can modify it thanks !
im = imread('AML1.bmp');cform = makecform('srgb2lab');lab_he = applycform(im,cform);ab = double(lab_he(:,:,2:3));nrows = size(ab,1);ncols = size(ab,2);ab = reshape(ab,nrows*ncols,2);nColors = 3;% repeat the clustering 3 times to avoid local minima
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ... 'Replicates',3);pixel_labels = reshape(cluster_idx,nrows,ncols);figureimshow(pixel_labels,[]), title('image labeled by cluster index');segmented_images = cell(1,3);rgb_label = repmat(pixel_labels,[1 1 3]);for k = 1:nColors color = im; color(rgb_label ~= k) = 255; % 255=putih, 0=hitam
segmented_images{k} = color;endfigureimshow(segmented_images{1}), title('objects in cluster 1');figureimshow(segmented_images{2}), title('objects in cluster 2');figureimshow(segmented_images{3}), title('objects in cluster 3');mean_cluster_value = mean(cluster_center,2);[tmp, idx] = sort(mean_cluster_value);blue_cluster_num = idx(1);L = lab_he(:,:,1);blue_idx = find(pixel_labels == blue_cluster_num);L_blue = L(blue_idx);is_light_blue = imbinarize(L_blue);nuclei_labels = repmat(uint8(0),[nrows ncols]);nuclei_labels(blue_idx(is_light_blue==false)) = 1;nuclei_labels = repmat(nuclei_labels,[1 1 3]);blue_nuclei = im;blue_nuclei(nuclei_labels ~= 1) = 255;figureimshow(blue_nuclei), title('blue nuclei');I1 = rgb2gray(im);I2 = rgb2gray(blue_nuclei);points1 = detectHarrisFeatures(I1);points2 = detectHarrisFeatures(I2);[features1,valid_points1] = extractFeatures(I1,points1);[features2,valid_points2] = extractFeatures(I2,points2);indexPairs = matchFeatures(features1,features2);matchedPoints1 = valid_points1(indexPairs(:,1),:);matchedPoints2 = valid_points2(indexPairs(:,2),:);figure; showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);a =2; %rows
b =2; %columns
I = blue_nuclei;I2 = rgb2gray(I);originalImage = mat2gray(I2);imshow(originalImage);I_eq = adapthisteq(originalImage);imshow(I_eq);bw = im2bw(I_eq, graythresh(I_eq));imshow(bw);BW = imopen(bw, strel('square', 25));imshow(BW);%%From Blob
blobMeasurements = regionprops(BW, BW, 'all'); numberOfBlobs = size(blobMeasurements, 1);% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.
% Plot the borders of all the coins on the original grayscale image using the coordinates returned by bwboundaries.
figure, imshow(BW);title('Outlines, from bwboundaries()'); axis square;hold on;boundaries = bwboundaries(BW); numberOfBoundaries = size(boundaries);for k = 1 : numberOfBoundaries thisBoundary = boundaries{k}; plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);endhold off;fontSize = 12; % Used to control size of "blob number" labels put atop the image.
labelShiftX = -7; % Used to align the labels in the centers of the coins.
blobECD = zeros(1, numberOfBlobs);% Print header line in the command window.
fprintf(1,'Blob # Mean Intensity Area Perimeter Centroid Diameter\n');% Loop over all blobs printing their measurements to the command window.
for k = 1 : numberOfBlobs % Loop through all blobs.
% Find the mean of each blob. (R2008a has a better way where you can pass the original image
% directly into regionprops. The way below works for all versions including earlier versions.)
thisBlobsPixels = blobMeasurements(k).PixelIdxList; % Get list of pixels in current blob.
meanGL = mean(originalImage(thisBlobsPixels)); % Find mean intensity (in original image!)
meanGL2008a = blobMeasurements(k).MeanIntensity; % Mean again, but only for version >= R2008a
blobArea = blobMeasurements(k).Area; % Get area.
blobPerimeter = blobMeasurements(k).Perimeter; % Get perimeter.
blobCentroid = blobMeasurements(k).Centroid; % Get centroid one at a time
blobECD(k) = sqrt(4 * blobArea / pi); % Compute ECD - Equivalent Circular Diameter.
fprintf(1,'#%2d %17.1f %11.1f %8.1f %8.1f %8.1f % 8.1f\n', k, meanGL, blobArea, blobPerimeter, blobCentroid, blobECD(k));end
Best Answer