centroid of image and value of pixel

9 views (last 30 days)
sadhna
sadhna on 11 Feb 2013
hi i want to measure the speed of vehicle..using motion segmentation i detect the vehicle using Gaussian mixture model but now i want to measure the speed...so i need to calculate the centroid of boundary box and need the pixel value of box centroide(pixel value of centroid) can any one help....
  2 Comments
Algorithms Analyst
Algorithms Analyst on 12 Feb 2013
can i read your Gaussain Mixture Model code...for further contributions?
Algorithms Analyst
Algorithms Analyst on 12 Feb 2013
I have sent an email in this address (<mailto:pooja.adlakha@gmail.com pooja.adlakha@gmail.com>).I have done this type of project before.So you can do correspondence with me.

Sign in to comment.

Answers (3)

ChristianW
ChristianW on 11 Feb 2013
Do you have Image Processing Toolbox? If yes, here you go:
BW = imread('text.png');
s = regionprops(BW, 'centroid');
centroids = cat(1, s.Centroid);
imshow(BW)
hold on
plot(centroids(:,1), centroids(:,2), 'b*')
hold off
  2 Comments
Image Analyst
Image Analyst on 11 Feb 2013
How can you say "i know that" but then not know that centroids has the x,y locations of the blob centroids? It sounds like you don't know that even though you said you did.
Walter Roberson
Walter Roberson on 11 Feb 2013
centroid1 = s(1).Centroid;
centroid_pixel = BW( round(centroid1(1)), round(centroid1(2)), :);

Sign in to comment.


Image Analyst
Image Analyst on 11 Feb 2013
sadhna: See my BlobsDemo Image Segmentation Tutorial: http://www.mathworks.com/matlabcentral/fileexchange/?term=authorid%3A31862 It will show you how to calculate centroid. I have another demo that uses imfreehand to let you hand draw some irregularly-shaped area:
% Demo to have the user freehand draw an irregular shape over
% a gray scale image, have it extract only that part to a new image,
% and to calculate the mean intensity value of the image within that shape.
% Also calculates the perimeter, centroid, and center of mass (weighted centroid).
% Change the current folder to the folder of this m-file.
if(~isdeployed)
cd(fileparts(which(mfilename)));
end
clc; % Clear command window.
clear; % Delete all variables.
close all; % Close all figure windows except those created by imtool.
imtool close all; % Close all figure windows created by imtool.
workspace; % Make sure the workspace panel is showing.
fontSize = 16;
% Read in a standard MATLAB gray scale demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'cameraman.tif';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% File doesn't exist -- didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
imshow(grayImage, []);
axis on;
title('Original Grayscale Image', 'FontSize', fontSize);
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
message = sprintf('Left click and hold to begin drawing.\nSimply lift the mouse button to finish');
uiwait(msgbox(message));
hFH = imfreehand();
% Create a binary image ("mask") from the ROI object.
binaryImage = hFH.createMask();
xy = hFH.getPosition;
% Now make it smaller so we can show more images.
subplot(2, 3, 1);
imshow(grayImage, []);
axis on;
drawnow;
title('Original Grayscale Image', 'FontSize', fontSize);
% Display the freehand mask.
subplot(2, 3, 2);
imshow(binaryImage);
axis on;
title('Binary mask of the region', 'FontSize', fontSize);
% Label the binary image and computer the centroid and center of mass.
labeledImage = bwlabel(binaryImage);
measurements = regionprops(binaryImage, grayImage, ...
'area', 'Centroid', 'WeightedCentroid', 'Perimeter');
area = measurements.Area
centroid = measurements.Centroid
centerOfMass = measurements.WeightedCentroid
perimeter = measurements.Perimeter
% Calculate the area, in pixels, that they drew.
numberOfPixels1 = sum(binaryImage(:))
% Another way to calculate it that takes fractional pixels into account.
numberOfPixels2 = bwarea(binaryImage)
% Get coordinates of the boundary of the freehand drawn region.
structBoundaries = bwboundaries(binaryImage);
xy=structBoundaries{1}; % Get n by 2 array of x,y coordinates.
x = xy(:, 2); % Columns.
y = xy(:, 1); % Rows.
subplot(2, 3, 1); % Plot over original image.
hold on; % Don't blow away the image.
plot(x, y, 'LineWidth', 2);
drawnow; % Force it to draw immediately.
% Burn line into image by setting it to 255 wherever the mask is true.
burnedImage = grayImage;
burnedImage(binaryImage) = 255;
% Display the image with the mask "burned in."
subplot(2, 3, 3);
imshow(burnedImage);
axis on;
caption = sprintf('New image with\nmask burned into image');
title(caption, 'FontSize', fontSize);
% Mask the image and display it.
% Will keep only the part of the image that's inside the mask, zero outside mask.
blackMaskedImage = grayImage;
blackMaskedImage(~binaryImage) = 0;
subplot(2, 3, 4);
imshow(blackMaskedImage);
axis on;
title('Masked Outside Region', 'FontSize', fontSize);
% Calculate the mean
meanGL = mean(blackMaskedImage(binaryImage));
% Put up crosses at the centriod and center of mass
hold on;
plot(centroid(1), centroid(2), 'r+', 'MarkerSize', 30, 'LineWidth', 2);
plot(centerOfMass(1), centerOfMass(2), 'g+', 'MarkerSize', 20, 'LineWidth', 2);
% Now do the same but blacken inside the region.
insideMasked = grayImage;
insideMasked(binaryImage) = 0;
subplot(2, 3, 5);
imshow(insideMasked);
axis on;
title('Masked Inside Region', 'FontSize', fontSize);
% Now crop the image.
leftColumn = min(x);
rightColumn = max(x);
topLine = min(y);
bottomLine = max(y);
width = rightColumn - leftColumn + 1;
height = bottomLine - topLine + 1;
croppedImage = imcrop(blackMaskedImage, [leftColumn, topLine, width, height]);
% Display cropped image.
subplot(2, 3, 6);
imshow(croppedImage);
axis on;
title('Cropped Image', 'FontSize', fontSize);
% Put up crosses at the centriod and center of mass
hold on;
plot(centroid(1)-leftColumn, centroid(2)-topLine, 'r+', 'MarkerSize', 30, 'LineWidth', 2);
plot(centerOfMass(1)-leftColumn, centerOfMass(2)-topLine, 'g+', 'MarkerSize', 20, 'LineWidth', 2);
% Report results.
message = sprintf('Mean value within drawn area = %.3f\nNumber of pixels = %d\nArea in pixels = %.2f\nperimeter = %.2f\nCentroid at (x,y) = (%.1f, %.1f)\nCenter of Mass at (x,y) = (%.1f, %.1f)\nRed crosshairs at centroid.\nGreen crosshairs at center of mass.', ...
meanGL, numberOfPixels1, numberOfPixels2, perimeter, ...
centroid(1), centroid(2), centerOfMass(1), centerOfMass(2));
msgbox(message);
  4 Comments
