How can I find the spatial calibration factor?

40 次查看(过去 30 天)
Hi, According to this link http://www.azurs.net/photoblog/resolution-taille-pixels-image.html real heigth of the image (mm)= image heigth of the image (pixel)/image resolution (ppp)
So the spatial calibration factor can be find by this formula??
calibration factor=real heigth of the image (mm)/image heigth (pixel)
thaks in advance
  2 个评论
JAMES RABBA
JAMES RABBA 2020-12-5
Hello everyone. Please how can i convert a measurement from pixel to mm using code. For example 40pixel to mm.
Your responses will be highly appreciated.
Thank you
Image Analyst
Image Analyst 2020-12-5
pixelsPerMm = 40; % Define the spatial calibration factor
lengthInMm = lengthInPixels / pixelsPerMm; % Convert length in pixels to mm.

请先登录,再进行评论。

回答(4 个)

Image Analyst
Image Analyst 2012-12-10
编辑:Image Analyst 2012-12-10
The calibration factor is (the actual "true" height of a known object) / (the height in pixels of that same object in your image).
Then when you measure any other distances, multiply by that factor. See demo code below:
% Code to spatially calibrate and image.
% Code asks user to draw a line and then to specify the length
% of the line in real world units. It then calculates a spatial calibration factor.
% User can then draw lines and have them reported in real world units.
% Take out the next two lines if you're transferring this to your program.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables.
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
format longg;
format compact;
fontSize = 20;
% Check that user has the Image Processing Toolbox installed.
hasIPT = license('test', 'image_toolbox');
if ~hasIPT
% User does not have the toolbox installed.
message = sprintf('Sorry, but you do not seem to have the Image Processing Toolbox.\nDo you want to try to continue anyway?');
reply = questdlg(message, 'Toolbox missing', 'Yes', 'No', 'Yes');
if strcmpi(reply, 'No')
% User said No, so exit.
return;
end
end
% 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);
% Get the dimensions of the image.
% numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
subplot(2, 1, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Initialize
units = 'pixels';
spatialCalibration = 1.0;
button = 1;
while button ~= 3
% Get which action the user wants to do.
button = menu('Choose an action', 'Calibrate', 'Measure', 'Exit');
if button == 3
% Bail out because they clicked Exit.
break;
end
% Make caption the instructions.
subplot(2, 1, 1);
title('Left-click first point. Right click last point.', 'FontSize', fontSize);
% Ask user to plot a line.
[x, y, profile] = improfile();
% Restore caption.
title('Original Grayscale Image', 'FontSize', fontSize);
% Calculate distance
distanceInPixels = sqrt((x(1)-x(end))^2 + (y(1)-y(end))^2);
% Plot it.
subplot(2,1,2);
plot(profile);
grid on;
% Initialize
realWorldNumericalValue = distanceInPixels;
caption = sprintf('Intensity Profile Along Line\nThe distance = %f pixels', ...
distanceInPixels);
title(caption, 'FontSize', fontSize);
ylabel('Gray Level', 'FontSize', fontSize);
xlabel('Pixels Along Line', 'FontSize', fontSize);
if button == 1
% They want to calibrate.
% Ask user for a number.
userPrompts = {'Enter true size:','Enter units:'};
defaultValues = {'180', 'cm'};
titleBar = 'Enter known distance';
caUserInput = inputdlg(userPrompts, titleBar, 2, defaultValues);
if isempty(caUserInput),return,end; % Bail out if they clicked Cancel.
% Initialize.
realWorldNumericalValue = str2double(caUserInput{1});
units = char(caUserInput{2});
% Check for a valid integer.
if isnan(realWorldNumericalValue)
% They didn't enter a number.
% They clicked Cancel, or entered a character, symbols, or something else not allowed.
message = sprintf('I said it had to be an number.\nI will use %d and continue.', distanceInPixels);
uiwait(warndlg(message));
realWorldNumericalValue = distanceInPixels;
units = 'pixels';
spatialCalibration = 1.0;
% continue; % Skip to end of loop.
end
spatialCalibration = realWorldNumericalValue / distanceInPixels;
end
realWorldDistance = distanceInPixels * spatialCalibration;
caption = sprintf('Intensity Profile Along Line\nThe distance = %f pixels = %f %s', ...
distanceInPixels, realWorldDistance, units);
title(caption, 'FontSize', fontSize);
ylabel('Gray Level', 'FontSize', fontSize);
xlabel('Pixels Along Line', 'FontSize', fontSize);
end
  15 个评论
Catherine Perna
Catherine Perna 2014-5-22
Hi there,
I am new to matlab code and I was wondering if it was possible to use this code (or something slightly different) to find the spatial calibration of a video? I have a moving object over a grid and I am trying to determine the speed of that object. I have most of the code worked out but struggling to determine the number of pixels/mm of my video, can anyone help?
Thanks
MOHIT
MOHIT 2016-7-19

Suppose, I have this image and I want to measure the area of the table surrounded by a red line. This table is rectangular but not looking as a rectangle. Here we can't take pixel values uniform how can we measure the area of this table?

请先登录,再进行评论。


Catherine Perna
Catherine Perna 2014-5-22
Hi there,
I am new to matlab code and I was wondering if it was possible to use this code (or something slightly different) to find the spatial calibration of a video? I have a moving object over a grid and I am trying to determine the speed of that object. I have most of the code worked out but struggling to determine the number of pixels/mm of my video, can anyone help?
Thanks
  3 个评论
Hazim Nasir
Hazim Nasir 2016-8-20
Hi All I have this zigzag line and need to measure the total length of it,
the length law L=sqrt((x(1)-x(2))^2+(y(1)-y(2))^2) can not used straight forward because the complicated shape of the line
Image Analyst
Image Analyst 2016-8-20
You should start your own question. But basically since that is a single wide binary image of a line, you can use sum to get the number of pixels in the line.
LineLengthInPixels = sum(binaryImage(:));
If you want Euclidean distance, so a two pixel long line at an angle of 45 degrees has a length of sqrt(2) instead of 2, you can do that with the sqrt() function and knowledge of where the vertices in your line are.

请先登录,再进行评论。


Aiswarya M D
Aiswarya M D 2016-10-7
How to adapt different retinal image resolutions using spatial calibration with a field of view of 45°
  1 个评论
Image Analyst
Image Analyst 2016-10-8
I don't know what that means so all I can suggest is that you use my spatial calibration code to calibrate from known things. Perhaps your ophthalmoscope will tell you what the spatial resolution is.

请先登录,再进行评论。


Amine Alileche
Amine Alileche 2021-4-29
编辑:Amine Alileche 2021-4-29
Hi can I apply that demo code to a jpg file ?
  6 个评论
Image Analyst
Image Analyst 2021-5-4
@Amine Alileche, I answered it there in that question. I'm attaching the results here too.
% Demo by Image Analyst.
clc; % Clear command window.
clear; % Delete all variables.
close all; % Close all figure windows except those created by imtool.
workspace; % Make sure the workspace panel is showing.
fontSize = 18;
markerSize = 20;
% Read in file.
fileName = '125-1.csv';
data = readmatrix(fileName);
[rows, columns] = size(data);
nexttile;
imshow(data, []);
axis('on', 'image');
% Scan rows for max in each column.
minValue = min(data(:));
maxProfile = minValue * ones(rows, 1);
colOfMax = ones(rows, 1);
for row = 1 : rows
[maxProfile(row), colOfMax(row)] = max(data(row, :));
end
% Plot red line over image.
hold on;
plot(colOfMax, 1:rows, 'r-', 'LineWidth', 2);
% Plot intensity along row.
nexttile;
plot(maxProfile, 'b-', 'LineWidth', 2);
grid on;
xlabel('row', 'FontSize', fontSize);
ylabel('Intensity', 'FontSize', fontSize);
% Maximize image.
g = gcf;
g.WindowState = 'maximized'
Note: the graph is the vertical profile along the centerline of the wire (going down row by row).
It is not a cross section of the wire horizontally.
Amine Alileche
Amine Alileche 2021-5-31
Hi I have posted new topic if you can help. Thank you :)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Calibration and Sensor Fusion 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by