3、直方图处理与函数绘图

2019-03-26  本文已影响0人  sumpig

1、生成并绘制直方图

一幅数字图像在 [0,G] 范围内总共有 L 个灰度级,其直方图定义为:

h(r_k)=n_k

r_k 是区间 [0,G] 内的第 k 级灰度,n_k 为图像中出现 r_k 这种灰度级的像素数。

对于 uint8 类图像,G 的值为 255;
对于 uint16 类图像,G 的值为 65535;
对于浮点图像,G 的值为 1.0。

在 matlab 工具箱中,处理图像直方图的函数是 imhist

untitled.jpg
h = imhist(f, b)
p = imhist(f, b)/numel(f) %归一化直方图。

b 是直方图的容器数(横坐标),默认为256。

bar(horz, z, width) 

horz 为水平增量,
z 是相应的垂直值,
width 为条形宽度,默认0.8。

如下命令将产生把水平轴分为10级一组的条形图

untitled.jpg
h = imhist(f, 25);
horz = linspace(0, 255, 25);
bar(horz, h)
axis([0 255 0 60000])
set(gca, 'xtick', 0:50:255)
set(gca, 'ytick', 0:20000:60000)

axis 分别设置水平轴和垂直轴上的最小和最大值。
gca 的意思是获得当前轴。
xtickytick 按所显示的间隔设置水平轴和垂直轴刻度。

下列函数可以在图形的水平轴和垂直轴上添加轴标记

xlabel('text string', 'fontsize', size)
ylabel('text string', 'fontsize', size)

text 可以在图中添加标记

text(xloc, yloc, 'text string', 'fontsize', size)

给图像添加标题

title('titlestring')
untitled.jpg
stem(horz, z, 'LineSpec', 'fill')

LineSpec 为线条与标记点的样式。

untitled.jpg
plot(horz, z, 'LineSpec')

自动设定坐标轴

ylim('auto')
xlim('auto')
ylim([ymin ymax])
xlim([xmin xmax])

fplot 为处理句柄函数时的绘图函数。

fplot(fhandle, limits, 'LineSpec', n)

例如,在范围 [-2 2] 内用点线绘制一个双曲正切函数 tanh

fhandle = @tanh;
fplot(fhandle, [-2 2], ':')
untitled.jpg

2、直方图均衡

直方图均衡通过把输入图像的灰度级扩展到较宽灰度范围来实现图像增强。

对于离散的灰度级,直方图均衡变换为

s_k=\sum^k_{j=0}\frac{n_j}{n}

直方图均衡由函数 histeq 实现

g = histeq(f, nlev)

nlev 是输出图像设定的灰度级数,默认是 64,通常设为256。

在直方图均衡中使用的变换函数是归一化直方图的累加求和。可以利用函数 cumsum 实现变换功能

hnorm = imhist(f) ./ numel(f);
cdf = cumsum(hnorm); %CDF
x = linspace(0, 1 ,256);
plot(x, cdf)
untitled.jpg

3、直方图匹配

生成具有特定直方图的图像的方法,称为 直方图匹配 或 直方图规定化。

实现直方图匹配的函数 histeq 语法如下

g = histeq(f, hspec);

hspec 为规定的直方图;

function p = twomodegauss(m1, sig1, m2, sig2, A1, A2, k)
c1 = A1 * (1 / ((2*pi) ^ 0.5) * sig1);
k1 = 2 * (sig1^2);
c2 = A2 * (1 / ((2*pi) ^ 0.5) * sig2);
k2 = 2 * (sig2^2);
z = linspace(0, 1, 256);
p = k + c1*exp(-((z-m1) .^2) ./ k1) + ...
    c2 * exp(-((z-m2) .^2) ./ k2);
p = p ./ sum(p(:));
function p = manualhist
repeats = true
quitnow = 'x';

p = twomodegauss(0.15, 0.05, 0.75, 0.05, 1, 0.07, 0.002);

while repeats
    s = input('Enter:...');
    if strcmp(s, quitnow)
        break
    end

    v = str2num(s);
    if numel(v) -= 7
        disp('Incorrect number of inputs.')
        continue
    end

    p = twomodegauss(v(1), v(2), v(3), v(4), v(5), v(6), v(7));
    figure, plot(p)
    xlim([0 255])
end

4、函数adapthisteq

这个函数执行对比度受限的自适应直方图均衡,用直方图匹配方法来逐个处理图像中较小区域。然后,使用双线性内插方法将相邻的小片组合起来,从而消除人工引入的边界。特别是在均匀灰度区域,可以限制对比度来避免放大噪声。

g = adapthisteq(f, param1, val1, param2, val2, ...)
g = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);
% param: NumTiles, ClipLimit, NBins, Range, Distribution, Alpha
上一篇下一篇

猜你喜欢

热点阅读