最近看了冈萨雷斯的《数字图像处理》第三章直方图处理那块,感觉还是自己编编程写个总结学习效率高一点。
所谓直方图就是以灰度级为横轴,以该灰度出现的频率为纵轴绘制的一张图片。
先把要处理的图片贴上来:
先用imread把图片读进去:I=imread('3.jpg');
再转化为灰度图片:I=rgb2gray(I);
用imshow(I)看看效果:
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)
%求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);
但是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)一类题。
均衡化以后的直方图:
Q=I;
for i=0:255 Q(find(I==i))=s(i+1);%对每一级灰度,在原图上找到对应的像素点,用“加权”灰度替换原有的灰度。
end
看看效果吧!
imshow(Q);
哇啊啊,好像处理坏了,怎么这个效果啊,本人菜鸟一只,求大神指点!
匿了。。。