灰度直方图的统计
1 概述
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。
灰度直方图主要应用于图像分割、图像增强、及图像灰度变换等处理过程。
从数学的角度来说,灰度图像直方图描述的是图像各个灰度级的统计特征,它是图像灰度值的一个函数来统计一幅图像中各个灰度级出现的频率或次数。通常会将纵坐标归一化到[0,1]区间内,也就是将灰度级出现的频率(像素个数)除以图像中像素的总数。灰度直方图的计算公式如下:
其中,rk是像素的灰度级,nk是具有灰度rk的像素的个数,MN是图像中总的像素个数。
2 matlab实现灰度直方图的统计
Matlab实现直方图统计方法1(未归一化):
close all
clear all
clc
Irgb=imread('1.jpg');
Igray=rgb2gray(Irgb);
row=size(Igray,1);
column=size(Igray,2);%2→dimision
N=zeros(1,256);%zeros(256)生成256x256矩阵
for i=1:row
for j=1:column
k=Igray(i,j);
N(k+1)=N(k+1)+1;%记录每个灰度值的像素数
end
end
figure,
subplot(221),imshow(Irgb);
subplot(222),imshow(Igray);%subplot将窗口分为1x2两个窗口,现在在第一个小窗口绘图
subplot(223),bar(N);%bar函数绘制直方图,为N中每一行的每一个元素绘制一个条
axis tight;%设置坐标轴
图1 matlab直方图统计(未归一化)
Matlab实现直方图统计方法2(归一化):
close all
clear all
clc
Irgb=imread('1.jpg');
Igray=rgb2gray(Irgb);
% get the histogram
[Y,X]=size(Igray); % Y Row , X column
grayvalue=unique(Igray);
imginfo=[];
for i=1:length(grayvalue)
[ANSy,ANSx]=find(Igray==grayvalue(i));
imginfo.gray(i)=grayvalue(i);
imginfo.position{i}=[ANSy,ANSx];
imginfo.count(i)=length(ANSy)/(Y*X);
end
figure,
subplot(2,2,1),imshow(Irgb),title('Original Image');
subplot(2,2,2),imshow(Igray),title('Gray Image');
subplot(2,2,3),stem(imginfo.gray,imginfo.count,'Marker','none');%stem(x, y);绘制以x为横轴、 y为纵轴的脉冲杆图图形
xlabel('Graylevel'),ylabel('Proportion'),axis([0 255 0 max(imginfo.count)]);
title('Histogram of the orginial image')
图2 matlab直方图统计(归一化)
3 FPGA的仿真实现
FPGA的直方图统计电路的设计很简单,以8bit灰度图像为例,总共有0-255种灰度,以输入的灰度作为双端口RAM的地址,然后对图像的每个灰度值与地址比对,相同的在原地址的数值上加一来完成正副图像的统计。
图3实验原图
图4 modelsim仿真结果展示
图5 直方图FPGA仿真统计结果展示