图像的直方图算法验证
1赞
发表于 10/19/2017 11:10:53 PM
阅读(1064)
对于一些对比度较低的图像,使用直方图算法处理该类图像,可以提高图像的对比度。
主要的操作步骤:
计算每个灰度的个数 nk
计算每个灰度出现的概率,并绘制直方图 P(K) = nk/(h*w)
计算每个灰度的累计概率 : P(K)的和S(K)
直方图的均衡化 S1(K) = S(K) * 255
MATLAB代码如下:
[filename,pathname]=uigetfile('*.*','select an image'); input_I=imread([pathname filename]);%读入图像 figure(1); imshow(input_I); title('原始图像');%显示原始图像 I_gray = rgb2gray(input_I); figure(2); subplot(251);imshow(I_gray); title('灰度图像'); subplot(252);imhist(I_gray); title('灰度图像的直方图');%显示灰度图像及直方图 [height,width]=size(I_gray); %---------------------------------------------------------------------------------- Num = zeros(1,256); for i = 1 : height for j = 1 : width Num(I_gray(i,j)+1) = Num(I_gray(i,j)+1) + 1; end end subplot(253);stem(Num); xlim([0 280]);%把横坐标的范围限定在0--280之间 title('计算所得灰度图像的直方图'); %------------------------------------------------------------------------------------ %计算每个灰阶出现的概率,并绘制直方图(归一化后) P = zeros(1,256); for i = 1:256 P(i) = Num(i)/(height*width); end subplot(254); bar(0:255,P,'b'); %绘制直方图 xlim([0 255]); %将横坐标限定在0~255 title('归一化直方图'); xlabel('灰阶'); ylabel('概率 '); %--------------------------------------------------------------------------------------- %在P后计算累计的归一化直方图 S = zeros(1,256); for i = 1 : 256 for j = 1 : i S(i) = S(i) + P(j); end end subplot(255); bar(0:255,S,'k'); %绘制直方图 xlim([0 255]); title('累计后的归一化直方图 '); xlabel('灰阶'); ylabel('概率 '); %直方图均衡化 IMG = zeros(height,width); for i = 1 : height for j = 1 : width IMG(i,j) = floor(S(I_gray(i,j)+1)*255); end end subplot(256); imshow(uint8(IMG)); %显示最终的图像 title('均衡后图像 '); subplot(257);imhist(IMG); title('均衡后的图像直方图');%显示灰度图像及直方图 %-------------------------------------------------------------------------------------------------------- M = zeros(1,256); for i = 1 : height for j = 1 : width M(IMG(i , j ) + 1 ) = M(IMG(i , j ) + 1 ) + 1; end end subplot(258); bar(0:255,M,'k'); %绘制直方图 xlim([0 255]); title('均衡后的每个灰阶的个数 '); Q = zeros(1,256) ; for i = 1:256 Q(i) = M(i) / (height * width); end subplot(259); bar(0:255,P,'b'); %绘制直方图 xlim([0 255]); %将横坐标限定在0~255 title('均衡后的归一化直方图'); xlabel('灰阶'); ylabel('概率 '); QP = zeros(1,256); for i = 1 : 256 for j = 1 : i QP(i) = QP(i) + Q(j); end end subplot(2,5,10); bar(0:255,QP,'k'); %绘制直方图 xlim([0 255]); title('累计后的归一化直方图 '); xlabel('灰阶'); ylabel('概率 ');
效果图因为网速不好,发不出来!