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
原文地址:https://www.cnblogs.com/zgqcn/p/11224200.html