histogram by not using the default imhist

조회 수: 5 (최근 30일)
Vaswati Biswas
Vaswati Biswas 2021년 3월 13일
편집: Vaswati Biswas 2021년 3월 15일
I1 = imread('RDL.jpg');
raw = im2double(I1(:,:,1));
m=max(max(raw));
m1=min(min(raw));
binsize=(m-m1)/10;
for i=1:1:size(raw,1)
for j=1:1:size(raw,2)
value=raw(i,j); %read input image level
if value >= min(min(raw)) && value <= max(max(raw))
for i=1:1:10
if value <= i*binsize+min(min(raw))+ value > (i-1)*binsize+min(min(raw))
% original histogram in pixels
imhist(i)=imhist(i)+1;
% normalized histogram pdf
%InputIm_normalized_histogram(i)=InputIm_histogram(i)/resolution;
end
end
end
end
end
imhist(i)
I have used the code to plot a histogram from the image below. I want the graph similar to the attached image. But I am not able to get it. Kindly let me know where have I made the mistake.
  댓글 수: 3
Vaswati Biswas
Vaswati Biswas 2021년 3월 13일
Yeah I forgot to mention. Sorry for that. I was not getting any output graph from that. But no error is also shown
Jan
Jan 2021년 3월 13일
imhist(i) is a scalar, because you have defined it as a vector. Your code does not contain a command to dispaly a graph.

댓글을 달려면 로그인하십시오.

채택된 답변

Jan
Jan 2021년 3월 13일
편집: Jan 2021년 3월 13일
Initially imhist is a command. Calling it as imhist(i) + 1 should cause an error. Do you get a corresponding message?
Use a different name and initialize your counter:
history = zeros(1, 10);
This line is meaningless:
if value >= min(min(raw)) && value <= max(max(raw))
because all values are >= the minimum and <= the maximum.
if value <= i*binsize+min(min(raw))+ value > (i-1)*binsize+min(min(raw))
% ^
Here you do not want a +, but an & to get a logical AND. You have evaluated min(min(raw)) already, so it is more efficient and easier to read, if you use m1 here.
A hint: "m" as maximum and "m1" as minimum are not easy to remember. maxV and minV might be better.
A leaner version of your code:
Img = imread('RDL.jpg');
R = im2double(Img(:,:,1)); % The red channel
maxR = max(max(R));
minR = min(min(R));
nBin = 10;
BinEdge = linspace(minR, maxR, nBin + 1);
BinEdge(end) = Inf; % any value > maxR to include it in last bin
hist = zeros(1, nBin);
for iBin = 1:nBin
hist(iBin) = sum(BinEdge(iBin) <= R(:) & R(:) < BinEdge(iBin + 1));
end
Instead of loops over the pixels, sum() is used to count the values of R matching into each bin.
  댓글 수: 6
Vaswati Biswas
Vaswati Biswas 2021년 3월 14일
@Image Analyst Thanks for clearing my doubt. Yeah I was making a mistake.
Vaswati Biswas
Vaswati Biswas 2021년 3월 14일
@Jan Thanks for your help it gives me the correct result now

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Image Analyst
Image Analyst 2021년 3월 14일
Then why not simply use histogram() or histcounts()? Why do you want to write (buggy) code yourself?
  댓글 수: 3
Image Analyst
Image Analyst 2021년 3월 14일
That doesn't explain why you don't use the built-in histogram functions.
Vaswati Biswas
Vaswati Biswas 2021년 3월 15일
편집: Vaswati Biswas 2021년 3월 15일
I didn't try built-in histogram function earlier. But later I checked that too it works fine. Thanks for your suggestion.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Descriptive Statistics에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by