From: Jeremy Ho on
Hi there,
How are you? I have a MATLAB problem which needs to be solved ASAP and I would really appreciate your help. What I’m trying to do is to replicate a spinal column and put it through compressive testing. The picture of this test will be taken using a greyscale camera. On the spinal column, there will be a piece of white marker sticking out of the side, on top of which there will be a number of black dots. What I want to do is to get Matlab to identify the dots and automatically plot the coordinates of each dot in an excel file or similar. What I’ve done so far is managed to get the program written to identify circles, squares and such. However, I need to segment the picture in such a way that it only detects those black dots as mentioned. Any help with the codes would be very much appreciated. Thanks!


% Step 1: Read image Read in
RGB = imread('spine.bmp');
figure,
imshow(RGB),
title('Original Image');

% Step 2: Convert image from rgb to gray
GRAY = rgb2gray(RGB);
figure,
imshow(GRAY),
title('Grayscale Image');

% Step 3: Threshold the image Convert the image to black and white in order
% to prepare for boundary tracing using bwboundaries.
threshold = graythresh(GRAY);
BW = im2bw(GRAY, threshold);
figure,
imshow(BW),
title('Binary Image');

% Step 4: Invert the Binary Image
BW = ~ BW;
figure,
imshow(BW),
title('Inverted Binary Image');

% Step 5: Find the boundaries Concentrate only on the exterior boundaries.
% Option 'noholes' will accelerate the processing by preventing
% bwboundaries from searching for inner contours.
[B,L] = bwboundaries(BW, 'noholes');

% Step 6: Determine objects properties
STATS = regionprops(L, 'all'); % we need 'BoundingBox' and 'Extent'

% Step 7: Classify Shapes according to properties
% Square = 3 = (1 + 2) = (X=Y + Extent = 1)
% Rectangular = 2 = (0 + 2) = (only Extent = 1)
% Circle = 1 = (1 + 0) = (X=Y , Extent < 1)
% UNKNOWN = 0

figure,
imshow(RGB),
title('Results');
hold on
for i = 1 : length(STATS)
W(i) = uint8(abs(STATS(i).BoundingBox(3)-STATS(i).BoundingBox(4)) < 0.1);
W(i) = W(i) + 2 * uint8((STATS(i).Extent - 1) == 0 );
centroid = STATS(i).Centroid;
switch W(i)
case 1
plot(centroid(1),centroid(2),'wO');
case 2
plot(centroid(1),centroid(2),'wX');
case 3
plot(centroid(1),centroid(2),'wS');
end
end
return
From: ImageAnalyst on
Since you didn't post your image online anywhere, I can't run your
code successfully.
(I'm sure it won't do the expected thing with my images.)
If you want us to run your code, then post your image to http://drop.io
From: Jeremy Ho on
hi,
i've dropped the image here. i think the link is as such.

http://drop.io/rysfsct

the admin password is: 4dugjpg6cm

thanks in advanced!

in fact, i've sent you an email this afternoon to 'imageanalyst(a)mailinator.com'
From: ImageAnalyst on
What are the dots? The graphics that look like dice that have been
written into the image (these don't look like they're part of the
scene and are "sticking out" of the spine), or the two-dot things in
the grayscale image that look like they're in the vertebral spaces
(these don't look like they're really "sticking out" either)? And they
have two dots while the graphics beside them have 3 dots.

And can you say whether the dots will be in the same position in every
photo? I would think they should be, if you have good control over
your image acquisition system.
From: Jeremy Ho on
Hi there,
The dots that I've mentioned are the 3 black dots on a piece of white paper that is on the left of the picture. You are right. Those dots are not part of the picture. I put them there as I could not manage to get any real pictures yet. However, in the real scenario, the white piece of paper will be connected to the spine by a means of a wire so it will be barely visible. As for the location of the dots, they will move. What i'm planning to do is compress the spine and after every compression (eg. 50N, 100N, 200N etc), I will take a picture. The program that I need to come up with has to detect the coordinates of these said dots and automatically transfer the data to an excel file. This will be done for Frame 1, 2, 3 and so on and then with the locations of the dots in each frame, I can then calculate the displacement.

Problem is, I have never done MATLAB before and I really need help with the codes. Thanks!!

Jeremy