How can I find the spatial calibration factor?
13 次查看(过去 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
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
2020-12-5
pixelsPerMm = 40; % Define the spatial calibration factor
lengthInMm = lengthInPixels / pixelsPerMm; % Convert length in pixels to mm.
回答(4 个)
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
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
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
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
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
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
2016-10-7
How to adapt different retinal image resolutions using spatial calibration with a field of view of 45°
1 个评论
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
2021-4-29
编辑:Amine Alileche
2021-4-29
Hi can I apply that demo code to a jpg file ?
6 个评论
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Image Processing and Computer Vision 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!