tutu_1583

图像的直方图算法验证

1
阅读(1064)

对于一些对比度较低的图像,使用直方图算法处理该类图像,可以提高图像的对比度。

主要的操作步骤:

计算每个灰度的个数 nk

计算每个灰度出现的概率,并绘制直方图 P(K) = nk/(h*w)

计算每个灰度的累计概率 : P(K)的和S(K)

直方图的均衡化 S1(K) = S(K) * 255


MATLAB代码如下:

  1. [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('概率 ');

    效果图因为网速不好,发不出来!