# How to calculate the dynamic range of an RGB image

11 views (last 30 days)
Avi Patani on 5 Mar 2020
Edited: DGM on 28 Nov 2022
This is the code I am using to cal. the DR of an RGB image, I divide the n*m*3 image into R,G,B components and go from there. I understand that the min value could be zero and I can set it take all the values >=2 (or 2 in case of a lower value).
But the code is doing something unexpected and I am not sure where I am going wrong.
Thank you
Avi
% Cal. the luminance value of the frame
I4 = 0.2126*R(:,:)+ 0.7152*G(:,:)+ 0.0722*B(:,:);
% Find the max and min value
Max = max(I4,[],'all');
Min = min(I4,[],'all');
% Cal the log2() values
LogMax = log2(Max);
LogMin = log2(Min);
DR = LogMax - LogMin;

DGM on 27 Nov 2022
The error occurs because you're trying to do everything with integer data.
inpict = im2double(inpict); % cast to a non-integer class
% split channels
[R G B] = imsplit(inpict);
% Cal. the BT709 luma value of the frame
Y = 0.2126*R + 0.7152*G + 0.0722*B;
% Find the max and min value
ymax = max(Y,[],'all');
ymin = min(Y,[],'all');
% Cal the log2() values
LogMax = log2(ymax);
LogMin = log2(ymin);
% dynamic range of luma
DRy = LogMax - LogMin
DRy = 5.1004
DGM on 28 Nov 2022
Edited: DGM on 28 Nov 2022
I should mention that I have no idea if the actual DR calculations are correct. I doubt it. I don't know why you'd calculate from luma. I just jumped at the obvious error.
EDIT: eh.

### Categories

Find more on Contrast Adjustment in Help Center and File Exchange

R2019b

### Community Treasure Hunt

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

Start Hunting!

Translated by