How to find the intensity percentage in a gray scale image?

4 views (last 30 days)
Dear all,
I have 8bit gray scale image "I". I want to find "X" which is the 99.5% of the maximum intensity value. So if the image has at least one white pixel (255), then "X" should be 253.725.
I tried the following code but I'm getting different answer:
I = getimage;
X = (max(I(:))/100) *99.5;
Why the value for "X" is 255 not 253.725?
Any help will be appreciated.
Meshoo
  1 Comment
Meshooo
Meshooo on 4 Aug 2014
Moved: DGM on 20 Feb 2023
Thank you Image Analyst, Geoff, Anand. Now I could understand the problem.

Sign in to comment.

Accepted Answer

Geoff Hayes
Geoff Hayes on 30 Jul 2014
Edited: Geoff Hayes on 30 Jul 2014
Meshoo - what is the answer that you are getting? 255? From your question, I think it is safe to assume that the data type for your image is an 8-bit unsigned integer. So if your maximum value is 255 then
maxVal = uint8(255);
maxValBy100 = maxVal/100; % this is now 3 because the data type is uint8
maxValBy100*99.5 % this is now 255 since 3*99.5 is greater than the max
% allowed 8-bit unsigned int (255) so is capped at that
% maximum
Since you are mixing doubles with 8-bit unsigned ints, then just cast the maximum value of I to a double before dividing by 100
X = (double(max(I(:)))/100) *99.5;
and the above will return the desired 253.725. Try this and see what happens!

More Answers (2)

Image Analyst
Image Analyst on 30 Jul 2014
Your code should be okay. Though it would be better to just use the original image if you have it rather than use getimage();
clc;
workspace;
% Read in sample image and divide by 2.
grayImage = imread('pout.tif') / 2;
subplot(1, 2, 1);
% Display at full range 0-255.
imshow(grayImage, [])
title('Original image, scaled to 0-255 for display', 'FontSize', 22);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
% Get max of original image and what is returned from getimage
maxGL = max(grayImage(:))
I = getimage(gca);
maxGL2 = max(I(:))
% They should be the same. maxGL2 won't be 255 even though displayed image is 255.
X = (max(I(:))/100) *99.5
% Let's compute and display the histogram.
[pixelCount, grayLevels] = imhist(grayImage);
subplot(1, 2, 2);
bar(grayLevels, pixelCount);
grid on;
title('Histogram of original image', 'FontSize', 22);
xlim([0 grayLevels(end)]); % Scale x axis manually.

Anand
Anand on 31 Jul 2014
If I is a uint8 image, then max(I(:)) will be a uint8 value and multiplying that by .995 will mean its still 255. You can see this as follows:
>> uint8(255)*99.5
ans =
255
To fix this, cast the maximum to a double, something like this:
X = double(max(I(:))/100) *99.5;
  1 Comment
Image Analyst
Image Analyst on 31 Jul 2014
Yes, if it goes more than 255 (like if you multiply by 99.5 instead of .995), it clips. If it's less than 255, it rounds to nearest integer. Compare this:
uint8(255)*.995
ans = 254

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!