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

2 ビュー (過去 30 日間)
Meshooo
Meshooo 2014 年 7 月 30 日
移動済み: DGM 2023 年 2 月 20 日
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 件のコメント
Meshooo
Meshooo 2014 年 8 月 4 日
移動済み: DGM 2023 年 2 月 20 日
Thank you Image Analyst, Geoff, Anand. Now I could understand the problem.

サインインしてコメントする。

採用された回答

Geoff Hayes
Geoff Hayes 2014 年 7 月 30 日
編集済み: Geoff Hayes 2014 年 7 月 30 日
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!

その他の回答 (2 件)

Image Analyst
Image Analyst 2014 年 7 月 30 日
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 2014 年 7 月 31 日
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 件のコメント
Image Analyst
Image Analyst 2014 年 7 月 31 日
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

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeImage Processing Toolbox についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by