zoukankan      html  css  js  c++  java
  • 3.3 直方图处理与函数绘图

    3.3.1 生成并绘制图像的直方图

    h = imhist(f,b)

    f 是输入图像,h是直方图h(rk)即灰度为r的第k级图像的像素个数,b为收集箱。

    eg. 一个收集箱仅仅是亮度标度范围的一小部分,处理Uint8的图像并令b=2,则亮度标度范围为0-127和128-255。

     

    p = imhist(f,b)/numel(f)

    归一化直方图,numel(f)给出数组f中的元素个数(总像素数)

    直方图也常常利用条形图来绘制

    bar(horz,v,width)
    v为图像的的行向量
    horz与v有着相同的维数的向量,省略则为0到length(v)
    width设置条形宽度,默认为0.8
    >> h1 = h(1:10:256);   %h为输入的图像f的直方图
    >> horz = 1:10:256;
    >> bar(horz,h1)            %默认width为0.8
    >> bar(horz,h1,0)
    >> bar(horz,h1,1)     

     

    对比图5和图2,图2中高端的峰值在图5消失了,因为绘制图5时使用了较大的水平增量值

    利用其它函数绘制一张完整的条形图

    h = imhist(f);  
    h1=h(1:10:256);
    horz=1:10:256;
    bar(horz,h1);
    axis([0 255 0 15000]);      %设置水平轴和垂直轴的最大和最小值
    set(gca, 'xtick',0:50:255);   %获取当前轴
    set(gca, 'ytick',0:2000:15000);
    title('灰度条形图');        %设置图像标题
    xlabel('x轴','fontsize',15);   %x轴注释
    ylabel('y轴','fontsize',15);
    text(150,6000,'我是图中的注释','fontsize',10); %表格注释

     绘制杆状图:

    stem(horz, v, 'color_linestyle_marker', 'fill')
    
    color_linestyle_marker是组合输入,如:'r--s'表示红线,虚线,方形

     绘图实例:

    h = imhist(f);
    h1 = h(1:10:256);
    horz = 1:10:256;
    stem(horz, h1, 'fill');
    axis([0 255 0 15000]);
    set(gca ,'xtick', [0:50:255]);
    set(gca , 'ytick',[:2000:15000]);

    利用plot函数绘制直线连接图:

    plot(horz, v, 'color_linestyle_marker');
    当不想连线时,即linestyle为none,则函数使用如下
    plot(horz, v, 'color', 'g', 'linestyle', 'none', 'marker', 's');

    例子:

    h = imhist(f);
    plot(h);
    ylim('auto');
    xlim('auto');
    set(gca,'xtick',[0:50:255]);
    set(gca,'ytick',[0:2000:15000]);

    3.3.2  直方图均衡化

    对于连续量而言,均衡后的图像的概率密度是满足均衡分布的概率密度函数,

    但是,对于离散的灰度级图像,均衡化变换为(分布函数):

                               

    直方图灰度均衡化函数:

    g = histeq(f, nlev)

    f : 输入图像  nlev:输出图像指定的灰度级数,默认值为64

    若nlev = L,则histeq执行T(rk)变换;若nlev < L,则histeq试图划分灰度级,以便于能得到较为平坦的直方图。

    例子:

    imshow(f);     %显示原图
    figure,imhist(f); %直方图
    ylim('auto');
    g = histeq(f,256);%灰度均衡
    figure,imshow(g); %均衡后图像
    figure,imhist(g); %均衡后直方图
    ylim('auto');

    histeq变换仅仅是归一化直方图取值的累加,我们可以使用函数cumsum来实现变换功能,

    hnorm = imhist(f)./numel(f);
    cdf = cumsum(hnorm);
    x = linspace(0,1,256);
    plot(x, cdf);
    axis([0 1 0 1]);
    set(gca, 'xtick', 0:0.2:1);
    set(gca, 'ytick', 0:0.2:1);
    xlabel('Input intensity values', 'fontsize', 9);
    ylabel('Output intensity values', 'fontsize', 9);
    text(0.18, 0.5, 'transformation function', 'fontsize', 9);

    3.3.3 直方图匹配(规定化)

    生成具有指定直方图的图像的方法

    g = histeq(f, hspec);

    hspec:指定的直方图(一个由指定值构成的行向量)

     histeq的一个特性是在length(hspec)远小于图像f中的灰度级时,图像g的直方图通常会较好地匹配hspec。

    先用生成指定的行向量,可以使用,进行多次尝试,找到最合适的双峰值,然后利用 g = histeq(f, hspec) 即可得到直方图匹配值

    function p = manulhist
    % MANULHIST函数交互地生成一个双峰直方图
    % P = MANULHIST使用程序TWOMODEGAUSS(m1,sig1,m2,sig2,A1,A2,k)生成一个双峰直方图
    % m1,m2是双峰的均值,他们的取值范围必须在[0,1]
    % sig1,sig2是双峰的标准差
    % A1,A2是振幅值,k是增加直方图下限的偏移量
    % 直方图向量P具有的元素数量是256,sum(P)标准化为1
    % MANULHIST快速地重复参数并且画出结果直方图直到用户键入x停止后返回最后的直方图计算
    
    % 一个好的开始设置为:0.15, 0.05, 0.75, 0.05, 1, 0.07, 0.002).  
    
    % 初始化
    repeats = true;
    quit_now = 'x';
    
    % 在计算至少一个直方图之前用户退出,则计算一个默认的直方图
    p = twomodegauss(0.15,0.05,0.75,0.05,1,0.07,0.002);
    
    % 循环计算,直到出现x
    while repeats
        s = input('Enter m1, sig1, m2, sig2, A1, A2, k or x to quit','s');
        if s == quit_now
            break
        end
        
        % 将输入字符串转换为数值向量并验证输入的数量
        v = str2num(s);
        if numel(V) ~= 7
            disp('输入数量有错')
            continue
        end
        
        p = twomodegauss(v(1),v(2),v(3),v(4),v(5),v(6),v(7));
        % 开始绘制图,并且缩放轴线。指定x轴,y轴自动
        figure,plot(p)
        xlim([0,255])
    end
        
        
    View Code
  • 相关阅读:
    函数的进阶
    几个基础 类型循环删除
    函数的初识
    python3的 基础
    python3 最基础
    demo
    [转] ajax方法
    <codis><jodis>
    <Redis Advance><Pipelining><Memory Optimization><Expire><Transactions>
    <HBase><Scan>
  • 原文地址:https://www.cnblogs.com/zgqcn/p/11224200.html
Copyright © 2011-2022 走看看