Walter Roberson
Walter Roberson on 11 Feb 2013
Edited: Image Analyst on 11 Feb 2013
And round or floor if you want integer coordinates.
sadhna
sadhna on 12 Feb 2013
i need boundary box cantroid value for measure the speed...i have sent u the paper where i read to calculate the speed _*Vehicle speed detection in video image sequences using CVS method_* International Journal of the Physical Sciences Vol. 5(17), pp. 2555-2563, 18 December, 2010 Available online at http://www.academicjournals.org/IJPS ISSN 1992 - 1950 ©2010 Academic Journals
SPEED DETECTION The speed of the vehicle in each frame is calculated using the position of the vehicle in each frame, so the next step is to find out the blobs bounding box, and the centroid. The blob centroid is important to understand the distance of the vehicle moving in consecutive frames and therefore as the frame rate of captured moves is known, the calculation of the speed become possible. This information must be recorded consecutively into an array cell in the same size as the captured camera image because the distance moved by the centroid is needed which is a pixel with a specific coordinate in the image to find out the vehicle speed. To find out the distance moved by the pixel, suppose the pixel has the coordinate like: i = (a,b) i -1= (e, f ), where the centroids location is showed in frame i and i-1 for one vehicles, with (a, b) coordinate and (e, f) coordinate. The distance difference for the vehicle is equal to: 2 2 1 d = (a - e) + (b - f ) . (11) and if the image sequence is 25 frames per second, the time between two consecutive frames is equal to 0.04 s and finally the speed can be determined from the equation: t x V K D = D . (12) Where K is the calibration coefficient

Sign in to comment.


sadhna
sadhna on 12 Feb 2013
there is in built command in matlab to find the motion between consecutive frame.can any one tell m can i used this to find the speed..
ReferenceFrameDelay
i used this but finding the error obj=mmreader('movie.avi'); %input video
nframes = get(obj, 'NumberOfFrames'); I = read(obj, 99); %seprate 99 frame d=figure,imshow(I)
j = read(obj, 102);%seprate 99 frame l=figure,imshow(j) V = step(I) C = step(I) Y = step(I,j)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!