How to know pixel size ?
    5 views (last 30 days)
  
       Show older comments
    
Hello,
I have two types of files "csv" and "jpg". I want to extract temperature along the wire shown in the picture ( I took maximum value of each line of the csv file ) . So I need to detect boundaries of the wire at  and plot temperature along the real length of the wire knowing that I know one dimension in the picture.
0 Comments
Answers (2)
  Walter Roberson
      
      
 on 4 May 2021
        data = readmatrix('https://www.mathworks.com/matlabcentral/answers/uploaded_files/607160/125-1.csv');
imagesc(data)
th = data > 25;
h_th = any(th,1);
h_lb = find(h_th,1);
h_ub = find(h_th,1,'last');
hold on
xline(h_lb, 'r')
xline(h_ub, 'r');
hold off
However, in order to know the pixel size, you need a fixed distance. In your .jpg you manually drew on a distance, but it is not clear where you got that distance from? If you know the physical distance that the full number of columns corresponds to, then
width_of_full_image = 11.3;   %change as appropriate!
units_per_pixel = width_of_full_image / size(data,2);
width_of_selected_area = (h_ub - h_lb + 1) * units_per_pixel
4 Comments
  Walter Roberson
      
      
 on 5 May 2021
				You drew a box around the wire. How did you decide where the boundaries of that box should be?
  Image Analyst
      
      
 on 4 May 2021
        After you get your data, use max():
% 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.
3 Comments
  Image Analyst
      
      
 on 5 May 2021
				If you want to find the starting and ending row of the largest stretch above a threshold, you can use find() and bwareafilt()
[rows, columns] = size(data);
startingColumns = zeros(rows, 1);
endingColumns = zeros(rows, 1);
threshold = 26; % Whatever.
for row = 1 : rows
    thisRow = data(row, :) > threshold; % Binary "image"
    % Extract the longest run, in case there are more than one due to noise
    thisRow = bwareafilt(thisRow, 1);
    col = find(thisRow, 1, 'first');
    if ~isempty(col)
        startingColumns(row) = col; % Store starting column.
        endingColumns(row) = find(thisRow, 1, 'last'); % Store ending column.
    end
end
See Also
Categories
				Find more on Convert Image Type in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


