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

10 Ansichten (letzte 30 Tage)
Meshooo
Meshooo am 30 Jul. 2014
Verschoben: DGM am 20 Feb. 2023
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 Kommentar
Meshooo
Meshooo am 4 Aug. 2014
Verschoben: DGM am 20 Feb. 2023
Thank you Image Analyst, Geoff, Anand. Now I could understand the problem.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Geoff Hayes
Geoff Hayes am 30 Jul. 2014
Bearbeitet: Geoff Hayes am 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!

Weitere Antworten (2)

Image Analyst
Image Analyst am 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 am 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 Kommentar
Image Analyst
Image Analyst am 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

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by