From: Jeremy Ho on 5 May 2010 14:31 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 5 May 2010 16:41 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 5 May 2010 16:52 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 5 May 2010 17:04 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 5 May 2010 17:43
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 |