先拿结果来看,第一幅是原图 第二幅是直方图均衡化后的图像增强 第三幅是直方图匹配后的处理结果
第二幅 第三幅来看 直接均衡化 会大大增加对比对 但是 有时不符合美观
%直方图匹配
%直方图均衡有时并不能总取得想要的图像增强结果
%特别的 能够在图片指定位置处进行图像增强是很有用的
%上述这种需求的方法 就是直方图匹配或者 直方图规定化
%通俗讲 直方图匹配是将原图的灰度分布均匀化
%如果想体现某一灰度直方图的图像处理,这就需要直方图匹配
%具体算法例子如下
%首先直方图均衡
%假设64*64像素的3Bit图像灰度分布如下
%rk nk pk=nk/n
%r0=0 790 0.19
%r1=1 1023 0.25
%r2=2 850 0.21
%r3=3 656 0.16
%r4=4 329 0.08
%r5=5 245 0.06
%r6=6 122 0.03
%r7=7 81 0.02
%sk=(L-1)*SUM(pk)直方图均衡化公式 得到映射的下表
%s0=1.33->1 s1=3.08->3 s2=4.55->5 s3=5.67->6
%s4=6.23->6 s5=6.65->7 s6=6.86->7 s7=7.00->7
%均衡化后有5个灰度级了
%r0的790个像素 映射成 s0 取1
%r1的1023个像素 映射成 s1 取3
%r2的850个像素 映射成 s2 取5
%r3的656个像素 映射成 s3 取6
%r4的656个像素 映射成 s4 取6
%r5的245个像素 映射成 s5 取7
%r6的122个像素 映射成 s6 取7
%r7的81个像素 映射成 s7 取7
%其次按章自己规定的直方图分布进行如下计算
%例如自己规定的直方图分布
%z0=0 pz(z0)=0
%z1=1 pz(z1)=0
%z2=2 pz(z2)=0
%z3=3 pz(z3)=0.15
%z4=4 pz(z4)=0.20
%z5=5 pz(z5)=0.30
%z6=6 pz(z6)=0.20
%z7=7 pz(z7)=0.15
%计算变换函数G(zq)=(L-1)SUM(pz(i)) i从1到q
%G(z0)=7*pz(z0)=0 G(z1)=7*(pz(z0)+pz(z1))=0 依次类推
%得到如下变换函数表
%z0=0 G(z0)=0
%z1=1 G(z1)=0
%z2=2 G(z2)=0
%z3=3 G(z3)=1
%z4=4 G(z4)=2
%z5=5 G(z5)=5
%z6=6 G(z6)=6
%z7=7 G(z7)=7
%发现G不是严格单调的 也就是 他有值相等的部分 需要做如下处理
%在G函数中找到最小的值来接近s表中的数 上面所算s表中s0=1 在G表中G(z3)=1
%这是完美的匹配,因此 s到z的映射表如下
%s0=1 对应G(z3) 此时 z=3
%最后得到
%S Z
%1 3
%3 4
%5 5
%6 6
%7 7
%也就是均衡化8bit图像中, 1的值映射成了3 一次类推
%MATLAB工具箱函数 g=histeq(f,hspec)
%hspec为指定的直方图的分布 g为输出图像 其直方图近似于指定的直方图hspec hspec是一个行向量构成的
%length(hspec)远小于图像f中的灰度级时,图像g的直方图通常会较好的匹配hspec
%https://blog.csdn.net/superjunenaruto/article/details/80037777
clc
clear
f=imread('D:亮度调节与空间滤波\6.jpg');
subplot(3,3,1)
imshow(f);
subplot(3,3,2)
imhist(f);
xlim('auto')
ylim('auto')
subplot(3,3,4)
[g0 t]=histeq(f,64);%直方图均衡化
imshow(g0)
subplot(3,3,5)
imhist(g0)
xlim('auto')%自动适应x轴的长度
ylim('auto')%自动适应y轴的长度
subplot(3,3,6)
plot(t)
n=0:255;
b=60;
c=70;
nn=exp(-(n-b).^2./(2*c^2));
nn=nn/5;
subplot(3,3,3)
plot(nn)
hspec=nn;
[g1,t]=histeq(f,hspec);%直方图匹配
subplot(3,3,7)
imshow(g1)
subplot(3,3,8)
imhist(g1)
xlim('auto')%自动适应x轴的长度
ylim('auto')%自动适应y轴的长度
subplot(3,3,9)
plot(t)%横坐标代表输入亮度值 纵坐标代表输出灰度值的归一化
结果如下
|
请发表评论