直方图 图像逆光处理处理 matlab,基于MATLAB的数字图像处理之直方图处理

最近看了冈萨雷斯的《数字图像处理》第三章直方图处理那块,感觉还是自己编编程写个总结学习效率高一点。

所谓直方图就是以灰度级为横轴,以该灰度出现的频率为纵轴绘制的一张图片。

先把要处理的图片贴上来:

0818b9ca8b590ca3270a3433284dd417.png

先用imread把图片读进去:I=imread('3.jpg');

再转化为灰度图片:I=rgb2gray(I);

用imshow(I)看看效果:

0818b9ca8b590ca3270a3433284dd417.png

r=zeros(1,256); %创建一个下标从0到255的数组

for i=0:255  r(i+1)=length(find(I==i)); end%每个灰度级出现的像素数,注意下标不能为0

%find 函数返回所有满足条件的元素的下标,length求数组的长度。

[m,n]=size(I);

NUM=m*n;%总像素数

p=r/num;%p是每个灰度级出现的频率

%下面进行作图

bar(0:255,p)

0818b9ca8b590ca3270a3433284dd417.png

%求s(k)

s=zeros(1,256);

for k=1:256

for j=1:k

s(k)=s(k)+p(j);

end

end

为什么这种累加运算会“均衡化”呢?

s(k)是r(k)的一个变化,但是,s(k)与r(k)没有直接关系,是对应灰度级概率的累加:

效果如下:

subplot(2,1,1);bar(0:255,r);subplot(2,2,1);bar(0:255,s);

0818b9ca8b590ca3270a3433284dd417.png

但是s(k)的取值范围是0~1啊,所以要把它变回灰度值:

s=round(s*256+0.5);%round是就近取整,加上0.5之后就是向上取整了。

现在s是新的“加权”的灰度级:

Columns 1 through 17

1     1     1     1     1     1     1     1     2     5    12    17    22    29    36    42    48

Columns 18 through 34

52    56    60    64    68    73    76    79    81    84    87    89    91    92    94    95    97

Columns 35 through 51

98    98    99    99   100   100   101   101   101   101   102   102   102   102   102   102   103

Columns 52 through 68

103   103   103   103   103   103   104   104   104   104   104   104   105   105   105   105   105

Columns 69 through 85

105   106   106   106   106   106   106   107   107   107   107   107   107   108   108   108   108

Columns 86 through 102

108   109   109   109   109   110   110   110   111   111   111   111   112   112   112   113   113

Columns 103 through 119

113   113   114   114   114   115   115   115   116   116   116   117   117   117   118   118   118

Columns 120 through 136

119   119   119   120   120   120   121   121   121   122   122   123   123   123   124   124   125

Columns 137 through 153

125   126   126   126   127   127   128   128   128   129   129   129   130   130   131   131   131

Columns 154 through 170

132   132   132   133   133   133   134   134   134   135   135   136   136   136   137   137   137

Columns 171 through 187

138   138   138   139   139   139   140   140   140   141   141   141   142   142   142   143   143

Columns 188 through 204

143   143   144   144   144   145   145   145   146   146   146   146   147   147   147   147   148

Columns 205 through 221

148   148   148   149   149   149   149   150   150   150   150   151   151   151   151   152   152

Columns 222 through 238

152   152   153   153   153   153   154   154   154   154   155   155   155   155   156   156   156

Columns 239 through 255

156   157   157   157   158   158   158   159   159   159   160   160   161   162   162   163   164

Column 256

257

可以看出有些“不重要的”灰度级没有出现,而“重要的”灰度级则重复出现。

for i=1:256 P2(i)=sum(p(find(s==i)));

%P2(i)是新的概率,是“加权”灰度级等于“自然”灰度级的概率之和。

令i=159,则find(s==i)返回246,247,248.则P2(159)=p(246)+p(247)+p(248)

对每一个“自然”灰度,找到与它相等的“加权”灰度的下标,把原图对应的概率加起来。

即:求每一个“加权”灰度对应的概率。

像极了《概率论与数理统计》里头的求函数的概率密度有木有!!

就是:已知x,p(x),y=f(x),求p(y)一类题。

均衡化以后的直方图:

0818b9ca8b590ca3270a3433284dd417.png

Q=I;

for i=0:255 Q(find(I==i))=s(i+1);%对每一级灰度,在原图上找到对应的像素点,用“加权”灰度替换原有的灰度。

end

看看效果吧!

imshow(Q);

0818b9ca8b590ca3270a3433284dd417.png

哇啊啊,好像处理坏了,怎么这个效果啊,本人菜鸟一只,求大神指点!

匿了。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值