MATLAB图像处理-图像增强之直⽅图均衡化(⾃⼰编写函数)
⾸先我们要了解直⽅图均衡化的作⽤和优势,以下介绍来⾃ 喂鸡百科:
这种⽅法通常⽤来增加许多图像的全局对⽐度,尤其是当图像的有⽤数据的对⽐度相当接近的时候。通过这种⽅法,亮度可以更好地在直⽅图上分布。这样就可以⽤于增强局部的对⽐度⽽不影响整体的对⽐度,直⽅图均衡化通过有效地扩展常⽤的亮度来实现这种功能。
这种⽅法对于背景和前景都太亮或者太暗的图像⾮常有⽤,这种⽅法尤其是可以带来X光图像中更好的⾻骼结构显⽰以及曝光过度或者曝光不⾜照⽚中更好的细节。这种⽅法的⼀个主要优势是它是⼀个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直⽅图,并且计算量也不⼤。这种⽅法的⼀个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对⽐度并且降低有⽤信号的对⽐度。
从介绍中我们可以看出,这种⽅法适⽤于过暗和过亮的图像,能够得到更好的图像细节,扩⼤图像的动态范围。 具体的原理性在此不作赘述,下⾯举例:
对下⾯的灰度图像进⾏直⽅图均衡化处理
该灰度图像的灰度值出现次数如下表所⽰,为了简化表格,出现次数为0的值已经被省略
累积分布函数(cdf)如下所⽰,与上⼀表格类似,为了简化,累积分布函数值为0的灰度值已经被省略
累积分布函数为:
如表格所⽰,灰度值最⼩值为52,最⼤值为154. 通常,直⽅图均衡化算式如下:
累积分布函数最⼩值cdfmin在本例中为1, M和N分别代表了图像的长宽像素个数(本例中为8×8=64),⽽L则是灰度级数(如本例中,图像为8位深度,则灰度级数共有2^8=256级数,这也是最常见的灰度级数).则对于本例的直⽅图均衡化算式为:
例如,灰度为78的像素的累积分布函数为46,均衡化后,灰度值变化为:
直⽅图均衡化后,图像的灰度值变化如下表所⽰:
注意:原最⼩灰度值52变为了0,⽽最⼤灰度值154变为了255
原始的图像如下所⽰:
变化后的图像如下所⽰:
所以程序的流程就是:
1.统计每个灰度值的个数
2.出累积分布函数
3.得到累积分布函数最⼩值cdfmin
4.根据直⽅图均衡化算式计算均衡化的灰度值
5.得到均衡化后的图像
下⾯给出代码:
代码核⼼是函数。函数的编写规则及流程也就是上⾯所说的,如果有不明⽩的,可以在评论⾥留⾔,如果程序有什么需要改进的地⽅,也可以指出,共同进步。
测试图⽚: 可以看到前后的差距还是很⼤的 前后的直⽅图对⽐: 变化前很集中,变化后很分散,但是也导致了⼀定程度的失真,图像的灰度值不连续,有利有弊。clc clear all;picture=imread('路径'); %读取图像figure imshow(picture)title('原来的图象'); %显⽰原始图象after = hist_1(picture);figure imshow(after)title('变化后图象'); %显⽰原始图象%%%函数部分function hist_img = hist_1(I)    [M, N] = size(I);    size_img = M*N;    c = zeros(1,256);%统计每个每个像素值的个数    b= c;%转化前后的对照表      temp = I(:);    temp = sort(temp);        for i = 1:size_img        c(temp(i)+1) = c(temp(i)+1)+1;          end    a = c;%求和    for i = 2:256      a(i) = c(i) + a(i-1);    end        min_cdf = 10000;    for i = 1:256      if a(i)>0          if a(i) < min_cdf                min_cdf = a(i);          end        end    end        for j = 1:256        if a(j) > 0            b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf));        end    end        for i = 1:M        for j = 1:N            I(i,j) = b(I(i,j)+1);        end          end        hist_img = I;%    figure;%    plot(b)%    title('变化前后映射') end
1
局部直方图均衡化
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
代码核⼼是函数。函数的编写规则及流程也就是上⾯所说的,如果有不明⽩的,可以在评论⾥留⾔,如果程序有什么需要改进的地⽅,也可以指出,共同进步。
希望⼤家能够有所收获!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。