![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/659090/image.png)
does the grayscale image always give the temperature value corresponding to thermal image?
14 views (last 30 days)
Show older comments
RICHA SINGH
on 16 Jun 2021
Commented: Walter Roberson
on 22 Jun 2021
does the grayscale image always give the temperature value corresponding to thermal image?
0 Comments
Accepted Answer
Image Analyst
on 20 Jun 2021
All you had to do was to take my demo and give the right coordinates for your image and your colorbar, and assign the colorbar limits - easy. Try this:
% Take a thermal RGB image from the FLIR One camera and uses the embedded color bar to determine temperatures from the colors and make a temperature image.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 15;
%===============================================================================
% Get the name of the image the user wants to use.
baseFileName = 'ir_girl.png'; % Base file name with no folder prepended (yet).
% Get the full filename, with path prepended.
folder = pwd; % Change to whatever folder the image lives in.
fullFileName = fullfile(folder, baseFileName); % Append base filename to folder to get the full file name.
if ~isfile(fullFileName)
errorMessage = sprintf('Error: file not found:\n%s', fullFileName)
uiwait(errordlg(errorMessage));
return;
end
fprintf('Transforming image "%s" to a thermal image.\n', fullFileName);
%===============================================================================
% Read in a demo image.
originalRGBImage = imread(fullFileName);
% Display the image.
subplot(2, 3, 1);
imshow(originalRGBImage, []);
axis on;
caption = sprintf('Original Pseudocolor Image, %s', baseFileName);
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Column', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Row', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
grayImage = min(originalRGBImage, [], 3); % Useful for finding image and color map regions of image.
%=========================================================================================================
% Need to crop out the image and the color bar separately.
% First crop out the image.
imageRow1 = 1;
imageRow2 = size(originalRGBImage, 1);
imageCol1 = 1;
imageCol2 = 969;
% Crop off the surrounding clutter to get the RGB image.
rgbImage = originalRGBImage(imageRow1 : imageRow2, imageCol1 : imageCol2, :);
% imcrop(originalRGBImage, [20, 40, 441, 259]);
% Next, crop out the colorbar.
colorBarRow1 = 64;
colorBarRow2 = 757;
colorBarCol1 = 986;
colorBarCol2 = 1075;
hold on;
rectangle('Position', [colorBarCol1, colorBarRow1, colorBarCol2-colorBarCol1, colorBarRow2-colorBarRow1], 'EdgeColor', 'b');
hold off;
% Crop off the surrounding clutter to get the colorbar.
colorBarImage = originalRGBImage(colorBarRow1 : colorBarRow2, colorBarCol1 : colorBarCol2, :);
b = colorBarImage(:,:,3);
%=========================================================================================================
% Display the pseudocolored RGB image.
subplot(2, 3, 2);
imshow(rgbImage, []);
axis on;
caption = sprintf('Cropped Pseudocolor Image');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Column', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Row', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
hp = impixelinfo();
% Display the colorbar image.
subplot(2, 3, 3);
imshow(colorBarImage, []);
axis on;
caption = sprintf('Cropped Colorbar Image');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Column', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Row', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
% Set up figure properties:
% Enlarge figure to full screen.
g = gcf;
g.WindowState = 'maximized';
% Get rid of tool bar and pulldown menus that are along top of figure.
% set(gcf, 'Toolbar', 'none', 'Menu', 'none');
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
%=========================================================================================================
% Get the color map from the color bar image.
storedColorMap = colorBarImage(:,1,:);
% Need to call squeeze to get it from a 3D matrix to a 2-D matrix.
% Also need to divide by 255 since colormap values must be between 0 and 1.
storedColorMap = double(squeeze(storedColorMap)) / 255;
% Need to flip up/down because the low rows are the high temperatures, not the low temperatures.
storedColorMap = flipud(storedColorMap);
% Convert the subject/sample from a pseudocolored RGB image to a grayscale, indexed image.
indexedImage = rgb2ind(rgbImage, storedColorMap);
% Display the indexed image.
subplot(2, 3, 4);
imshow(indexedImage, []);
axis on;
caption = sprintf('Indexed Image (Gray Scale Thermal Image)');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Column', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Row', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
%=========================================================================================================
% Now we need to define the temperatures at the end of the colored temperature scale.
% You can read these off of the image, since we can't figure them out without doing OCR on the image.
% Define the temperature at the top end of the scale.
% This will probably be the high temperature.
highTemp = 42;
% Define the temperature at the dark end of the scale
% This will probably be the low temperature.
lowTemp = 22;
% Scale the indexed gray scale image so that it's actual temperatures in degrees C instead of in gray scale indexes.
thermalImage = lowTemp + (highTemp - lowTemp) * mat2gray(indexedImage);
% Display the thermal image.
subplot(2, 3, 5);
imshow(thermalImage, []);
axis on;
colorbar;
title('Floating Point Thermal (Temperature) Image', 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Column', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Row', 'FontSize', fontSize, 'Interpreter', 'None');
% Let user mouse around and see temperatures on the GUI under the temperature image.
hp = impixelinfo();
hp.Units = 'normalized';
hp.Position = [0.45, 0.03, 0.25, 0.05];
%=========================================================================================================
% Get and display the histogram of the thermal image.
subplot(2, 3, 6);
histogram(thermalImage, 'Normalization', 'probability');
axis on;
grid on;
caption = sprintf('Histogram of Thermal Image');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
xlabel('Temperature [Degrees]', 'FontSize', fontSize, 'Interpreter', 'None');
ylabel('Frequency [Pixel Count]', 'FontSize', fontSize, 'Interpreter', 'None');
% Get the maximum temperature.
maxTemperature = max(thermalImage(:));
fprintf('The maximum temperature in the image is %.2f\n', maxTemperature);
fprintf('Done! Thanks Image Analyst!\n');
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/659090/image.png)
6 Comments
Walter Roberson
on 22 Jun 2021
I = randi([0 255], 32, 32, 'uint8');
directions = {'ascend', 'descend'};
cmaps = {@jet, @parula};
for K = 1 : 2
d = directions{randi(2)};
m = randperm(2);
II = I;
for n = m
II = sort(II, n, d);
end
cmap = cmaps{randi(2)}();
cmap = cmap(randperm(size(cmap,1)),:);
figure
image(II); colormap(cmap);
end
So... what are the temperatures on these two images?
I constructed these images in such a way that one of the corners is the hotest part of the image. But which corner? Can you tell from the color? Can you tell me how hot it is?
OKay, try this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/660795/image.jpeg)
This is a thermal image. What is the temperature range shown here?
More Answers (2)
Walter Roberson
on 16 Jun 2021
Edited: Walter Roberson
on 16 Jun 2021
No, not at all.
Consumer thermal cameras often use a color map in which increased temperature is not mapped to increase brightness.
For example, it is common for high temperature to be represented as bright red, and for blue to be comparatively cool, but the reality in temperature is that red is on the cooler side and that blue is on the hotter side. Infrared (red side) has less energy than ultra-violet (blue side), but humans do not see ultraviolet well. Humans are most receptive to Green, but you never see consumer cameras represent heat as bright green!
It is possible to create a color scale in which brightness increases across the scale. The parula color scale attempts to do that. But it is not what consumer cameras usually use.
Because of this, if you convert consumer thermal camera color images to grayscale, it is common not to be able to just take the luminance as being proportional to temperature; you usually have to use a non-linear mapping.
This is a topic I discussed in https://www.mathworks.com/matlabcentral/answers/848290-i-need-to-detect-temperature-from-thermal-image-without-converting-it-into-gray-scale#answer_717130 which you had replied to before, so I know you read it.
6 Comments
Walter Roberson
on 19 Jun 2021
The code you are using expects the colorbar to be over to the left, but the image you are using has the colorbar to the right, over near column 1000.
Image Analyst
on 19 Jun 2021
The image you attached is not a valid PNG image, or at least MATLAB can't read it:
Error using imread>get_format_info (line 545)
Unable to determine the file format.
Error in imread/call_format_specific_reader (line 466)
fmt_s = get_format_info(fullname);
Error in imread (line 440)
[X, map] = call_format_specific_reader();
Error in test3 (line 25)
originalRGBImage = imread(fullFileName);
Please attach an image that MATLAB can read in.
See Also
Categories
Find more on 3-D Volumetric Image Processing 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!